From f50add7ea244a9c03fdf20faf9b8008136563a9e Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Tue, 25 Jul 2023 16:00:42 -0500 Subject: [PATCH 1/9] Init jdk21 --- .../xef/java/auto/{ => jdk21}/ASCIIArt.java | 3 ++- .../xef/java/auto/{ => jdk21}/Animals.java | 6 ++++-- .../xef/java/auto/{ => jdk21}/Book.java | 3 ++- .../xef/java/auto/{ => jdk21}/Books.java | 3 ++- .../xef/java/auto/{ => jdk21}/BreakingNews.java | 3 ++- .../xef/java/auto/{ => jdk21}/ChessAI.java | 3 ++- .../xef/java/auto/{ => jdk21}/Colors.java | 3 ++- .../java/auto/{ => jdk21}/DivergentTasks.java | 3 ++- .../xef/java/auto/{ => jdk21}/Employee.java | 3 ++- .../xef/java/auto/{ => jdk21}/Fact.java | 3 ++- .../xef/java/auto/{ => jdk21}/Love.java | 3 ++- .../xef/java/auto/{ => jdk21}/Markets.java | 3 ++- .../xef/java/auto/{ => jdk21}/MealPlan.java | 3 ++- .../xef/java/auto/{ => jdk21}/MeaningOfLife.java | 3 ++- .../xef/java/auto/{ => jdk21}/Movies.java | 3 ++- .../xef/java/auto/{ => jdk21}/PDFDocument.java | 5 +++-- .../xef/java/auto/{ => jdk21}/Persons.java | 3 ++- .../xef/java/auto/{ => jdk21}/Planets.java | 3 ++- .../xef/java/auto/{ => jdk21}/Poems.java | 3 ++- .../xef/java/auto/{ => jdk21}/Populations.java | 3 ++- .../xef/java/auto/{ => jdk21}/Recipes.java | 3 ++- .../java/auto/{ => jdk21}/TopAttractions.java | 3 ++- .../auto/{ => jdk21}/TouristAttractions.java | 3 ++- .../xef/java/auto/{ => jdk21}/Weather.java | 3 ++- .../xef/java/auto/{ => jdk21}/gpt4all/Chat.java | 2 +- .../reasoning/ToolSelectionExample.java | 2 +- .../auto/{ => jdk21}/sql/DatabaseExample.java | 4 ++-- .../xef/java/auto/{ => jdk21}/tot/Checker.java | 2 +- .../auto/{ => jdk21}/tot/ControlSignals.java | 6 +++--- .../xef/java/auto/{ => jdk21}/tot/Critiques.java | 4 ++-- .../xef/java/auto/{ => jdk21}/tot/Main.java | 2 +- .../xef/java/auto/{ => jdk21}/tot/Problems.java | 16 ++++++---------- .../xef/java/auto/{ => jdk21}/tot/Rendering.java | 2 +- .../xef/java/auto/{ => jdk21}/tot/Solutions.java | 6 +++--- .../java/auto/{ => jdk21}/util/ConsoleUtil.java | 2 +- 35 files changed, 73 insertions(+), 52 deletions(-) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/ASCIIArt.java (80%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Animals.java (90%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Book.java (83%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Books.java (92%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/BreakingNews.java (92%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/ChessAI.java (96%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Colors.java (83%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/DivergentTasks.java (88%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Employee.java (94%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Fact.java (93%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Love.java (81%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Markets.java (93%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/MealPlan.java (92%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/MeaningOfLife.java (85%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Movies.java (88%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/PDFDocument.java (89%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Persons.java (86%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Planets.java (93%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Poems.java (93%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Populations.java (91%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Recipes.java (85%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/TopAttractions.java (92%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/TouristAttractions.java (88%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/Weather.java (88%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/gpt4all/Chat.java (98%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/reasoning/ToolSelectionExample.java (96%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/sql/DatabaseExample.java (97%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/tot/Checker.java (87%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/tot/ControlSignals.java (85%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/tot/Critiques.java (90%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/tot/Main.java (96%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/tot/Problems.java (84%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/tot/Rendering.java (95%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/tot/Solutions.java (92%) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/{ => jdk21}/util/ConsoleUtil.java (92%) diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/ASCIIArt.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ASCIIArt.java similarity index 80% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/ASCIIArt.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ASCIIArt.java index 8fc8f2920..0c09f4d76 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/ASCIIArt.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ASCIIArt.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.ExecutionException; public class ASCIIArt { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Animals.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java similarity index 90% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Animals.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java index 26821c2ae..6ed2b2897 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Animals.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java @@ -1,7 +1,9 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Animals { @@ -51,7 +53,7 @@ public void tell() { } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(Executors.newVirtualThreadPerTaskExecutor())) { Animals animals = new Animals(scope); animals.uniqueAnimal() .thenCompose(animal -> animals.groundbreakingInvention() diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Book.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Book.java similarity index 83% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Book.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Book.java index ff8e78365..21c25d741 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Book.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Book.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.ExecutionException; public class Book { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Books.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Books.java similarity index 92% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Books.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Books.java index 9f4b07167..63ec3e44a 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Books.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Books.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import jakarta.validation.constraints.NotNull; import java.util.concurrent.CompletableFuture; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/BreakingNews.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/BreakingNews.java similarity index 92% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/BreakingNews.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/BreakingNews.java index 3fb34e8a3..b18214e41 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/BreakingNews.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/BreakingNews.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.CompletableFuture; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/ChessAI.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ChessAI.java similarity index 96% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/ChessAI.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ChessAI.java index 4bcf02d50..438bebb25 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/ChessAI.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ChessAI.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.ArrayList; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Colors.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Colors.java similarity index 83% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Colors.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Colors.java index 8549013d3..ac86587d3 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Colors.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Colors.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.List; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/DivergentTasks.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/DivergentTasks.java similarity index 88% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/DivergentTasks.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/DivergentTasks.java index 97575914b..9086702c9 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/DivergentTasks.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/DivergentTasks.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Employee.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employee.java similarity index 94% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Employee.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employee.java index 9fcdb210e..2d46f654b 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Employee.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employee.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.ExecutionException; public class Employee { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Fact.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Fact.java similarity index 93% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Fact.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Fact.java index eb6e8bed7..236874781 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Fact.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Fact.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.ExecutionException; public class Fact { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Love.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Love.java similarity index 81% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Love.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Love.java index ad6648f3d..d7b269344 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Love.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Love.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.List; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Markets.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Markets.java similarity index 93% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Markets.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Markets.java index 47056abee..ae4e8d15b 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Markets.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Markets.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/MealPlan.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MealPlan.java similarity index 92% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/MealPlan.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MealPlan.java index 778c24d5d..f55429058 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/MealPlan.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MealPlan.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/MeaningOfLife.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MeaningOfLife.java similarity index 85% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/MeaningOfLife.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MeaningOfLife.java index 19287f1b8..7629787dd 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/MeaningOfLife.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MeaningOfLife.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.List; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Movies.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Movies.java similarity index 88% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Movies.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Movies.java index d787a1e8b..246a69fb0 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Movies.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Movies.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.ExecutionException; public class Movies { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/PDFDocument.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/PDFDocument.java similarity index 89% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/PDFDocument.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/PDFDocument.java index 3f9376f01..d4bd3f94f 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/PDFDocument.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/PDFDocument.java @@ -1,7 +1,8 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.tokenizer.ModelType; -import com.xebia.functional.xef.java.auto.util.ConsoleUtil; +import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.jdk21.util.ConsoleUtil; import com.xebia.functional.xef.textsplitters.TextSplitter; import java.util.concurrent.CompletableFuture; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Persons.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Persons.java similarity index 86% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Persons.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Persons.java index a082a5b89..bd1bb3c8c 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Persons.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Persons.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.ExecutionException; public class Persons { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Planets.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Planets.java similarity index 93% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Planets.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Planets.java index 679467f45..d30d375c1 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Planets.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Planets.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Poems.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Poems.java similarity index 93% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Poems.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Poems.java index b21f72837..a9cdefd77 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Poems.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Poems.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Populations.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Populations.java similarity index 91% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Populations.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Populations.java index a66619c8e..58f627402 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Populations.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Populations.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Recipes.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Recipes.java similarity index 85% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Recipes.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Recipes.java index 648a01349..e2f7f416a 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Recipes.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Recipes.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/TopAttractions.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TopAttractions.java similarity index 92% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/TopAttractions.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TopAttractions.java index a1303abe3..87d27d1db 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/TopAttractions.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TopAttractions.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.ExecutionException; public class TopAttractions { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/TouristAttractions.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TouristAttractions.java similarity index 88% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/TouristAttractions.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TouristAttractions.java index 7c17ea4ed..f8f72a855 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/TouristAttractions.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TouristAttractions.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.concurrent.ExecutionException; public class TouristAttractions { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Weather.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Weather.java similarity index 88% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/Weather.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Weather.java index 7d03dbf4d..3e6e30899 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/Weather.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Weather.java @@ -1,5 +1,6 @@ -package com.xebia.functional.xef.java.auto; +package com.xebia.functional.xef.java.auto.jdk21; +import com.xebia.functional.xef.java.auto.AIScope; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/gpt4all/Chat.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/gpt4all/Chat.java similarity index 98% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/gpt4all/Chat.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/gpt4all/Chat.java index 06a58291d..787233ca7 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/gpt4all/Chat.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/gpt4all/Chat.java @@ -1,4 +1,4 @@ -package com.xebia.functional.xef.java.auto.gpt4all; +package com.xebia.functional.xef.java.auto.jdk21.gpt4all; import com.xebia.functional.gpt4all.GPT4All; import com.xebia.functional.gpt4all.Gpt4AllModel; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/reasoning/ToolSelectionExample.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/reasoning/ToolSelectionExample.java similarity index 96% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/reasoning/ToolSelectionExample.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/reasoning/ToolSelectionExample.java index 676cf0738..9fb7728f2 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/reasoning/ToolSelectionExample.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/reasoning/ToolSelectionExample.java @@ -1,4 +1,4 @@ -package com.xebia.functional.xef.java.auto.reasoning; +package com.xebia.functional.xef.java.auto.jdk21.reasoning; import com.xebia.functional.xef.auto.CoreAIScope; import com.xebia.functional.xef.auto.llm.openai.OpenAI; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/sql/DatabaseExample.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/sql/DatabaseExample.java similarity index 97% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/sql/DatabaseExample.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/sql/DatabaseExample.java index fbef2ff71..4e55d6a4c 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/sql/DatabaseExample.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/sql/DatabaseExample.java @@ -1,4 +1,4 @@ -package com.xebia.functional.xef.java.auto.sql; +package com.xebia.functional.xef.java.auto.jdk21.sql; import com.fasterxml.jackson.databind.ObjectMapper; import com.xebia.functional.xef.auto.PromptConfiguration; @@ -7,7 +7,7 @@ import com.xebia.functional.xef.java.auto.AIDatabase; import com.xebia.functional.xef.java.auto.AIScope; import com.xebia.functional.xef.java.auto.ExecutionContext; -import com.xebia.functional.xef.java.auto.util.ConsoleUtil; +import com.xebia.functional.xef.java.auto.jdk21.util.ConsoleUtil; import com.xebia.functional.xef.sql.jdbc.JdbcConfig; import kotlin.Unit; import kotlin.jvm.functions.Function1; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Checker.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Checker.java similarity index 87% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Checker.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Checker.java index abc8130cd..59a53b3a8 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Checker.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Checker.java @@ -1,4 +1,4 @@ -package com.xebia.functional.xef.java.auto.tot; +package com.xebia.functional.xef.java.auto.jdk21.tot; public class Checker { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/ControlSignals.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/ControlSignals.java similarity index 85% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/ControlSignals.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/ControlSignals.java index b82c4c025..76e59f683 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/ControlSignals.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/ControlSignals.java @@ -1,9 +1,9 @@ -package com.xebia.functional.xef.java.auto.tot; +package com.xebia.functional.xef.java.auto.jdk21.tot; import java.util.concurrent.CompletableFuture; -import static com.xebia.functional.xef.java.auto.tot.Rendering.renderHistory; -import static com.xebia.functional.xef.java.auto.tot.Rendering.truncateText; +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.renderHistory; +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; public class ControlSignals { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Critiques.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Critiques.java similarity index 90% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Critiques.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Critiques.java index 6a39717ea..ae8c942db 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Critiques.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Critiques.java @@ -1,8 +1,8 @@ -package com.xebia.functional.xef.java.auto.tot; +package com.xebia.functional.xef.java.auto.jdk21.tot; import java.util.concurrent.CompletableFuture; -import static com.xebia.functional.xef.java.auto.tot.Rendering.truncateText; +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; public class Critiques { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Main.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Main.java similarity index 96% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Main.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Main.java index e41ba81db..75edc7863 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Main.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Main.java @@ -1,4 +1,4 @@ -package com.xebia.functional.xef.java.auto.tot; +package com.xebia.functional.xef.java.auto.jdk21.tot; public class Main { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Problems.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Problems.java similarity index 84% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Problems.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Problems.java index 269668bc0..28927c2a5 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Problems.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Problems.java @@ -1,4 +1,4 @@ -package com.xebia.functional.xef.java.auto.tot; +package com.xebia.functional.xef.java.auto.jdk21.tot; import com.xebia.functional.xef.java.auto.AIScope; import org.jetbrains.annotations.Nullable; @@ -7,11 +7,7 @@ import java.util.List; import java.util.stream.Stream; -import static com.xebia.functional.xef.java.auto.tot.Checker.checkSolution; -import static com.xebia.functional.xef.java.auto.tot.ControlSignals.controlSignal; -import static com.xebia.functional.xef.java.auto.tot.Critiques.critique; -import static com.xebia.functional.xef.java.auto.tot.Rendering.truncateText; -import static com.xebia.functional.xef.java.auto.tot.Solutions.solution; +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; public class Problems { @@ -35,8 +31,8 @@ private static Solutions.Solution solveRec(int remainingRounds, Memory " (Remaining rounds: " + remainingRounds + "..."); ControlSignals.ControlSignal controlSignal = getControlSignal(sMemory); - Solutions.Solution response = solution(sMemory, controlSignal); - Solutions.Solution result = checkSolution(response); + Solutions.Solution response = Solutions.solution(sMemory, controlSignal); + Solutions.Solution result = Checker.checkSolution(response); Memory updatedMemory = sMemory.addResult(result); if(result.isValid){ System.out.println("✅ Solution found: " + truncateText(result.answer) + "!"); @@ -59,7 +55,7 @@ private static Solutions.Solution solveRec(int remainingRounds, Memory private static ControlSignals.ControlSignal getControlSignal(Memory sMemory) { try { - ControlSignals.ControlSignal controlSignal = controlSignal(sMemory).get(); + ControlSignals.ControlSignal controlSignal = ControlSignals.controlSignal(sMemory).get(); System.out.println("\uD83E\uDDE0 Generated control signal: " + truncateText(controlSignal.value)); return controlSignal; } catch (Exception e) { @@ -72,7 +68,7 @@ private static ControlSignals.ControlSignal getControlSignal(Memory sMemo @Nullable private static Critiques.Critique getCritique(Solutions.Solution result, Memory updatedMemory) { try { - return critique(updatedMemory, result).get(); + return Critiques.critique(updatedMemory, result).get(); } catch (Exception e) { System.err.printf("Critiques.critique prompt threw exception: %s - %s\n", e.getClass().getName(), e.getMessage()); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Rendering.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Rendering.java similarity index 95% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Rendering.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Rendering.java index f061f88d0..b1fdda157 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Rendering.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Rendering.java @@ -1,4 +1,4 @@ -package com.xebia.functional.xef.java.auto.tot; +package com.xebia.functional.xef.java.auto.jdk21.tot; import java.util.Arrays; import java.util.stream.Collectors; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Solutions.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Solutions.java similarity index 92% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Solutions.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Solutions.java index 204854068..c529adbc5 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/tot/Solutions.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Solutions.java @@ -1,7 +1,7 @@ -package com.xebia.functional.xef.java.auto.tot; +package com.xebia.functional.xef.java.auto.jdk21.tot; -import static com.xebia.functional.xef.java.auto.tot.Rendering.renderHistory; -import static com.xebia.functional.xef.java.auto.tot.Rendering.truncateText; +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.renderHistory; +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; public class Solutions{ diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/util/ConsoleUtil.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/util/ConsoleUtil.java similarity index 92% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/util/ConsoleUtil.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/util/ConsoleUtil.java index 7203e27b5..a06678b28 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/util/ConsoleUtil.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/util/ConsoleUtil.java @@ -1,4 +1,4 @@ -package com.xebia.functional.xef.java.auto.util; +package com.xebia.functional.xef.java.auto.jdk21.util; import java.io.BufferedReader; import java.io.IOException; From f37d67001522a06cb1cfdc0c2a162a41b154629e Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Tue, 25 Jul 2023 16:42:24 -0500 Subject: [PATCH 2/9] Add Executors.newVirtualThreadPerTaskExecutor() with error --- .../com/xebia/functional/xef/java/auto/jdk21/Animals.java | 3 ++- .../com/xebia/functional/xef/java/auto/ExecutionContext.java | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java index 6ed2b2897..4888747a9 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java @@ -1,6 +1,7 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; @@ -53,7 +54,7 @@ public void tell() { } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope(Executors.newVirtualThreadPerTaskExecutor())) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { Animals animals = new Animals(scope); animals.uniqueAnimal() .thenCompose(animal -> animals.groundbreakingInvention() diff --git a/java/src/main/java/com/xebia/functional/xef/java/auto/ExecutionContext.java b/java/src/main/java/com/xebia/functional/xef/java/auto/ExecutionContext.java index fad9ee4fa..98590ce6f 100644 --- a/java/src/main/java/com/xebia/functional/xef/java/auto/ExecutionContext.java +++ b/java/src/main/java/com/xebia/functional/xef/java/auto/ExecutionContext.java @@ -32,6 +32,10 @@ public ExecutionContext(){ this(Executors.newCachedThreadPool(new ExecutionContext.AIScopeThreadFactory()), new OpenAIEmbeddings(OpenAI.DEFAULT_EMBEDDING)); } + public ExecutionContext(ExecutorService executorService){ + this(executorService, new OpenAIEmbeddings(OpenAI.DEFAULT_EMBEDDING)); + } + public ExecutionContext(ExecutorService executorService, Embeddings embeddings) { this.executorService = executorService; this.coroutineScope = () -> ExecutorsKt.from(executorService).plus(JobKt.Job(null)); From 925b13b8e0fc4910c2c9edc431a95f9a31c80929 Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Tue, 25 Jul 2023 17:43:54 -0500 Subject: [PATCH 3/9] Add jdk8 examples --- .../xef/java/auto/jdk21/Animals.java | 2 +- .../xef/java/auto/jdk8/ASCIIArt.java | 16 +++ .../xef/java/auto/jdk8/Animals.java | 64 ++++++++++ .../functional/xef/java/auto/jdk8/Book.java | 20 +++ .../functional/xef/java/auto/jdk8/Books.java | 45 +++++++ .../xef/java/auto/jdk8/BreakingNews.java | 36 ++++++ .../xef/java/auto/jdk8/ChessAI.java | 77 ++++++++++++ .../functional/xef/java/auto/jdk8/Colors.java | 18 +++ .../xef/java/auto/jdk8/DivergentTasks.java | 23 ++++ .../xef/java/auto/jdk8/Employee.java | 43 +++++++ .../functional/xef/java/auto/jdk8/Fact.java | 54 ++++++++ .../functional/xef/java/auto/jdk8/Love.java | 16 +++ .../xef/java/auto/jdk8/Markets.java | 42 +++++++ .../xef/java/auto/jdk8/MealPlan.java | 43 +++++++ .../xef/java/auto/jdk8/MeaningOfLife.java | 18 +++ .../functional/xef/java/auto/jdk8/Movies.java | 27 ++++ .../xef/java/auto/jdk8/PDFDocument.java | 49 ++++++++ .../xef/java/auto/jdk8/Persons.java | 25 ++++ .../xef/java/auto/jdk8/Planets.java | 38 ++++++ .../functional/xef/java/auto/jdk8/Poems.java | 29 +++++ .../xef/java/auto/jdk8/Populations.java | 28 +++++ .../xef/java/auto/jdk8/Recipes.java | 20 +++ .../xef/java/auto/jdk8/TopAttractions.java | 38 ++++++ .../java/auto/jdk8/TouristAttractions.java | 24 ++++ .../xef/java/auto/jdk8/Weather.java | 24 ++++ .../xef/java/auto/jdk8/gpt4all/Chat.java | 82 +++++++++++++ .../jdk8/reasoning/ToolSelectionExample.java | 41 +++++++ .../java/auto/jdk8/sql/DatabaseExample.java | 92 ++++++++++++++ .../xef/java/auto/jdk8/tot/Checker.java | 11 ++ .../java/auto/jdk8/tot/ControlSignals.java | 34 ++++++ .../xef/java/auto/jdk8/tot/Critiques.java | 36 ++++++ .../xef/java/auto/jdk8/tot/Main.java | 39 ++++++ .../xef/java/auto/jdk8/tot/Problems.java | 115 ++++++++++++++++++ .../xef/java/auto/jdk8/tot/Rendering.java | 38 ++++++ .../xef/java/auto/jdk8/tot/Solutions.java | 65 ++++++++++ .../xef/java/auto/jdk8/util/ConsoleUtil.java | 31 +++++ 36 files changed, 1402 insertions(+), 1 deletion(-) create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ASCIIArt.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Animals.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Book.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Books.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/BreakingNews.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ChessAI.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Colors.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/DivergentTasks.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Employee.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Fact.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Love.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Markets.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/MealPlan.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/MeaningOfLife.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Movies.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/PDFDocument.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Persons.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Planets.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Poems.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Populations.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Recipes.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/TopAttractions.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/TouristAttractions.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Weather.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/gpt4all/Chat.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/reasoning/ToolSelectionExample.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/sql/DatabaseExample.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Checker.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/ControlSignals.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Critiques.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Main.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Problems.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Rendering.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Solutions.java create mode 100644 examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/util/ConsoleUtil.java diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java index 4888747a9..685b015d1 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java @@ -54,7 +54,7 @@ public void tell() { } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { + try (AIScope scope = new AIScope(new ExecutionContext())) { Animals animals = new Animals(scope); animals.uniqueAnimal() .thenCompose(animal -> animals.groundbreakingInvention() diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ASCIIArt.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ASCIIArt.java new file mode 100644 index 000000000..d3a1bfc5b --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ASCIIArt.java @@ -0,0 +1,16 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.ExecutionException; + +public class ASCIIArt { + public String art; + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("ASCII art of a cat dancing", ASCIIArt.class) + .thenAccept(art -> System.out.println(art.art)) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Animals.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Animals.java new file mode 100644 index 000000000..d50aada5f --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Animals.java @@ -0,0 +1,64 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class Animals { + + private final AIScope scope; + + public Animals(AIScope scope) { + this.scope = scope; + } + + public CompletableFuture uniqueAnimal() { + return scope.prompt("A unique animal species.", Animal.class); + } + + public CompletableFuture groundbreakingInvention() { + return scope.prompt("A groundbreaking invention from the 20th century.", Invention.class); + } + + public CompletableFuture story(Animal animal, Invention invention) { + String storyPrompt = + "Write a short story of 500 words that involves the following elements:" + + "1. A unique animal species called ${animal.name} that lives in " + animal.habitat + " and has a diet of " + animal.diet + "." + + "2. A groundbreaking invention from the 20th century called " + invention.name + " , invented by " + invention.inventor + " in " + invention.year + ", which serves the purpose of " + invention.purpose + "."; + return scope.prompt(storyPrompt, Story.class); + } + + public static class Animal { + public String name; + public String habitat; + public String diet; + } + + public static class Invention { + public String name; + public String inventor; + public int year; + public String purpose; + } + + public static class Story { + public Animal animal; + public Invention invention; + public String text; + + public void tell() { + System.out.println("Story about " + animal.name + " and " + invention.name + ": " + text); + } + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + Animals animals = new Animals(scope); + animals.uniqueAnimal() + .thenCompose(animal -> animals.groundbreakingInvention() + .thenCompose(invention -> animals.story(animal, invention) + .thenAccept(Story::tell) + )).get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Book.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Book.java new file mode 100644 index 000000000..d52b98f18 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Book.java @@ -0,0 +1,20 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.ExecutionException; + +public class Book { + + public String title; + public String author; + public String summary; + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("To Kill a Mockingbird by Harper Lee summary.", Book.class) + .thenAccept(book -> System.out.println("To Kill a Mockingbird summary:\n" + book.summary)) + .get(); + } + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Books.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Books.java new file mode 100644 index 000000000..d5cb444a9 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Books.java @@ -0,0 +1,45 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import jakarta.validation.constraints.NotNull; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class Books { + + private final AIScope scope; + + public Books(AIScope scope) { + this.scope = scope; + } + + public static class Book { + @NotNull public String title; + @NotNull public String author; + @NotNull public int year; + @NotNull public String genre; + + @Override + public String toString() { + return "Book{" + + "title='" + title + '\'' + + ", author='" + author + '\'' + + ", year=" + year + + ", genre='" + genre + '\'' + + '}'; + } + } + + public CompletableFuture bookSelection(String topic) { + return scope.prompt("Give me a selection of books about " + topic, Book.class); + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + Books books = new Books(scope); + books.bookSelection("artificial intelligence") + .thenAccept(System.out::println) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/BreakingNews.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/BreakingNews.java new file mode 100644 index 000000000..20ab24c03 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/BreakingNews.java @@ -0,0 +1,36 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class BreakingNews { + + public String summary; + + static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/M/yyyy"); + static LocalDateTime now = LocalDateTime.now(); + + @Override + public String toString() { + return "BreakingNews{" + + "summary='" + summary + '\'' + + '}'; + } + + private static CompletableFuture writeParagraph(AIScope scope) { + String currentDate = dtf.format(now); + + return scope.prompt("write a paragraph of about 300 words about: " + currentDate + " Covid News", BreakingNews.class) + .thenAccept(breakingNews -> System.out.println(currentDate + " Covid news summary:\n" + breakingNews)); + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + String currentDate = dtf.format(now); + scope.contextScope(scope.search(currentDate + " Covid News"), BreakingNews::writeParagraph).get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ChessAI.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ChessAI.java new file mode 100644 index 000000000..f076de4ef --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ChessAI.java @@ -0,0 +1,77 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.ArrayList; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; + +public class ChessAI { + + private static class ChessMove { + public String player; + public String move; + + @Override + public String toString() { + return "ChessMove{" + + "player='" + player + '\'' + + ", move='" + move + '\'' + + '}'; + } + } + + private static class ChessBoard { + public String board; + } + + private static class GameState { + public Boolean ended; + public String winner; + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + var moves = new ArrayList(); + var gameEnded = false; + var winner = ""; + + while (!gameEnded) { + var currentPlayer = ((moves.size() % 2) == 0) ? "Player 1 (White)" : "Player 2 (Black)"; + + var prompt = String.format(""" + |%s, it's your turn. + |Previous moves: %s + |Make your next move:""", + currentPlayer, + moves.stream().map(ChessMove::toString).collect(Collectors.joining(", "))); + + ChessMove move = scope.prompt(prompt, ChessMove.class).get(); + moves.add(move); + + // Update boardState according to move.move + // ... + + var boardPrompt = String.format(""" + Given the following chess moves: %s, + generate a chess board on a table with appropriate emoji representations for each move and piece. + Add a brief description of the move and it's implications""", + moves.stream().map(it -> it.player + ":" + it.move).collect(Collectors.joining(", "))); + + ChessBoard chessBoard= scope.prompt(boardPrompt, ChessBoard.class).get(); + System.out.println("Current board:\n" + chessBoard.board); + + var gameStatePrompt = String.format(""" + Given the following chess moves: %s, + has the game ended (win, draw, or stalemate)?""", + moves.stream().map(ChessMove::toString).collect(Collectors.joining(", "))); + + GameState gameState = scope.prompt(gameStatePrompt, GameState.class).get(); + + gameEnded = gameState.ended; + winner = gameState.winner; + } + + System.out.println("Game over. Final move: " + moves.get(moves.size() - 1) + ", Winner: " + winner); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Colors.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Colors.java new file mode 100644 index 000000000..6ff74b74d --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Colors.java @@ -0,0 +1,18 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class Colors { + + public List colors; + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("a selection of 10 beautiful colors that go well together", Colors.class) + .thenAccept(colors -> System.out.println("Colors:\n" + colors.colors)) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/DivergentTasks.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/DivergentTasks.java new file mode 100644 index 000000000..7a3180c8d --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/DivergentTasks.java @@ -0,0 +1,23 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class DivergentTasks { + + public Long numberOfMedicalNeedlesInWorld; + + private static CompletableFuture numberOfMedical(AIScope scope) { + return scope.prompt("Provide the number of medical needles in the world", DivergentTasks.class) + .thenAccept(numberOfNeedles -> System.out.println("Needles in world:\n" + numberOfNeedles.numberOfMedicalNeedlesInWorld)); + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.contextScope(scope.search("Estimate amount of medical needles in the world"), + DivergentTasks::numberOfMedical).get(); + } + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Employee.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Employee.java new file mode 100644 index 000000000..5c349cf1b --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Employee.java @@ -0,0 +1,43 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.ExecutionException; + +public class Employee { + + public String firstName; + public String lastName; + public Integer age; + public String position; + public Company company; + + private static class Address { + public String street; + public String city; + public String country; + } + + private static class Company { + public String name; + public Address address; + } + + public static String complexPrompt = + "Provide made up information for an Employee that includes their first name, last name, age, position, and their company's name and address (street, city, and country).\n" + + "Use the information provided."; + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt(complexPrompt, Employee.class) + .thenAccept(employeeData -> System.out.println( + "Employee Information:\n\n" + + "Name: " + employeeData.firstName + " " + employeeData.lastName + "\n" + + "Age: " + employeeData.age + "\n" + + "Position: " + employeeData.position + "\n" + + "Company: " + employeeData.company.name + "\n" + + "Address: " + employeeData.company.address.street + ", " + employeeData.company.address.city + ", " + employeeData.company.address.country + "." + )) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Fact.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Fact.java new file mode 100644 index 000000000..520e7f400 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Fact.java @@ -0,0 +1,54 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.ExecutionException; + +public class Fact { + + private static class FactClass { + public String topic; + public String content; + + @Override + public String toString() { + return "FactClass{" + + "topic='" + topic + '\'' + + ", content='" + content + '\'' + + '}'; + } + } + + private static class Riddle { + public FactClass fact1; + public FactClass fact2; + public String riddle; + + @Override + public String toString() { + return "Riddle{" + + "fact1=" + fact1 + + ", fact2=" + fact2 + + ", riddle='" + riddle + '\'' + + '}'; + } + } + + + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + var fact1 = scope.prompt("A fascinating fact about you", FactClass.class).get(); + var fact2 = scope.prompt("An interesting fact about me", FactClass.class).get(); + + String riddlePrompt = ""+ + "Create a riddle that combines the following facts:\n\n" + + + "Fact 1: " + fact1.content + "\n" + + "Fact 2: " + fact2.content; + + scope.prompt(riddlePrompt, Riddle.class) + .thenAccept(riddle -> System.out.println("Riddle:\n\n" + riddle)).get(); + } + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Love.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Love.java new file mode 100644 index 000000000..8b23b5eda --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Love.java @@ -0,0 +1,16 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class Love { + public List loveList; + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("tell me you like me with just emojis", Love.class) + .thenAccept(love -> System.out.println(love.loveList)) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Markets.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Markets.java new file mode 100644 index 000000000..03cff5bb6 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Markets.java @@ -0,0 +1,42 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class Markets { + public String news; + public List raisingStockSymbols; + public List decreasingStockSymbols; + + @Override + public String toString() { + return "Markets{" + + "news='" + news + '\'' + + ", raisingStockSymbols=" + raisingStockSymbols + + ", decreasingStockSymbols=" + decreasingStockSymbols + + '}'; + } + + private static CompletableFuture stockMarketSummary(AIScope scope) { + String news = "|" + + "|Write a short summary of the stock market results given the provided context."; + + return scope.prompt(news, Markets.class) + .thenAccept(markets -> System.out.println(markets)); + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/M/yyyy"); + LocalDateTime now = LocalDateTime.now(); + var currentDate = dtf.format(now); + + scope.contextScope(scope.search(currentDate + "Stock market results, raising stocks, decreasing stocks"), + Markets::stockMarketSummary).get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/MealPlan.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/MealPlan.java new file mode 100644 index 000000000..d9e680364 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/MealPlan.java @@ -0,0 +1,43 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class MealPlan { + public String name; + public List recipes; + + private static class Recipe { + public String name; + public List ingredients; + + @Override + public String toString() { + return "Recipe{" + + "name='" + name + '\'' + + ", ingredients=" + ingredients + + '}'; + } + } + + @Override + public String toString() { + return "MealPlan{" + + "name='" + name + '\'' + + ", recipes=" + recipes + + '}'; + } + + private static CompletableFuture mealPlan(AIScope scope) { + return scope.prompt("Meal plan for the week for a person with gall bladder stones that includes 5 recipes.", MealPlan.class) + .thenAccept(mealPlan -> System.out.println(mealPlan)); + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.contextScope(scope.search("gall bladder stones meals"), MealPlan::mealPlan).get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/MeaningOfLife.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/MeaningOfLife.java new file mode 100644 index 000000000..96fc54e5a --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/MeaningOfLife.java @@ -0,0 +1,18 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class MeaningOfLife { + public List mainTheories; + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("What are the main theories about the meaning of life", MeaningOfLife.class) + .thenAccept(meaningOfLife -> + System.out.println("There are several theories about the meaning of life:\n" + meaningOfLife.mainTheories)) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Movies.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Movies.java new file mode 100644 index 000000000..0f3bed0ea --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Movies.java @@ -0,0 +1,27 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.ExecutionException; + +public class Movies { + + public static class Movie { + public String title; + public String genre; + public String director; + + @Override + public String toString() { + return "The movie " + title + " is a " + + genre + " film directed by " + director + "."; + } + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("Please provide a movie title, genre and director for the Inception movie", Movie.class) + .thenAccept(movie -> System.out.println(movie)) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/PDFDocument.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/PDFDocument.java new file mode 100644 index 000000000..c74693034 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/PDFDocument.java @@ -0,0 +1,49 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import static com.xebia.functional.xef.textsplitters.TokenTextSplitterKt.TokenTextSplitter; + +import com.xebia.functional.tokenizer.ModelType; +import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.jdk21.util.ConsoleUtil; +import com.xebia.functional.xef.textsplitters.TextSplitter; +import java.util.concurrent.CompletableFuture; + +public class PDFDocument { + + private static ConsoleUtil util = new ConsoleUtil(); + + public static class AIResponse { + public String answer; + public String source; + } + + private static final String PDF_URL = "https://people.cs.ksu.edu/~schmidt/705a/Scala/Programming-in-Scala.pdf"; + + private static CompletableFuture askQuestion(AIScope scope) { + System.out.println("Enter your question ( to exit): "); + + + String line = util.readLine(); + if (line == null || line.isBlank()) { + return CompletableFuture.completedFuture(null); + } else { + scope.prompt(line, AIResponse.class) + .thenAccept(aiRes -> System.out.println(aiRes.answer + "\n---\n" + + aiRes.source + "\n---\n")); + + return askQuestion(scope); + } + } + + public static void main(String[] args) throws Exception { + + TextSplitter textSplitter = TokenTextSplitter(ModelType.getDEFAULT_SPLITTER_MODEL(), 100, 50); + try (AIScope scope = new AIScope()) { + scope.contextScope(scope.pdf(PDF_URL, textSplitter), PDFDocument::askQuestion).get(); + } + finally { + util.close(); + } + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Persons.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Persons.java new file mode 100644 index 000000000..a41861ee0 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Persons.java @@ -0,0 +1,25 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.ExecutionException; + +public class Persons { + + public static class Person { + public String name; + public int age; + + @Override + public String toString() { + return "Hello " + name + ", you are " + age + " years old."; + } + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("What is your name and age?", Person.class) + .thenAccept(person -> System.out.println(person)) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Planets.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Planets.java new file mode 100644 index 000000000..bcda78b52 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Planets.java @@ -0,0 +1,38 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class Planets { + static class Planet { + public String name; + public double distanceFromSun; + public List moons; + } + + static class Moon { + public String name; + public double distanceFromPlanetInKm; + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + CompletableFuture earth = scope.prompt("Information about Earth and its moon.", Planet.class); + CompletableFuture mars = scope.prompt("Information about Mars and its moons.", Planet.class); + + System.out.println("Celestial bodies information:\n\n" + planetInfo(earth.get()) + "\n\n" + planetInfo(mars.get())); + } + } + + private static String planetInfo(Planet planet){ + List moonList = planet.moons.stream().map(it -> " - " + it.name + ": " + it.distanceFromPlanetInKm + " km away from " + planet.name).toList(); + + return String.format("%s is %s million km away from the Sun.\n" + + "It has the following moons: \n" + + "%s", planet.name, planet.distanceFromSun, String.join("\n", moonList)); + } +} + + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Poems.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Poems.java new file mode 100644 index 000000000..31d7785fb --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Poems.java @@ -0,0 +1,29 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class Poems { + public static class Poem { + public String title; + public String content; + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + CompletableFuture poem1 = scope.prompt("A short poem about the beauty of nature.", Poem.class); + CompletableFuture poem2 = scope.prompt("A short poem about the power of technology.", Poem.class); + CompletableFuture poem3 = scope.prompt("A short poem about the wisdom of artificial intelligence.", Poem.class); + + String combinedPoems = String.format("%s\n\n%s\n\n%s", poem1.get().content, poem2.get().content, poem3.get().content); + String newPoemPrompt = "Write a new poem that combines ideas from the following themes: the beauty " + + "of nature, the power of technology, and the wisdom of artificial intelligence. Here are some " + + "examples of poems on these themes: " + combinedPoems; + + scope.prompt(newPoemPrompt, Poem.class). + thenAccept(poem -> System.out.printf("New Poem:\n\n" + poem.content)) + .get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Populations.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Populations.java new file mode 100644 index 000000000..54039543c --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Populations.java @@ -0,0 +1,28 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class Populations { + + static class Population { + public int population; + public String description; + } + + static class Image { + public String description; + public String url; + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + CompletableFuture cadiz = scope.prompt("What is the population of Cádiz, Spain.", Population.class); + CompletableFuture seattle = scope.prompt("What is the population of Seattle, WA.", Population.class); + CompletableFuture img = scope.prompt("A hybrid city of Cádiz, Spain and Seattle, US.", Image.class); + System.out.println(img.get()); + System.out.println("The population of Cádiz is " + cadiz.get().population + " and the population of Seattle is " + seattle.get().population); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Recipes.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Recipes.java new file mode 100644 index 000000000..51e448ae7 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Recipes.java @@ -0,0 +1,20 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class Recipes { + + static class Recipe { + public String name; + public List ingredients; + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + Recipe recipe = scope.prompt("Recipe for chocolate chip cookies.", Recipe.class).get(); + System.out.println("The recipe for " + recipe.name + " is " + recipe.ingredients ); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/TopAttractions.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/TopAttractions.java new file mode 100644 index 000000000..797fc4e66 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/TopAttractions.java @@ -0,0 +1,38 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.ExecutionException; + +public class TopAttractions { + + static class TopAttraction { + public City city; + public String attractionName; + public String description; + public Weather weather = new Weather(); + } + + static class City { + public String name; + public String country; + } + + static class Weather { + public City city; + public double temperature; + public String description; + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("Top attraction in Cádiz, Spain.", TopAttraction.class) + .thenAccept(attraction -> System.out.println( + "The top attraction in " + attraction.city.name + " is " + attraction.attractionName + "." + + "Here's a brief description: " + attraction.description + "." + + "The weather in " + attraction.city.name + " is " + attraction.weather.temperature + " degrees Celsius and " + attraction.weather.description + "." + ) + ).get(); + } + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/TouristAttractions.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/TouristAttractions.java new file mode 100644 index 000000000..6e2c4fbcb --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/TouristAttractions.java @@ -0,0 +1,24 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.concurrent.ExecutionException; + +public class TouristAttractions { + + static class TouristAttraction { + public String name; + public String location; + public String history; + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.prompt("Statue of Liberty location and history.", TouristAttraction.class) + .thenAccept(statueOfLiberty -> System.out.println( + statueOfLiberty.name + "is located in " + statueOfLiberty.location + + " and has the following history: " + statueOfLiberty.history + ) + ).get(); + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Weather.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Weather.java new file mode 100644 index 000000000..d9515042f --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Weather.java @@ -0,0 +1,24 @@ +package com.xebia.functional.xef.java.auto.jdk8; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class Weather { + public List answer; + + private static CompletableFuture clothesRecommend(AIScope scope) { + return scope.prompt("Knowing this forecast, what clothes do you recommend I should wear?", Weather.class) + .thenAccept(weather -> + System.out.println(weather.answer) + ); + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + try (AIScope scope = new AIScope()) { + scope.contextScope(scope.search("Weather in Cádiz, Spain"), Weather::clothesRecommend).get(); + } + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/gpt4all/Chat.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/gpt4all/Chat.java new file mode 100644 index 000000000..57a3355c2 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/gpt4all/Chat.java @@ -0,0 +1,82 @@ +package com.xebia.functional.xef.java.auto.jdk8.gpt4all; + +import com.xebia.functional.gpt4all.GPT4All; +import com.xebia.functional.gpt4all.Gpt4AllModel; +import com.xebia.functional.xef.auto.PromptConfiguration; +import com.xebia.functional.xef.java.auto.AIScope; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Path; +import java.util.Objects; +import java.util.concurrent.ExecutionException; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +public class Chat { + public static void main(String[] args) throws ExecutionException, InterruptedException, IOException { + var userDir = System.getProperty("user.dir"); + var path = userDir + "/models/gpt4all/ggml-replit-code-v1-3b.bin"; + + var supportedModels = Gpt4AllModel.Companion.getSupportedModels(); + + supportedModels.forEach(it -> { + var url = (Objects.nonNull(it.getUrl())) ? " - " + it.getUrl() : ""; + System.out.println("🤖 " + it.getName() + url); + }); + + var url = "https://huggingface.co/nomic-ai/ggml-replit-code-v1-3b/resolve/main/ggml-replit-code-v1-3b.bin"; + var modelPath = Path.of(path); + var gpt4all = GPT4All.Companion.invoke(url, modelPath); + + System.out.println("🤖 GPT4All loaded: " + gpt4all); + /** + * Uses internally [HuggingFaceLocalEmbeddings] default of "sentence-transformers", "msmarco-distilbert-dot-v5" + * to provide embeddings for docs in contextScope. + */ + + try (AIScope scope = new AIScope(); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { + + System.out.println("🤖 Context loaded: " + scope.getExec().getContext()); + + System.out.println("\n🤖 Enter your question: "); + + while(true){ + String line = br.readLine(); + if (line.equals("exit")) break; + + var promptConfiguration = new PromptConfiguration.Companion.Builder().docsInContext(2).streamToStandardOut(true).build(); + Publisher answer = scope.promptStreaming(gpt4all, line, promptConfiguration); + + answer.subscribe(new Subscriber() { + StringBuilder answer = new StringBuilder(); + + @Override + public void onSubscribe(Subscription s) { + System.out.print("\n🤖 --> " + s); + s.request(Long.MAX_VALUE); + } + + @Override + public void onNext(String s) { + answer.append(s); + } + + @Override + public void onError(Throwable t) { + System.out.println(t); + } + + @Override + public void onComplete() { + System.out.println("\n🤖 --> " + answer.toString()); + System.out.println("\n🤖 --> Done"); + System.out.println("\n🤖 Enter your question: "); + } + }); + } + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/reasoning/ToolSelectionExample.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/reasoning/ToolSelectionExample.java new file mode 100644 index 000000000..d8fc7ca52 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/reasoning/ToolSelectionExample.java @@ -0,0 +1,41 @@ +package com.xebia.functional.xef.java.auto.jdk8.reasoning; + +import com.xebia.functional.xef.auto.CoreAIScope; +import com.xebia.functional.xef.auto.llm.openai.OpenAI; +import com.xebia.functional.xef.auto.llm.openai.OpenAIEmbeddings; +import com.xebia.functional.xef.reasoning.filesystem.Files; +import com.xebia.functional.xef.reasoning.pdf.PDF; +import com.xebia.functional.xef.reasoning.text.Text; +import com.xebia.functional.xef.reasoning.tools.ToolSelection; +import java.util.Collections; +import java.util.List; + +public class ToolSelectionExample { + + public static void main(String[] args) { + try (var scope = new CoreAIScope(new OpenAIEmbeddings(OpenAI.DEFAULT_EMBEDDING))) { + var model = OpenAI.DEFAULT_CHAT; + var serialization = OpenAI.DEFAULT_SERIALIZATION; + var text = Text.create(model, scope); + var files = Files.create(serialization, scope, Collections.emptyList()); + var pdf = PDF.create(model, serialization, scope); + + var toolSelection = new ToolSelection( + serialization, + scope, + List.of( + text.summarize, + pdf.readPDFFromUrl, + files.readFile, + files.writeToTextFile + ), + Collections.emptyList() + ); + + var inputText = "Extract information from https://arxiv.org/pdf/2305.10601.pdf"; + var result = toolSelection.applyInferredToolsBlocking(inputText); + System.out.println(result); + } + } +} + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/sql/DatabaseExample.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/sql/DatabaseExample.java new file mode 100644 index 000000000..369b6b932 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/sql/DatabaseExample.java @@ -0,0 +1,92 @@ +package com.xebia.functional.xef.java.auto.jdk8.sql; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xebia.functional.xef.auto.PromptConfiguration; +import com.xebia.functional.xef.auto.llm.openai.OpenAI; +import com.xebia.functional.xef.auto.llm.openai.OpenAIModel; +import com.xebia.functional.xef.java.auto.AIDatabase; +import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; +import com.xebia.functional.xef.java.auto.jdk21.util.ConsoleUtil; +import com.xebia.functional.xef.sql.jdbc.JdbcConfig; +import java.io.PrintStream; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; +import org.jetbrains.annotations.NotNull; + +public class DatabaseExample { + + private static final OpenAIModel MODEL = OpenAI.DEFAULT_CHAT; + private static PrintStream out = System.out; + private static ConsoleUtil util = new ConsoleUtil(); + + @NotNull + private static JdbcConfig getJdbcConfig() { + Map env = System.getenv(); + String vendor = env.getOrDefault("XEF_SQL_DB_VENDOR", "mysql"); + String host = env.getOrDefault("XEF_SQL_DB_HOST", "localhost"); + String username = env.getOrDefault("XEF_SQL_DB_USER", "user"); + String password = env.getOrDefault("XEF_SQL_DB_PASSWORD", "password"); + int port = Integer.parseInt(env.getOrDefault("XEF_SQL_DB_PORT", "3306")); + String database = env.getOrDefault("XEF_SQL_DB_DATABASE", "database"); + OpenAIModel model = MODEL; + + return new JdbcConfig(vendor, host, username, password, port, database, model); + } + + static final Function1 promptConfiguration = + (Function1) builder -> { + builder.docsInContext(50); + return Unit.INSTANCE; + }; + + public static void main(String[] args) throws Exception { + + ExecutionContext executionContext = new ExecutionContext(); + try (AIScope scope = new AIScope(new ObjectMapper(), executionContext)) { + AIDatabase database = new AIDatabase(getJdbcConfig(), executionContext); + + out.println("llmdb> Welcome to the LLMDB (An LLM interface to your SQL Database) !"); + out.println("llmdb> You can ask me questions about the database and I will try to answer them."); + out.println("llmdb> You can type `exit` to exit the program."); + out.println("llmdb> Loading recommended prompts..."); + + Arrays.stream(database.getInterestingPromptsForDatabase().get() + .split("\n")).forEach(it -> out.println("llmdb> " + it)); + + while (true) { + out.println("user> "); + String input = util.readLine(); + if (input.equals("exit")) break; + + try { + database.extendContext(database.promptQuery(input).get()); + CompletableFuture result = scope.promptMessage(MODEL, "|\n" + + " You are a database assistant that helps users to query and summarize results from the database.\n" + + " Instructions:\n" + + " 1. Summarize the information provided in the `Context` and follow to step 2.\n" + + " 2. If the information relates to the `input` then answer the question otherwise return just the summary.\n" + + " ```input\n" + + " " + input + " \n" + + " ```\n" + + " 3. Try to answer and provide information with as much detail as you can\n" + + " ", PromptConfiguration.Companion.build(promptConfiguration)); + + out.println(result.get()); + } catch (Exception e) { + out.println("llmdb> " + e.getMessage()); + e.printStackTrace(); + } + } + } + finally { + util.close(); + } + + } + + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Checker.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Checker.java new file mode 100644 index 000000000..1e53fa924 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Checker.java @@ -0,0 +1,11 @@ +package com.xebia.functional.xef.java.auto.jdk8.tot; + +public class Checker { + + public static Solutions.Solution checkSolution( + Solutions.Solution response){ + System.out.println("✅ Validating solution: " + Rendering.truncateText(response.answer) + "..."); + return response.isValid ? response : + Solutions.makeSolution(response.answer, false, "Invalid solution", null); + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/ControlSignals.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/ControlSignals.java new file mode 100644 index 000000000..19a421566 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/ControlSignals.java @@ -0,0 +1,34 @@ +package com.xebia.functional.xef.java.auto.jdk8.tot; + +import static com.xebia.functional.xef.java.auto.jdk8.tot.Rendering.renderHistory; +import static com.xebia.functional.xef.java.auto.jdk8.tot.Rendering.truncateText; + +import java.util.concurrent.CompletableFuture; + +public class ControlSignals { + + static class ControlSignal { + public String value = ""; + } + + public static CompletableFuture controlSignal( + Problems.Memory memory){ + System.out.println("\uD83E\uDDE0 Generating control signal for problem:" + truncateText(memory.problem.description) + "..."); + String guidancePrompt = Rendering.trimMargin( + " You are an expert advisor on information extraction.\n" + + " You generate guidance for a problem.\n" + + " " + renderHistory(memory) + "\n" + + " You are given the following problem:\n" + + " " + memory.problem.description + "\n" + + " Instructions:\n" + + " 1. Generate 1 guidance to get the best results for this problem.\n" + + " 2. Ensure the guidance is relevant to the problem.\n" + + " 3. Ensure the guidance is accurate, complete, and unambiguous.\n" + + " 4. Ensure the guidance is actionable.\n" + + " 5. Ensure the guidance accounts for previous answers in the `history`.\n" + + " \n"); + + return Problems.Memory.getAiScope().prompt(guidancePrompt, ControlSignal.class); + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Critiques.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Critiques.java new file mode 100644 index 000000000..1fd33657d --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Critiques.java @@ -0,0 +1,36 @@ +package com.xebia.functional.xef.java.auto.jdk8.tot; + +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; + +import java.util.concurrent.CompletableFuture; + +public class Critiques { + + static class Critique { + public String answer; + public String reasoning; + public boolean answerTrulyAccomplishesTheGoal; + } + + public static CompletableFuture critique(Problems.Memory memory, Solutions.Solution currentSolution){ + System.out.println("🕵️ Critiquing solution: " + truncateText(currentSolution.answer) + "..."); + + String prompt = Rendering.trimMargin( + " You are an expert advisor critiquing a solution.\n" + + " \n" + + " Previous history:\n" + + " " + Rendering.renderHistory(memory) + "\n" + + " \n" + + " You are given the following problem:\n" + + " " + memory.problem.description + "\n" + + " \n" + + " You are given the following solution:\n" + + " " + currentSolution.answer + "\n" + + " \n" + + " Instructions:\n" + + " 1. Provide a critique and determine if the answer truly accomplishes the goal.\n" + + " \n"); + + return Problems.Memory.getAiScope().prompt(prompt, Critique.class); + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Main.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Main.java new file mode 100644 index 000000000..9b0aea4e2 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Main.java @@ -0,0 +1,39 @@ +package com.xebia.functional.xef.java.auto.jdk8.tot; + +public class Main { + + private static final int MAX_ROUNDS = 5; + + public static void main(String[] args) { + Problems.Problem problem = new Problems.Problem(); + problem.description = Rendering.trimMargin( + " You are an expert functional programmer.\n" + + " 1. You never throw exceptions.\n" + + " 2. You never use null.\n" + + " 3. You never use `for` `while` or loops in general, prefer tail recursion.\n" + + " 4. You never use mutable state.\n" + + " \n" + + " This code is unsafe. Find the problems in this code and provide a Github suggestion code fence with the `diff` to fix it.\n" + + " \n" + + " ```kotlin\n" + + " fun access(list: List, index: Int): Int {\n" + + " return list[index]\n" + + " }\n" + + " ```\n" + + " \n" + + " Return a concise solution that fixes the problems in the code."); + + + Solutions.Solution solve = Problems.solve(problem, MAX_ROUNDS); + + System.out.println("✅ Final solution: " + solve.answer); + System.out.println("✅ Solution validity: " + solve.isValid); + System.out.println("✅ Solution reasoning: " + solve.reasoning); + System.out.println("✅ Solution code: " + solve.value); + } + + static class FinalSolution { + public String solution; + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Problems.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Problems.java new file mode 100644 index 000000000..778085e5e --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Problems.java @@ -0,0 +1,115 @@ +package com.xebia.functional.xef.java.auto.jdk8.tot; + +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; + +import com.xebia.functional.xef.java.auto.AIScope; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; +import org.jetbrains.annotations.Nullable; + +public class Problems { + + static class Problem{ + public String description; + } + + public static Solutions.Solution solve(Problem problem, int maxRounds) { + try(Memory initialMemory = new Memory<>(problem, new ArrayList<>())) { + return solveRec(maxRounds, initialMemory); + } + } + + private static Solutions.Solution solveRec(int remainingRounds, Memory sMemory) { + if(remainingRounds <= 0){ + System.out.println("❌ Maximum rounds reached. Unable to find a solution."); + return Solutions.makeSolution("", false, "No Response", null); + } else{ + System.out.println("🌱 Solving problem: " + + truncateText(sMemory.problem.description, 100) + + " (Remaining rounds: " + remainingRounds + "..."); + + ControlSignals.ControlSignal controlSignal = getControlSignal(sMemory); + Solutions.Solution response = Solutions.solution(sMemory, controlSignal); + Solutions.Solution result = Checker.checkSolution(response); + Memory updatedMemory = sMemory.addResult(result); + if(result.isValid){ + System.out.println("✅ Solution found: " + truncateText(result.answer) + "!"); + Critiques.Critique critique = getCritique(result, updatedMemory); + if(critique != null && critique.answerTrulyAccomplishesTheGoal){ + System.out.println("❌ Solution does not accomplish the goal: " + truncateText(result.answer) + "!"); + System.out.println("⏪ Backtracking..."); + return solveRec(remainingRounds - 1, updatedMemory); + } + else { + return result; + } + } + else{ + System.out.println("⏪ Backtracking..."); + return solveRec(remainingRounds - 1, updatedMemory); + } + } + } + + private static ControlSignals.ControlSignal getControlSignal(Memory sMemory) { + try { + ControlSignals.ControlSignal controlSignal = ControlSignals.controlSignal(sMemory).get(); + System.out.println("\uD83E\uDDE0 Generated control signal: " + truncateText(controlSignal.value)); + return controlSignal; + } catch (Exception e) { + System.err.printf("ControlSignals.controlSignal prompt threw exception: %s - %s\n", + e.getClass().getName(), e.getMessage()); + return new ControlSignals.ControlSignal(); + } + } + + @Nullable + private static Critiques.Critique getCritique( + Solutions.Solution result, Memory updatedMemory) { + try { + return Critiques.critique(updatedMemory, result).get(); + } catch (Exception e) { + System.err.printf("Critiques.critique prompt threw exception: %s - %s\n", + e.getClass().getName(), e.getMessage()); + return null; + } + } + + static class Memory implements AutoCloseable { + + public Problem problem; + public List> history; + + private static AIScope aiScope = null; + + public Memory(Problem problem, List> history) { + this.problem = problem; + this.history = history; + checkAIScope(); + } + + public Memory addResult(Solutions.Solution result) { + List> historyUpdate = Stream.concat(this.history.stream(), Stream.of(result)).toList(); + checkAIScope(); + return new Memory<>(this.problem, historyUpdate); + } + + private static void checkAIScope() { + if(aiScope == null){ + aiScope = new AIScope(); + } + } + + public static AIScope getAiScope() { + return aiScope; + } + + public void close(){ + if(aiScope != null) { + aiScope.close(); + aiScope = null; + } + } + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Rendering.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Rendering.java new file mode 100644 index 000000000..e280b29fb --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Rendering.java @@ -0,0 +1,38 @@ +package com.xebia.functional.xef.java.auto.jdk8.tot; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class Rendering { + + public static String trimMargin(String input){ + return Arrays.stream(input.split("\n")).map(String::trim).collect(Collectors.joining("\n")); + } + + public static String truncateText(String answer) { + return truncateText(answer, 150); + } + + public static String truncateText(String answer, int limit) { + if(answer == null) + return ""; + if(answer.length() > limit) { + answer = answer.substring(0, limit - 3) + "..."; + } + return answer.replace("\n", " "); + } + + public static String renderHistory(Problems.Memory memory){ + return trimMargin(" ```history \n\n" + + memory.history.stream() + .map(Rendering::renderHistoryItem) + .collect(Collectors.joining("\n")) + + "```"); + } + + private static String renderHistoryItem(Solutions.Solution solution){ + return trimMargin(solution.answer + "\n" + + solution.reasoning + "\n" + + (solution.isValid ? "✅" : "❌") + "\n"); + } +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Solutions.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Solutions.java new file mode 100644 index 000000000..70b1018a2 --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/tot/Solutions.java @@ -0,0 +1,65 @@ +package com.xebia.functional.xef.java.auto.jdk8.tot; + +import static com.xebia.functional.xef.java.auto.jdk8.tot.Rendering.renderHistory; +import static com.xebia.functional.xef.java.auto.jdk8.tot.Rendering.truncateText; + +public class Solutions{ + + static class Solution{ + public String answer; + public boolean isValid; + public String reasoning; + + public A value; + } + + public static Solution makeSolution(String answer, boolean isValid, String reasoning, B value) { + Solution solution = new Solution<>(); + solution.isValid = isValid; + solution.answer = answer; + solution.reasoning = reasoning; + solution.value = value; + return solution; + } + + public static Solution solution(Problems.Memory memory, + ControlSignals.ControlSignal controlSignal){ + //ai emoji + System.out.println("\uD83E\uDD16 Generating solution for problem: " + truncateText(memory.problem.description) + "..."); + + String enhancedPrompt = + " Given previous history:\n" + + " " + renderHistory(memory) + "\n" + + " Given the goal: \n" + + " ```goal\n" + + " " + memory.problem.description + " \n" + + " ```\n" + + " and considering the guidance: \n" + + " ```guidance\n" + + " " + controlSignal.value + "\n" + + " ```\n" + + " \n" + + " Instructions:\n" + + " \n" + + " 1. Please provide a comprehensive solution. \n" + + " 2. Consider all possible scenarios and edge cases. \n" + + " 3. Ensure your solution is accurate, complete, and unambiguous. \n" + + " 4. If you are unable to provide a solution, please provide a reason why and set `isValid` to false.\n" + + " 5. Include citations, references and links at the end to support your solution based on your sources.\n" + + " 6. Do not provide recommendations, only provide a solution.\n" + + " 7. when `isValid` is true Include in the `value` field the value of the solution according to the `value` json schema.\n" + + " 8. If no solution is found set the `value` field to `null`.\n" + + " 9. If the solution is not valid set the `isValid` field to `false` and the `value` field to `null`.\n" + + " 10. If the solution is valid set the `isValid` field to `true` and the `value` field to the value of the solution.\n" + + " \n"; + + try { + return Problems.Memory.getAiScope().prompt(enhancedPrompt, Solution.class).get(); + } catch (Exception e) { + System.err.printf("Solutions.solution enhancedPrompt threw exception: %s - %s\n", + e.getClass().getName(), e.getMessage()); + return null; + } + } + +} diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/util/ConsoleUtil.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/util/ConsoleUtil.java new file mode 100644 index 000000000..ddc7f61de --- /dev/null +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/util/ConsoleUtil.java @@ -0,0 +1,31 @@ +package com.xebia.functional.xef.java.auto.jdk8.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class ConsoleUtil implements AutoCloseable{ + + private final BufferedReader sysin; + + public ConsoleUtil(){ + sysin = new BufferedReader(new InputStreamReader(System.in)); + } + + /** + * Read line from the console (IDE friendly) + * @return line from console input + */ + public String readLine() { + try { + return sysin.readLine(); + } catch (IOException e) { + return null; + } + } + + @Override + public void close() throws Exception { + sysin.close(); + } +} From 09a5e37a4dce688b34caf53da0e3c4353ac161ff Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Wed, 26 Jul 2023 12:04:56 -0500 Subject: [PATCH 4/9] Refactor jdk8 examples --- .../functional/xef/java/auto/jdk8/ChessAI.java | 15 ++++++++------- .../functional/xef/java/auto/jdk8/Fact.java | 4 ++-- .../functional/xef/java/auto/jdk8/Markets.java | 2 +- .../xef/java/auto/jdk8/gpt4all/Chat.java | 17 +++++++++-------- .../jdk8/reasoning/ToolSelectionExample.java | 17 +++++++++-------- 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ChessAI.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ChessAI.java index f076de4ef..d51d9a97e 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ChessAI.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/ChessAI.java @@ -2,6 +2,7 @@ import com.xebia.functional.xef.java.auto.AIScope; import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; @@ -31,14 +32,14 @@ private static class GameState { public static void main(String[] args) throws ExecutionException, InterruptedException { try (AIScope scope = new AIScope()) { - var moves = new ArrayList(); - var gameEnded = false; - var winner = ""; + List moves = new ArrayList<>(); + boolean gameEnded = false; + String winner = ""; while (!gameEnded) { - var currentPlayer = ((moves.size() % 2) == 0) ? "Player 1 (White)" : "Player 2 (Black)"; + String currentPlayer = ((moves.size() % 2) == 0) ? "Player 1 (White)" : "Player 2 (Black)"; - var prompt = String.format(""" + String prompt = String.format(""" |%s, it's your turn. |Previous moves: %s |Make your next move:""", @@ -51,7 +52,7 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc // Update boardState according to move.move // ... - var boardPrompt = String.format(""" + String boardPrompt = String.format(""" Given the following chess moves: %s, generate a chess board on a table with appropriate emoji representations for each move and piece. Add a brief description of the move and it's implications""", @@ -60,7 +61,7 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc ChessBoard chessBoard= scope.prompt(boardPrompt, ChessBoard.class).get(); System.out.println("Current board:\n" + chessBoard.board); - var gameStatePrompt = String.format(""" + String gameStatePrompt = String.format(""" Given the following chess moves: %s, has the game ended (win, draw, or stalemate)?""", moves.stream().map(ChessMove::toString).collect(Collectors.joining(", "))); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Fact.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Fact.java index 520e7f400..fe8e03dcc 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Fact.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Fact.java @@ -37,8 +37,8 @@ public String toString() { public static void main(String[] args) throws ExecutionException, InterruptedException { try (AIScope scope = new AIScope()) { - var fact1 = scope.prompt("A fascinating fact about you", FactClass.class).get(); - var fact2 = scope.prompt("An interesting fact about me", FactClass.class).get(); + FactClass fact1 = scope.prompt("A fascinating fact about you", FactClass.class).get(); + FactClass fact2 = scope.prompt("An interesting fact about me", FactClass.class).get(); String riddlePrompt = ""+ "Create a riddle that combines the following facts:\n\n" + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Markets.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Markets.java index 03cff5bb6..49f23256a 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Markets.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/Markets.java @@ -33,7 +33,7 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc try (AIScope scope = new AIScope()) { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/M/yyyy"); LocalDateTime now = LocalDateTime.now(); - var currentDate = dtf.format(now); + String currentDate = dtf.format(now); scope.contextScope(scope.search(currentDate + "Stock market results, raising stocks, decreasing stocks"), Markets::stockMarketSummary).get(); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/gpt4all/Chat.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/gpt4all/Chat.java index 57a3355c2..ec6b11565 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/gpt4all/Chat.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/gpt4all/Chat.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.nio.file.Path; +import java.util.List; import java.util.Objects; import java.util.concurrent.ExecutionException; import org.reactivestreams.Publisher; @@ -16,19 +17,19 @@ public class Chat { public static void main(String[] args) throws ExecutionException, InterruptedException, IOException { - var userDir = System.getProperty("user.dir"); - var path = userDir + "/models/gpt4all/ggml-replit-code-v1-3b.bin"; + String userDir = System.getProperty("user.dir"); + String path = userDir + "/models/gpt4all/ggml-replit-code-v1-3b.bin"; - var supportedModels = Gpt4AllModel.Companion.getSupportedModels(); + List supportedModels = Gpt4AllModel.Companion.getSupportedModels(); supportedModels.forEach(it -> { - var url = (Objects.nonNull(it.getUrl())) ? " - " + it.getUrl() : ""; + String url = (Objects.nonNull(it.getUrl())) ? " - " + it.getUrl() : ""; System.out.println("🤖 " + it.getName() + url); }); - var url = "https://huggingface.co/nomic-ai/ggml-replit-code-v1-3b/resolve/main/ggml-replit-code-v1-3b.bin"; - var modelPath = Path.of(path); - var gpt4all = GPT4All.Companion.invoke(url, modelPath); + String url = "https://huggingface.co/nomic-ai/ggml-replit-code-v1-3b/resolve/main/ggml-replit-code-v1-3b.bin"; + Path modelPath = Path.of(path); + GPT4All gpt4all = GPT4All.Companion.invoke(url, modelPath); System.out.println("🤖 GPT4All loaded: " + gpt4all); /** @@ -47,7 +48,7 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc String line = br.readLine(); if (line.equals("exit")) break; - var promptConfiguration = new PromptConfiguration.Companion.Builder().docsInContext(2).streamToStandardOut(true).build(); + PromptConfiguration promptConfiguration = new PromptConfiguration.Companion.Builder().docsInContext(2).streamToStandardOut(true).build(); Publisher answer = scope.promptStreaming(gpt4all, line, promptConfiguration); answer.subscribe(new Subscriber() { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/reasoning/ToolSelectionExample.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/reasoning/ToolSelectionExample.java index d8fc7ca52..4db9edce6 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/reasoning/ToolSelectionExample.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk8/reasoning/ToolSelectionExample.java @@ -3,6 +3,7 @@ import com.xebia.functional.xef.auto.CoreAIScope; import com.xebia.functional.xef.auto.llm.openai.OpenAI; import com.xebia.functional.xef.auto.llm.openai.OpenAIEmbeddings; +import com.xebia.functional.xef.auto.llm.openai.OpenAIModel; import com.xebia.functional.xef.reasoning.filesystem.Files; import com.xebia.functional.xef.reasoning.pdf.PDF; import com.xebia.functional.xef.reasoning.text.Text; @@ -13,14 +14,14 @@ public class ToolSelectionExample { public static void main(String[] args) { - try (var scope = new CoreAIScope(new OpenAIEmbeddings(OpenAI.DEFAULT_EMBEDDING))) { - var model = OpenAI.DEFAULT_CHAT; - var serialization = OpenAI.DEFAULT_SERIALIZATION; - var text = Text.create(model, scope); - var files = Files.create(serialization, scope, Collections.emptyList()); - var pdf = PDF.create(model, serialization, scope); + try (CoreAIScope scope = new CoreAIScope(new OpenAIEmbeddings(OpenAI.DEFAULT_EMBEDDING))) { + OpenAIModel model = OpenAI.DEFAULT_CHAT; + OpenAIModel serialization = OpenAI.DEFAULT_SERIALIZATION; + Text text = Text.create(model, scope); + Files files = Files.create(serialization, scope, Collections.emptyList()); + PDF pdf = PDF.create(model, serialization, scope); - var toolSelection = new ToolSelection( + ToolSelection toolSelection = new ToolSelection( serialization, scope, List.of( @@ -32,7 +33,7 @@ public static void main(String[] args) { Collections.emptyList() ); - var inputText = "Extract information from https://arxiv.org/pdf/2305.10601.pdf"; + String inputText = "Extract information from https://arxiv.org/pdf/2305.10601.pdf"; var result = toolSelection.applyInferredToolsBlocking(inputText); System.out.println(result); } From 6c735046285b4f04abd0addc7c287081f919636b Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Wed, 26 Jul 2023 18:45:10 -0500 Subject: [PATCH 5/9] Refactor jdk21 examples --- examples/java/build.gradle.kts | 13 +++++- .../xef/java/auto/jdk21/ASCIIArt.java | 4 +- .../xef/java/auto/jdk21/Animals.java | 29 ++++--------- .../functional/xef/java/auto/jdk21/Book.java | 4 +- .../functional/xef/java/auto/jdk21/Books.java | 22 ++-------- .../xef/java/auto/jdk21/BreakingNews.java | 15 +++---- .../xef/java/auto/jdk21/ChessAI.java | 28 +++---------- .../xef/java/auto/jdk21/Colors.java | 4 +- .../xef/java/auto/jdk21/DivergentTasks.java | 4 +- .../jdk21/{Employee.java => Employees.java} | 27 ++++-------- .../functional/xef/java/auto/jdk21/Fact.java | 41 ++++--------------- .../functional/xef/java/auto/jdk21/Love.java | 4 +- .../xef/java/auto/jdk21/Markets.java | 24 ++++------- .../xef/java/auto/jdk21/MealPlan.java | 30 +++----------- .../xef/java/auto/jdk21/MeaningOfLife.java | 4 +- .../xef/java/auto/jdk21/Movies.java | 16 ++------ .../xef/java/auto/jdk21/PDFDocument.java | 19 ++++----- .../xef/java/auto/jdk21/Persons.java | 14 ++----- .../xef/java/auto/jdk21/Planets.java | 27 ++++-------- .../functional/xef/java/auto/jdk21/Poems.java | 20 ++++----- .../xef/java/auto/jdk21/Populations.java | 26 +++++------- .../xef/java/auto/jdk21/Recipes.java | 12 +++--- .../xef/java/auto/jdk21/TopAttractions.java | 29 +++++-------- .../java/auto/jdk21/TouristAttractions.java | 10 ++--- .../xef/java/auto/jdk21/Weather.java | 4 +- .../xef/java/auto/jdk21/gpt4all/Chat.java | 9 ++-- .../jdk21/reasoning/ToolSelectionExample.java | 16 ++++---- .../java/auto/jdk21/sql/DatabaseExample.java | 33 ++++++++------- .../java/auto/jdk21/tot/ControlSignals.java | 6 +-- .../xef/java/auto/jdk21/tot/Critiques.java | 6 +-- .../xef/java/auto/jdk21/tot/Main.java | 2 +- .../xef/java/auto/jdk21/tot/Problems.java | 11 ++--- .../functional/xef/java/auto/AIDatabase.java | 2 +- .../functional/xef/java/auto/AIScope.java | 4 ++ 34 files changed, 195 insertions(+), 324 deletions(-) rename examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/{Employee.java => Employees.java} (68%) diff --git a/examples/java/build.gradle.kts b/examples/java/build.gradle.kts index 2dff91f16..fa3b9f628 100644 --- a/examples/java/build.gradle.kts +++ b/examples/java/build.gradle.kts @@ -11,6 +11,15 @@ dependencies { implementation(projects.xefGpt4all) } -tasks.withType().configureEach { - useJUnit() +val ENABLE_PREVIEW = "--enable-preview" +tasks.withType { + options.compilerArgs.add(ENABLE_PREVIEW) +} +tasks.test { + useJUnitPlatform() + jvmArgs(ENABLE_PREVIEW) } + +/*tasks.withType().configureEach { + useJUnit() +}*/ diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ASCIIArt.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ASCIIArt.java index 0c09f4d76..a94a3af01 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ASCIIArt.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ASCIIArt.java @@ -1,13 +1,15 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class ASCIIArt { public String art; public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("ASCII art of a cat dancing", ASCIIArt.class) .thenAccept(art -> System.out.println(art.art)) .get(); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java index 685b015d1..3c24c256e 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Animals.java @@ -30,35 +30,22 @@ public CompletableFuture story(Animal animal, Invention invention) { return scope.prompt(storyPrompt, Story.class); } - public static class Animal { - public String name; - public String habitat; - public String diet; - } - - public static class Invention { - public String name; - public String inventor; - public int year; - public String purpose; - } - - public static class Story { - public Animal animal; - public Invention invention; - public String text; - + public record Animal(String name, String habitat, String diet){} + public record Invention(String name, String inventor, int year, String purpose){} + public record Story(Animal animal, Invention invention, String text){ public void tell() { System.out.println("Story about " + animal.name + " and " + invention.name + ": " + text); } } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope(new ExecutionContext())) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { Animals animals = new Animals(scope); animals.uniqueAnimal() - .thenCompose(animal -> animals.groundbreakingInvention() - .thenCompose(invention -> animals.story(animal, invention) + .thenCompose(animal -> + animals.groundbreakingInvention() + .thenCompose(invention -> + animals.story(animal, invention) .thenAccept(Story::tell) )).get(); } diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Book.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Book.java index 21c25d741..e98bc22d2 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Book.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Book.java @@ -1,7 +1,9 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Book { @@ -10,7 +12,7 @@ public class Book { public String summary; public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("To Kill a Mockingbird by Harper Lee summary.", Book.class) .thenAccept(book -> System.out.println("To Kill a Mockingbird summary:\n" + book.summary)) .get(); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Books.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Books.java index 63ec3e44a..2f17fbc94 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Books.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Books.java @@ -1,10 +1,11 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import jakarta.validation.constraints.NotNull; - import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Books { @@ -14,29 +15,14 @@ public Books(AIScope scope) { this.scope = scope; } - public static class Book { - @NotNull public String title; - @NotNull public String author; - @NotNull public int year; - @NotNull public String genre; - - @Override - public String toString() { - return "Book{" + - "title='" + title + '\'' + - ", author='" + author + '\'' + - ", year=" + year + - ", genre='" + genre + '\'' + - '}'; - } - } + public record Book(@NotNull String title, @NotNull String author, @NotNull int year, @NotNull String genre){} public CompletableFuture bookSelection(String topic) { return scope.prompt("Give me a selection of books about " + topic, Books.Book.class); } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { Books books = new Books(scope); books.bookSelection("artificial intelligence") .thenAccept(System.out::println) diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/BreakingNews.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/BreakingNews.java index b18214e41..0932823e0 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/BreakingNews.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/BreakingNews.java @@ -1,34 +1,29 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class BreakingNews { - public String summary; - static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/M/yyyy"); static LocalDateTime now = LocalDateTime.now(); - @Override - public String toString() { - return "BreakingNews{" + - "summary='" + summary + '\'' + - '}'; - } + public record BreakingNew(String summary){} private static CompletableFuture writeParagraph(AIScope scope) { var currentDate = dtf.format(now); - return scope.prompt("write a paragraph of about 300 words about: " + currentDate + " Covid News", BreakingNews.class) + return scope.prompt("write a paragraph of about 300 words about: " + currentDate + " Covid News", BreakingNews.BreakingNew.class) .thenAccept(breakingNews -> System.out.println(currentDate + " Covid news summary:\n" + breakingNews)); } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { var currentDate = dtf.format(now); scope.contextScope(scope.search(currentDate + " Covid News"), BreakingNews::writeParagraph).get(); } diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ChessAI.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ChessAI.java index 438bebb25..eb5aeef2f 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ChessAI.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/ChessAI.java @@ -1,36 +1,20 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.ArrayList; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; import java.util.stream.Collectors; public class ChessAI { - private static class ChessMove { - public String player; - public String move; - - @Override - public String toString() { - return "ChessMove{" + - "player='" + player + '\'' + - ", move='" + move + '\'' + - '}'; - } - } - - private static class ChessBoard { - public String board; - } - - private static class GameState { - public Boolean ended; - public String winner; - } + public record ChessMove(String player, String move){} + public record ChessBoard(String board){} + public record GameState(Boolean ended, String winner){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { var moves = new ArrayList(); var gameEnded = false; var winner = ""; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Colors.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Colors.java index ac86587d3..e91e156ba 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Colors.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Colors.java @@ -1,15 +1,17 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.List; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Colors { public List colors; public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("a selection of 10 beautiful colors that go well together", Colors.class) .thenAccept(colors -> System.out.println("Colors:\n" + colors.colors)) .get(); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/DivergentTasks.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/DivergentTasks.java index 9086702c9..d6c616cdc 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/DivergentTasks.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/DivergentTasks.java @@ -1,8 +1,10 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class DivergentTasks { @@ -14,7 +16,7 @@ private static CompletableFuture numberOfMedical(AIScope scope) { } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.contextScope(scope.search("Estimate amount of medical needles in the world"), DivergentTasks::numberOfMedical).get(); } diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employee.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employees.java similarity index 68% rename from examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employee.java rename to examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employees.java index 2d46f654b..77694f5fa 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employee.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Employees.java @@ -1,34 +1,23 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; -public class Employee { +public class Employees { - public String firstName; - public String lastName; - public Integer age; - public String position; - public Company company; - - private static class Address { - public String street; - public String city; - public String country; - } - - private static class Company { - public String name; - public Address address; - } + public record Employee(String firstName, String lastName, Integer age, String position, Company company){} + public record Address(String street, String city, String country){} + public record Company(String name, Address address){} public static String complexPrompt = "Provide made up information for an Employee that includes their first name, last name, age, position, and their company's name and address (street, city, and country).\n" + "Use the information provided."; public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { - scope.prompt(complexPrompt, Employee.class) + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { + scope.prompt(complexPrompt, Employees.Employee.class) .thenAccept(employeeData -> System.out.println( "Employee Information:\n\n" + "Name: " + employeeData.firstName + " " + employeeData.lastName + "\n" + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Fact.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Fact.java index 236874781..bd36a247b 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Fact.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Fact.java @@ -1,46 +1,21 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Fact { - private static class FactClass { - public String topic; - public String content; - - @Override - public String toString() { - return "FactClass{" + - "topic='" + topic + '\'' + - ", content='" + content + '\'' + - '}'; - } - } - - private static class Riddle { - public FactClass fact1; - public FactClass fact2; - public String riddle; - - @Override - public String toString() { - return "Riddle{" + - "fact1=" + fact1 + - ", fact2=" + fact2 + - ", riddle='" + riddle + '\'' + - '}'; - } - } - - + public record FactRecord(String topic, String content){} + public record Riddle(FactRecord fact1, FactRecord fact2, String riddle){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { - var fact1 = scope.prompt("A fascinating fact about you", FactClass.class).get(); - var fact2 = scope.prompt("An interesting fact about me", FactClass.class).get(); + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { + var fact1 = scope.prompt("A fascinating fact about you", FactRecord.class).get(); + var fact2 = scope.prompt("An interesting fact about me", FactRecord.class).get(); - String riddlePrompt = ""+ + var riddlePrompt = ""+ "Create a riddle that combines the following facts:\n\n" + "Fact 1: " + fact1.content + "\n" + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Love.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Love.java index d7b269344..696dd33bb 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Love.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Love.java @@ -1,13 +1,15 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.List; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Love { public List loveList; public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("tell me you like me with just emojis", Love.class) .thenAccept(love -> System.out.println(love.loveList)) .get(); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Markets.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Markets.java index ae4e8d15b..c429dcbb7 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Markets.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Markets.java @@ -1,38 +1,30 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Markets { - public String news; - public List raisingStockSymbols; - public List decreasingStockSymbols; - @Override - public String toString() { - return "Markets{" + - "news='" + news + '\'' + - ", raisingStockSymbols=" + raisingStockSymbols + - ", decreasingStockSymbols=" + decreasingStockSymbols + - '}'; - } + public record Market(String news, List raisingStockSymbols, List decreasingStockSymbols){} private static CompletableFuture stockMarketSummary(AIScope scope) { - String news = "|" + + var news = "|" + "|Write a short summary of the stock market results given the provided context."; - return scope.prompt(news, Markets.class) + return scope.prompt(news, Market.class) .thenAccept(markets -> System.out.println(markets)); } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { - DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/M/yyyy"); - LocalDateTime now = LocalDateTime.now(); + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { + var dtf = DateTimeFormatter.ofPattern("dd/M/yyyy"); + var now = LocalDateTime.now(); var currentDate = dtf.format(now); scope.contextScope(scope.search(currentDate + "Stock market results, raising stocks, decreasing stocks"), diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MealPlan.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MealPlan.java index f55429058..ea3c09f7b 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MealPlan.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MealPlan.java @@ -1,42 +1,24 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class MealPlan { - public String name; - public List recipes; - private static class Recipe { - public String name; - public List ingredients; - - @Override - public String toString() { - return "Recipe{" + - "name='" + name + '\'' + - ", ingredients=" + ingredients + - '}'; - } - } - - @Override - public String toString() { - return "MealPlan{" + - "name='" + name + '\'' + - ", recipes=" + recipes + - '}'; - } + public record MealPlanRecord(String name, List recipes){} + public record Recipe(String name, List ingredients){} private static CompletableFuture mealPlan(AIScope scope) { - return scope.prompt("Meal plan for the week for a person with gall bladder stones that includes 5 recipes.", MealPlan.class) + return scope.prompt("Meal plan for the week for a person with gall bladder stones that includes 5 recipes.", MealPlanRecord.class) .thenAccept(mealPlan -> System.out.println(mealPlan)); } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.contextScope(scope.search("gall bladder stones meals"), MealPlan::mealPlan).get(); } } diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MeaningOfLife.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MeaningOfLife.java index 7629787dd..a953cbe8b 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MeaningOfLife.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/MeaningOfLife.java @@ -1,14 +1,16 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.List; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class MeaningOfLife { public List mainTheories; public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("What are the main theories about the meaning of life", MeaningOfLife.class) .thenAccept(meaningOfLife -> System.out.println("There are several theories about the meaning of life:\n" + meaningOfLife.mainTheories)) diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Movies.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Movies.java index 246a69fb0..2295472ef 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Movies.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Movies.java @@ -1,24 +1,16 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Movies { - public static class Movie { - public String title; - public String genre; - public String director; - - @Override - public String toString() { - return "The movie " + title + " is a " + - genre + " film directed by " + director + "."; - } - } + public record Movie(String title, String genre, String director){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("Please provide a movie title, genre and director for the Inception movie", Movie.class) .thenAccept(movie -> System.out.println(movie)) .get(); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/PDFDocument.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/PDFDocument.java index d4bd3f94f..cafa1e602 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/PDFDocument.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/PDFDocument.java @@ -1,22 +1,19 @@ package com.xebia.functional.xef.java.auto.jdk21; +import static com.xebia.functional.xef.textsplitters.TokenTextSplitterKt.TokenTextSplitter; + import com.xebia.functional.tokenizer.ModelType; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import com.xebia.functional.xef.java.auto.jdk21.util.ConsoleUtil; -import com.xebia.functional.xef.textsplitters.TextSplitter; - import java.util.concurrent.CompletableFuture; - -import static com.xebia.functional.xef.textsplitters.TokenTextSplitterKt.TokenTextSplitter; +import java.util.concurrent.Executors; public class PDFDocument { private static ConsoleUtil util = new ConsoleUtil(); - public static class AIResponse { - public String answer; - public String source; - } + public record AIResponse(String answer, String source){} private static final String PDF_URL = "https://people.cs.ksu.edu/~schmidt/705a/Scala/Programming-in-Scala.pdf"; @@ -24,7 +21,7 @@ private static CompletableFuture askQuestion(AIScope scope) { System.out.println("Enter your question ( to exit): "); - String line = util.readLine(); + var line = util.readLine(); if (line == null || line.isBlank()) { return CompletableFuture.completedFuture(null); } else { @@ -38,8 +35,8 @@ private static CompletableFuture askQuestion(AIScope scope) { public static void main(String[] args) throws Exception { - TextSplitter textSplitter = TokenTextSplitter(ModelType.getDEFAULT_SPLITTER_MODEL(), 100, 50); - try (AIScope scope = new AIScope()) { + var textSplitter = TokenTextSplitter(ModelType.getDEFAULT_SPLITTER_MODEL(), 100, 50); + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.contextScope(scope.pdf(PDF_URL, textSplitter), PDFDocument::askQuestion).get(); } finally { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Persons.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Persons.java index bd1bb3c8c..5d4bd3306 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Persons.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Persons.java @@ -1,22 +1,16 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Persons { - public static class Person { - public String name; - public int age; - - @Override - public String toString() { - return "Hello " + name + ", you are " + age + " years old."; - } - } + public record Person(String name, int age){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("What is your name and age?", Person.class) .thenAccept(person -> System.out.println(person)) .get(); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Planets.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Planets.java index d30d375c1..97cc7ce88 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Planets.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Planets.java @@ -1,35 +1,26 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; - -import static java.util.stream.Collectors.toList; +import java.util.concurrent.Executors; public class Planets { - static class Planet { - public String name; - public double distanceFromSun; - public List moons; - } - - static class Moon { - public String name; - public double distanceFromPlanetInKm; - } + public record Planet(String name, double distanceFromSun, List moons){} + public record Moon(String name, double distanceFromPlanetInKm){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { - CompletableFuture earth = scope.prompt("Information about Earth and its moon.", Planet.class); - CompletableFuture mars = scope.prompt("Information about Mars and its moons.", Planet.class); + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { + var earth = scope.prompt("Information about Earth and its moon.", Planet.class).get(); + var mars = scope.prompt("Information about Mars and its moons.", Planet.class).get(); - System.out.println("Celestial bodies information:\n\n" + planetInfo(earth.get()) + "\n\n" + planetInfo(mars.get())); + System.out.println("Celestial bodies information:\n\n" + planetInfo(earth) + "\n\n" + planetInfo(mars)); } } private static String planetInfo(Planet planet){ - List moonList = planet.moons.stream().map(it -> " - " + it.name + ": " + it.distanceFromPlanetInKm + " km away from " + planet.name).toList(); + var moonList = planet.moons.stream().map(it -> " - " + it.name + ": " + it.distanceFromPlanetInKm + " km away from " + planet.name).toList(); return String.format("%s is %s million km away from the Sun.\n" + "It has the following moons: \n" + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Poems.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Poems.java index a9cdefd77..97190047d 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Poems.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Poems.java @@ -1,23 +1,21 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; -import java.util.concurrent.CompletableFuture; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Poems { - public static class Poem { - public String title; - public String content; - } + public record Poem(String title, String content){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { - CompletableFuture poem1 = scope.prompt("A short poem about the beauty of nature.", Poem.class); - CompletableFuture poem2 = scope.prompt("A short poem about the power of technology.", Poem.class); - CompletableFuture poem3 = scope.prompt("A short poem about the wisdom of artificial intelligence.", Poem.class); + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { + var poem1 = scope.prompt("A short poem about the beauty of nature.", Poem.class).get(); + var poem2 = scope.prompt("A short poem about the power of technology.", Poem.class).get(); + var poem3 = scope.prompt("A short poem about the wisdom of artificial intelligence.", Poem.class).get(); - String combinedPoems = String.format("%s\n\n%s\n\n%s", poem1.get().content, poem2.get().content, poem3.get().content); - String newPoemPrompt = "Write a new poem that combines ideas from the following themes: the beauty " + + var combinedPoems = String.format("%s\n\n%s\n\n%s", poem1.content, poem2.content, poem3.content); + var newPoemPrompt = "Write a new poem that combines ideas from the following themes: the beauty " + "of nature, the power of technology, and the wisdom of artificial intelligence. Here are some " + "examples of poems on these themes: " + combinedPoems; diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Populations.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Populations.java index 58f627402..5420bd194 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Populations.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Populations.java @@ -1,28 +1,22 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; -import java.util.concurrent.CompletableFuture; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Populations { - static class Population { - public int population; - public String description; - } - - static class Image { - public String description; - public String url; - } + public record Population(int population, String description){} + public record Image(String description, String url){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { - CompletableFuture cadiz = scope.prompt("What is the population of Cádiz, Spain.", Population.class); - CompletableFuture seattle = scope.prompt("What is the population of Seattle, WA.", Population.class); - CompletableFuture img = scope.prompt("A hybrid city of Cádiz, Spain and Seattle, US.", Image.class); - System.out.println(img.get()); - System.out.println("The population of Cádiz is " + cadiz.get().population + " and the population of Seattle is " + seattle.get().population); + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { + var cadiz = scope.prompt("What is the population of Cádiz, Spain.", Population.class).get(); + var seattle = scope.prompt("What is the population of Seattle, WA.", Population.class).get(); + var img = scope.prompt("A hybrid city of Cádiz, Spain and Seattle, US.", Image.class).get(); + System.out.println(img); + System.out.println("The population of Cádiz is " + cadiz.population + " and the population of Seattle is " + seattle.population); } } } diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Recipes.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Recipes.java index e2f7f416a..03f101884 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Recipes.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Recipes.java @@ -1,20 +1,18 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Recipes { - static class Recipe { - public String name; - public List ingredients; - } + public record Recipe(String name, List ingredients){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { - Recipe recipe = scope.prompt("Recipe for chocolate chip cookies.", Recipe.class).get(); + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { + var recipe = scope.prompt("Recipe for chocolate chip cookies.", Recipe.class).get(); System.out.println("The recipe for " + recipe.name + " is " + recipe.ingredients ); } } diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TopAttractions.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TopAttractions.java index 87d27d1db..9a8655e43 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TopAttractions.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TopAttractions.java @@ -1,35 +1,26 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; +import java.util.Objects; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class TopAttractions { - static class TopAttraction { - public City city; - public String attractionName; - public String description; - public Weather weather = new Weather(); - } - - static class City { - public String name; - public String country; - } - - static class Weather { - public City city; - public double temperature; - public String description; - } + public record TopAttraction(City city, String attractionName, String description, Weather weather){} + public record City(String name, String country){} + public record Weather(City city, Double temperature, String description){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("Top attraction in Cádiz, Spain.", TopAttraction.class) .thenAccept(attraction -> System.out.println( "The top attraction in " + attraction.city.name + " is " + attraction.attractionName + "." + "Here's a brief description: " + attraction.description + "." + - "The weather in " + attraction.city.name + " is " + attraction.weather.temperature + " degrees Celsius and " + attraction.weather.description + "." + "The weather in " + attraction.city.name + " is " + + (Objects.nonNull(attraction.weather) ? attraction.weather.temperature : null) + + " degrees Celsius and " + (Objects.nonNull(attraction.weather) ? attraction.weather.description : null) + "." ) ).get(); } diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TouristAttractions.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TouristAttractions.java index f8f72a855..4f0dfc008 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TouristAttractions.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/TouristAttractions.java @@ -1,18 +1,16 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class TouristAttractions { - static class TouristAttraction { - public String name; - public String location; - public String history; - } + public record TouristAttraction(String name, String location, String history){} public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.prompt("Statue of Liberty location and history.", TouristAttraction.class) .thenAccept(statueOfLiberty -> System.out.println( statueOfLiberty.name + "is located in " + statueOfLiberty.location + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Weather.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Weather.java index 3e6e30899..fad2ef42b 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Weather.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/Weather.java @@ -1,9 +1,11 @@ package com.xebia.functional.xef.java.auto.jdk21; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; public class Weather { public List answer; @@ -16,7 +18,7 @@ private static CompletableFuture clothesRecommend(AIScope scope) { } public static void main(String[] args) throws ExecutionException, InterruptedException { - try (AIScope scope = new AIScope()) { + try (AIScope scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { scope.contextScope(scope.search("Weather in Cádiz, Spain"), Weather::clothesRecommend).get(); } } diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/gpt4all/Chat.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/gpt4all/Chat.java index 787233ca7..769aff757 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/gpt4all/Chat.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/gpt4all/Chat.java @@ -4,13 +4,14 @@ import com.xebia.functional.gpt4all.Gpt4AllModel; import com.xebia.functional.xef.auto.PromptConfiguration; import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.file.Path; import java.util.Objects; import java.util.concurrent.ExecutionException; -import org.reactivestreams.Publisher; +import java.util.concurrent.Executors; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; @@ -36,8 +37,8 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc * to provide embeddings for docs in contextScope. */ - try (AIScope scope = new AIScope(); - BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { + try (var scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor())); + var br = new BufferedReader(new InputStreamReader(System.in))) { System.out.println("🤖 Context loaded: " + scope.getExec().getContext()); @@ -48,7 +49,7 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc if (line.equals("exit")) break; var promptConfiguration = new PromptConfiguration.Companion.Builder().docsInContext(2).streamToStandardOut(true).build(); - Publisher answer = scope.promptStreaming(gpt4all, line, promptConfiguration); + var answer = scope.promptStreaming(gpt4all, line, promptConfiguration); answer.subscribe(new Subscriber() { StringBuilder answer = new StringBuilder(); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/reasoning/ToolSelectionExample.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/reasoning/ToolSelectionExample.java index 9fb7728f2..2899b31ca 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/reasoning/ToolSelectionExample.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/reasoning/ToolSelectionExample.java @@ -1,29 +1,29 @@ package com.xebia.functional.xef.java.auto.jdk21.reasoning; -import com.xebia.functional.xef.auto.CoreAIScope; import com.xebia.functional.xef.auto.llm.openai.OpenAI; -import com.xebia.functional.xef.auto.llm.openai.OpenAIEmbeddings; +import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import com.xebia.functional.xef.reasoning.filesystem.Files; import com.xebia.functional.xef.reasoning.pdf.PDF; import com.xebia.functional.xef.reasoning.text.Text; import com.xebia.functional.xef.reasoning.tools.ToolSelection; - import java.util.Collections; import java.util.List; +import java.util.concurrent.Executors; public class ToolSelectionExample { public static void main(String[] args) { - try (var scope = new CoreAIScope(new OpenAIEmbeddings(OpenAI.DEFAULT_EMBEDDING))) { + try (var scope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()))) { var model = OpenAI.DEFAULT_CHAT; var serialization = OpenAI.DEFAULT_SERIALIZATION; - var text = Text.create(model, scope); - var files = Files.create(serialization, scope, Collections.emptyList()); - var pdf = PDF.create(model, serialization, scope); + var text = Text.create(model, scope.getScope()); + var files = Files.create(serialization, scope.getScope(), Collections.emptyList()); + var pdf = PDF.create(model, serialization, scope.getScope()); var toolSelection = new ToolSelection( serialization, - scope, + scope.getScope(), List.of( text.summarize, pdf.readPDFFromUrl, diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/sql/DatabaseExample.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/sql/DatabaseExample.java index 4e55d6a4c..17df32700 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/sql/DatabaseExample.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/sql/DatabaseExample.java @@ -9,14 +9,13 @@ import com.xebia.functional.xef.java.auto.ExecutionContext; import com.xebia.functional.xef.java.auto.jdk21.util.ConsoleUtil; import com.xebia.functional.xef.sql.jdbc.JdbcConfig; -import kotlin.Unit; -import kotlin.jvm.functions.Function1; -import org.jetbrains.annotations.NotNull; - import java.io.PrintStream; import java.util.Arrays; -import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; +import org.jetbrains.annotations.NotNull; public class DatabaseExample { @@ -26,14 +25,14 @@ public class DatabaseExample { @NotNull private static JdbcConfig getJdbcConfig() { - Map env = System.getenv(); - String vendor = env.getOrDefault("XEF_SQL_DB_VENDOR", "mysql"); - String host = env.getOrDefault("XEF_SQL_DB_HOST", "localhost"); - String username = env.getOrDefault("XEF_SQL_DB_USER", "user"); - String password = env.getOrDefault("XEF_SQL_DB_PASSWORD", "password"); - int port = Integer.parseInt(env.getOrDefault("XEF_SQL_DB_PORT", "3306")); - String database = env.getOrDefault("XEF_SQL_DB_DATABASE", "database"); - OpenAIModel model = MODEL; + var env = System.getenv(); + var vendor = env.getOrDefault("XEF_SQL_DB_VENDOR", "mysql"); + var host = env.getOrDefault("XEF_SQL_DB_HOST", "localhost"); + var username = env.getOrDefault("XEF_SQL_DB_USER", "user"); + var password = env.getOrDefault("XEF_SQL_DB_PASSWORD", "password"); + var port = Integer.parseInt(env.getOrDefault("XEF_SQL_DB_PORT", "3306")); + var database = env.getOrDefault("XEF_SQL_DB_DATABASE", "database"); + var model = MODEL; return new JdbcConfig(vendor, host, username, password, port, database, model); } @@ -46,9 +45,9 @@ private static JdbcConfig getJdbcConfig() { public static void main(String[] args) throws Exception { - ExecutionContext executionContext = new ExecutionContext(); - try (AIScope scope = new AIScope(new ObjectMapper(), executionContext)) { - AIDatabase database = new AIDatabase(getJdbcConfig(), executionContext); + var executionContext = new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor()); + try (var scope = new AIScope(new ObjectMapper(), executionContext)) { + var database = new AIDatabase(getJdbcConfig(), executionContext); out.println("llmdb> Welcome to the LLMDB (An LLM interface to your SQL Database) !"); out.println("llmdb> You can ask me questions about the database and I will try to answer them."); @@ -60,7 +59,7 @@ public static void main(String[] args) throws Exception { while (true) { out.println("user> "); - String input = util.readLine(); + var input = util.readLine(); if (input.equals("exit")) break; try { diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/ControlSignals.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/ControlSignals.java index 76e59f683..6e8f4c5f3 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/ControlSignals.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/ControlSignals.java @@ -1,10 +1,10 @@ package com.xebia.functional.xef.java.auto.jdk21.tot; -import java.util.concurrent.CompletableFuture; - import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.renderHistory; import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; +import java.util.concurrent.CompletableFuture; + public class ControlSignals { static class ControlSignal { @@ -13,7 +13,7 @@ static class ControlSignal { public static CompletableFuture controlSignal(Problems.Memory memory){ System.out.println("\uD83E\uDDE0 Generating control signal for problem:" + truncateText(memory.problem.description) + "..."); - String guidancePrompt = Rendering.trimMargin( + var guidancePrompt = Rendering.trimMargin( " You are an expert advisor on information extraction.\n" + " You generate guidance for a problem.\n" + " " + renderHistory(memory) + "\n" + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Critiques.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Critiques.java index ae8c942db..1547f6af1 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Critiques.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Critiques.java @@ -1,9 +1,9 @@ package com.xebia.functional.xef.java.auto.jdk21.tot; -import java.util.concurrent.CompletableFuture; - import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; +import java.util.concurrent.CompletableFuture; + public class Critiques { static class Critique { @@ -15,7 +15,7 @@ static class Critique { public static CompletableFuture critique(Problems.Memory memory, Solutions.Solution currentSolution){ System.out.println("🕵️ Critiquing solution: " + truncateText(currentSolution.answer) + "..."); - String prompt = Rendering.trimMargin( + var prompt = Rendering.trimMargin( " You are an expert advisor critiquing a solution.\n" + " \n" + " Previous history:\n" + diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Main.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Main.java index 75edc7863..67cae5025 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Main.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Main.java @@ -24,7 +24,7 @@ public static void main(String[] args) { " Return a concise solution that fixes the problems in the code."); - Solutions.Solution solve = Problems.solve(problem, MAX_ROUNDS); + var solve = Problems.solve(problem, MAX_ROUNDS); System.out.println("✅ Final solution: " + solve.answer); System.out.println("✅ Solution validity: " + solve.isValid); diff --git a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Problems.java b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Problems.java index 28927c2a5..370a3b489 100644 --- a/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Problems.java +++ b/examples/java/src/main/java/com/xebia/functional/xef/java/auto/jdk21/tot/Problems.java @@ -1,13 +1,14 @@ package com.xebia.functional.xef.java.auto.jdk21.tot; -import com.xebia.functional.xef.java.auto.AIScope; -import org.jetbrains.annotations.Nullable; +import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; +import com.xebia.functional.xef.java.auto.AIScope; +import com.xebia.functional.xef.java.auto.ExecutionContext; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Executors; import java.util.stream.Stream; - -import static com.xebia.functional.xef.java.auto.jdk21.tot.Rendering.truncateText; +import org.jetbrains.annotations.Nullable; public class Problems { @@ -97,7 +98,7 @@ public Memory addResult(Solutions.Solution result) { private static void checkAIScope() { if(aiScope == null){ - aiScope = new AIScope(); + aiScope = new AIScope(new ExecutionContext(Executors.newVirtualThreadPerTaskExecutor())); } } diff --git a/java/src/main/java/com/xebia/functional/xef/java/auto/AIDatabase.java b/java/src/main/java/com/xebia/functional/xef/java/auto/AIDatabase.java index 8452483a6..57bf0445e 100644 --- a/java/src/main/java/com/xebia/functional/xef/java/auto/AIDatabase.java +++ b/java/src/main/java/com/xebia/functional/xef/java/auto/AIDatabase.java @@ -23,7 +23,7 @@ public CompletableFuture getInterestingPromptsForDatabase() { } public void extendContext(List textsToAdd) { - String[] textsArray = textsToAdd.toArray(new String[textsToAdd.size()]); + var textsArray = textsToAdd.toArray(new String[textsToAdd.size()]); exec.future(continuation -> scope.extendContext(textsArray, continuation)); } diff --git a/java/src/main/java/com/xebia/functional/xef/java/auto/AIScope.java b/java/src/main/java/com/xebia/functional/xef/java/auto/AIScope.java index 3e6ed4524..3c5395cd5 100644 --- a/java/src/main/java/com/xebia/functional/xef/java/auto/AIScope.java +++ b/java/src/main/java/com/xebia/functional/xef/java/auto/AIScope.java @@ -54,6 +54,10 @@ public AIScope(ObjectMapper om, ExecutionContext executionContext) { this.scope = executionContext.getCoreScope(); } + public CoreAIScope getScope() { + return scope; + } + public ExecutionContext getExec() { return exec; } From 977abf3d51cdca3dd013036249858acfcb9cae19 Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Thu, 27 Jul 2023 10:27:20 -0500 Subject: [PATCH 6/9] Remove code commented --- examples/java/build.gradle.kts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/java/build.gradle.kts b/examples/java/build.gradle.kts index fa3b9f628..6acde3d30 100644 --- a/examples/java/build.gradle.kts +++ b/examples/java/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { } val ENABLE_PREVIEW = "--enable-preview" + tasks.withType { options.compilerArgs.add(ENABLE_PREVIEW) } @@ -19,7 +20,3 @@ tasks.test { useJUnitPlatform() jvmArgs(ENABLE_PREVIEW) } - -/*tasks.withType().configureEach { - useJUnit() -}*/ From 9ef4155869e26ec6e5642452ccfedb72fd69411b Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Thu, 27 Jul 2023 10:48:21 -0500 Subject: [PATCH 7/9] Add code commented --- examples/java/build.gradle.kts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/java/build.gradle.kts b/examples/java/build.gradle.kts index 6acde3d30..fa3b9f628 100644 --- a/examples/java/build.gradle.kts +++ b/examples/java/build.gradle.kts @@ -12,7 +12,6 @@ dependencies { } val ENABLE_PREVIEW = "--enable-preview" - tasks.withType { options.compilerArgs.add(ENABLE_PREVIEW) } @@ -20,3 +19,7 @@ tasks.test { useJUnitPlatform() jvmArgs(ENABLE_PREVIEW) } + +/*tasks.withType().configureEach { + useJUnit() +}*/ From f5dc96ad944ffe2491b36ec4bc946d06a95b33aa Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Thu, 27 Jul 2023 10:49:58 -0500 Subject: [PATCH 8/9] Remove code commented --- examples/java/build.gradle.kts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/java/build.gradle.kts b/examples/java/build.gradle.kts index fa3b9f628..6acde3d30 100644 --- a/examples/java/build.gradle.kts +++ b/examples/java/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { } val ENABLE_PREVIEW = "--enable-preview" + tasks.withType { options.compilerArgs.add(ENABLE_PREVIEW) } @@ -19,7 +20,3 @@ tasks.test { useJUnitPlatform() jvmArgs(ENABLE_PREVIEW) } - -/*tasks.withType().configureEach { - useJUnit() -}*/ From 71e3faa0b9009faa3823ad43001dc180b4fb10a4 Mon Sep 17 00:00:00 2001 From: Daniel Gelvez Date: Thu, 27 Jul 2023 15:31:14 -0500 Subject: [PATCH 9/9] Add publish xef-java-example to java-version 19 --- .github/workflows/publish-development-version.yml | 2 +- .github/workflows/publish.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-development-version.yml b/.github/workflows/publish-development-version.yml index e6c57826c..b4541ce53 100644 --- a/.github/workflows/publish-development-version.yml +++ b/.github/workflows/publish-development-version.yml @@ -66,7 +66,7 @@ jobs: - name: assemble uses: gradle/gradle-build-action@v2 with: - arguments: :kotlin-loom:assemble :xef-scala:assemble + arguments: :kotlin-loom:assemble :xef-scala:assemble :xef-java-examples:assemble - name: Upload reports if: failure() diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6f6812311..dc3165ab4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -64,7 +64,7 @@ jobs: - name: assemble uses: gradle/gradle-build-action@v2 with: - arguments: :kotlin-loom:assemble :xef-scala:assemble + arguments: :kotlin-loom:assemble :xef-scala:assemble :xef-java-examples:assemble - name: Upload reports if: failure()