2222import static io .serverlessworkflow .fluent .agentic .langchain4j .Agents .CreativeWriter ;
2323import static io .serverlessworkflow .fluent .agentic .langchain4j .Agents .StyleEditor ;
2424import static io .serverlessworkflow .fluent .agentic .langchain4j .Models .BASE_MODEL ;
25+ import static org .junit .jupiter .api .Assertions .assertEquals ;
2526import static org .junit .jupiter .api .Assertions .assertNotNull ;
2627import static org .junit .jupiter .api .Assertions .assertTrue ;
2728import static org .mockito .ArgumentMatchers .any ;
3233import dev .langchain4j .agentic .UntypedAgent ;
3334import dev .langchain4j .agentic .scope .AgenticScope ;
3435import dev .langchain4j .agentic .workflow .WorkflowAgentsBuilder ;
36+ import io .serverlessworkflow .fluent .agentic .AgenticServices ;
37+ import io .serverlessworkflow .fluent .agentic .AgentsUtils ;
3538
39+ import java .util .ArrayList ;
3640import java .util .List ;
3741import java .util .Map ;
3842import java .util .function .Function ;
3943import java .util .function .Predicate ;
44+ import java .util .stream .IntStream ;
4045
41- import io .serverlessworkflow .fluent .agentic .AgenticServices ;
42- import io .serverlessworkflow .fluent .agentic .AgentsUtils ;
4346import org .junit .jupiter .api .Test ;
4447
4548public class WorkflowAgentsIT {
@@ -49,38 +52,38 @@ void sequential_agents_tests() {
4952 WorkflowAgentsBuilder builder = new LC4JWorkflowBuilder ();
5053
5154 CreativeWriter creativeWriter =
52- spy (
53- dev .langchain4j .agentic .AgenticServices .agentBuilder (CreativeWriter .class )
54- .chatModel (BASE_MODEL )
55- .outputName ("story" )
56- .build ());
55+ spy (
56+ dev .langchain4j .agentic .AgenticServices .agentBuilder (CreativeWriter .class )
57+ .chatModel (BASE_MODEL )
58+ .outputName ("story" )
59+ .build ());
5760
5861 AudienceEditor audienceEditor =
59- spy (
60- dev .langchain4j .agentic .AgenticServices .agentBuilder (AudienceEditor .class )
61- .chatModel (BASE_MODEL )
62- .outputName ("story" )
63- .build ());
62+ spy (
63+ dev .langchain4j .agentic .AgenticServices .agentBuilder (AudienceEditor .class )
64+ .chatModel (BASE_MODEL )
65+ .outputName ("story" )
66+ .build ());
6467
6568 StyleEditor styleEditor =
66- spy (
67- dev .langchain4j .agentic .AgenticServices .agentBuilder (StyleEditor .class )
68- .chatModel (BASE_MODEL )
69- .outputName ("story" )
70- .build ());
69+ spy (
70+ dev .langchain4j .agentic .AgenticServices .agentBuilder (StyleEditor .class )
71+ .chatModel (BASE_MODEL )
72+ .outputName ("story" )
73+ .build ());
7174
7275 UntypedAgent novelCreator =
73- builder
74- .sequenceBuilder ()
75- .subAgents (creativeWriter , audienceEditor , styleEditor )
76- .outputName ("story" )
77- .build ();
76+ builder
77+ .sequenceBuilder ()
78+ .subAgents (creativeWriter , audienceEditor , styleEditor )
79+ .outputName ("story" )
80+ .build ();
7881
7982 Map <String , Object > input =
80- Map .of (
81- "topic" , "dragons and wizards" ,
82- "style" , "fantasy" ,
83- "audience" , "young adults" );
83+ Map .of (
84+ "topic" , "dragons and wizards" ,
85+ "style" , "fantasy" ,
86+ "audience" , "young adults" );
8487
8588 String story = (String ) novelCreator .invoke (input );
8689 System .out .println (story );
@@ -96,10 +99,10 @@ public void sequenceHelperTest() {
9699 var audienceEditor = AgentsUtils .newAudienceEditor ();
97100 var styleEditor = AgentsUtils .newStyleEditor ();
98101
99- NovelCreator novelCreator = AgenticServices . of ( NovelCreator . class )
100- . flow ( workflow ( "seqFlow" )
101- .sequence (creativeWriter , audienceEditor , styleEditor )
102- ) .build ();
102+ NovelCreator novelCreator =
103+ AgenticServices . of ( NovelCreator . class )
104+ .flow ( workflow ( "seqFlow" ). sequence (creativeWriter , audienceEditor , styleEditor ) )
105+ .build ();
103106
104107 String story = novelCreator .createNovel ("dragons and wizards" , "young adults" , "fantasy" );
105108 assertNotNull (story );
@@ -110,12 +113,25 @@ public void parallelWorkflow() {
110113 var foodExpert = AgentsUtils .newFoodExpert ();
111114 var movieExpert = AgentsUtils .newMovieExpert ();
112115
113- EveningPlannerAgent eveningPlannerAgent = AgenticServices .of (EveningPlannerAgent .class )
114- .flow (workflow ("parallelFlow" )
115- .parallel (foodExpert , movieExpert )
116- ).build ();
116+ Function <Map <String , List <String >>, List <EveningPlan >> planEvening =
117+ input -> {
118+ List <String > movies = input .getOrDefault ("findMovie" , List .of ());
119+ List <String > meals = input .getOrDefault ("findMeal" , List .of ());
120+ int max = Math .min (movies .size (), meals .size ());
121+
122+ return IntStream .range (0 , max )
123+ .mapToObj (i -> new EveningPlan (movies .get (i ), meals .get (i )))
124+ .toList ();
125+ };
126+
127+ EveningPlannerAgent eveningPlannerAgent =
128+ AgenticServices .of (EveningPlannerAgent .class )
129+ .flow (workflow ("parallelFlow" ).parallel (foodExpert , movieExpert )
130+ .outputAs (planEvening ))
131+ .build ();
117132 List <EveningPlan > result = eveningPlannerAgent .plan ("romantic" );
118- assertTrue (result .size () > 0 );
133+ System .out .println (result );
134+ assertEquals (3 , result .size ());
119135 }
120136
121137 @ Test
@@ -126,11 +142,10 @@ public void loopTest() {
126142
127143 Predicate <AgenticScope > until = s -> s .readState ("score" , 0 ).doubleValue () >= 0.8 ;
128144
129-
130- StyledWriter styledWriter = AgenticServices .of (StyledWriter .class )
131- .flow (workflow ("loopFlow" ).agent (creativeWriter )
132- .loop (until , scorer , editor )
133- ).build ();
145+ StyledWriter styledWriter =
146+ AgenticServices .of (StyledWriter .class )
147+ .flow (workflow ("loopFlow" ).agent (creativeWriter ).loop (until , scorer , editor ))
148+ .build ();
134149
135150 String story = styledWriter .writeStoryWithStyle ("dragons and wizards" , "fantasy" );
136151 assertNotNull (story );
@@ -140,25 +155,26 @@ public void loopTest() {
140155 public void humanInTheLoop () {
141156 var astrologyAgent = AgentsUtils .newAstrologyAgent ();
142157
143- var askSign = new Function <Map <String , Object >, Map <String , Object >>() {
144- @ Override
145- public Map <String , Object > apply (Map <String , Object > holder ) {
146- System .out .println ("What's your star sign?" );
147- //var sign = System.console().readLine();
148- holder .put ("sign" , "piscis" );
149- return holder ;
150- }
151- };
152-
153- String result = AgenticServices .of (HoroscopeAgent .class )
154- .flow (workflow ("humanInTheLoop" )
155- .tasks (tasks -> tasks .callFn (fn (askSign )))
156- .agent (astrologyAgent ))
157- .build ()
158- .invoke ("My name is Mario. What is my horoscope?" );
158+ var askSign =
159+ new Function <Map <String , Object >, Map <String , Object >>() {
160+ @ Override
161+ public Map <String , Object > apply (Map <String , Object > holder ) {
162+ System .out .println ("What's your star sign?" );
163+ // var sign = System.console().readLine();
164+ holder .put ("sign" , "piscis" );
165+ return holder ;
166+ }
167+ };
168+
169+ String result =
170+ AgenticServices .of (HoroscopeAgent .class )
171+ .flow (
172+ workflow ("humanInTheLoop" )
173+ .tasks (tasks -> tasks .callFn (fn (askSign )))
174+ .agent (astrologyAgent ))
175+ .build ()
176+ .invoke ("My name is Mario. What is my horoscope?" );
159177
160178 assertNotNull (result );
161-
162179 }
163-
164180}
0 commit comments