2828import static io .serverlessworkflow .fluent .agentic .AgentsUtils .newSummaryStory ;
2929import static io .serverlessworkflow .fluent .agentic .dsl .AgenticDSL .conditional ;
3030import static io .serverlessworkflow .fluent .agentic .dsl .AgenticDSL .doTasks ;
31- import static io .serverlessworkflow .fluent .agentic .dsl .AgenticDSL .loop ;
3231import static org .assertj .core .api .Assertions .assertThat ;
3332import static org .junit .jupiter .api .Assertions .assertEquals ;
3433import static org .junit .jupiter .api .Assertions .assertNotNull ;
35- import static org .mockito .ArgumentMatchers .any ;
36- import static org .mockito .ArgumentMatchers .eq ;
37- import static org .mockito .Mockito .spy ;
38- import static org .mockito .Mockito .verify ;
3934
4035import dev .langchain4j .agentic .scope .AgenticScope ;
4136import io .serverlessworkflow .api .types .TaskItem ;
4237import io .serverlessworkflow .api .types .Workflow ;
4338import io .serverlessworkflow .api .types .func .CallTaskJava ;
4439import io .serverlessworkflow .impl .WorkflowApplication ;
45-
4640import java .util .List ;
4741import java .util .Map ;
4842import java .util .function .Function ;
4943import java .util .function .Predicate ;
5044import java .util .stream .IntStream ;
51-
5245import org .junit .jupiter .api .DisplayName ;
5346import org .junit .jupiter .api .Test ;
5447
@@ -61,9 +54,9 @@ public void sequentialWorkflow() {
6154 var audienceEditor = newAudienceEditor ();
6255 var styleEditor = newStyleEditor ();
6356
64- NovelCreator novelCreator = AgenticWorkflow . of ( NovelCreator . class )
65- . flow ( workflow ( "seqFlow" )
66- .sequence (creativeWriter , audienceEditor , styleEditor ))
57+ NovelCreator novelCreator =
58+ AgenticWorkflow . of ( NovelCreator . class )
59+ .flow ( workflow ( "seqFlow" ). sequence (creativeWriter , audienceEditor , styleEditor ))
6760 .build ();
6861
6962 String story = novelCreator .createNovel ("dragons and wizards" , "young adults" , "fantasy" );
@@ -76,19 +69,20 @@ public void parallelWorkflow() {
7669 var foodExpert = newFoodExpert ();
7770 var movieExpert = newMovieExpert ();
7871
79- Function <AgenticScope , List <EveningPlan >> planEvening = input -> {
80- List <String > movies = (List <String >) input .readState ("movies" );
81- List <String > meals = (List <String >) input .readState ("meals" );
72+ Function <AgenticScope , List <EveningPlan >> planEvening =
73+ input -> {
74+ List <String > movies = (List <String >) input .readState ("movies" );
75+ List <String > meals = (List <String >) input .readState ("meals" );
8276
83- int max = Math .min (movies .size (), meals .size ());
84- return IntStream .range (0 , max )
77+ int max = Math .min (movies .size (), meals .size ());
78+ return IntStream .range (0 , max )
8579 .mapToObj (i -> new EveningPlan (movies .get (i ), meals .get (i )))
8680 .toList ();
87- };
81+ };
8882
89- EveningPlannerAgent eveningPlannerAgent = AgenticWorkflow . of ( EveningPlannerAgent . class )
90- . flow ( workflow ( "parallelFlow" )
91- .parallel (foodExpert , movieExpert ).outputAs (planEvening ))
83+ EveningPlannerAgent eveningPlannerAgent =
84+ AgenticWorkflow . of ( EveningPlannerAgent . class )
85+ .flow ( workflow ( "parallelFlow" ). parallel (foodExpert , movieExpert ).outputAs (planEvening ))
9286 .build ();
9387 List <EveningPlan > result = eveningPlannerAgent .plan ("romantic" );
9488 assertEquals (3 , result .size ());
@@ -103,11 +97,10 @@ public void loopTest() {
10397
10498 Predicate <AgenticScope > until = s -> s .readState ("score" , 0.0 ) >= 0.8 ;
10599
106- StyledWriter styledWriter = AgenticWorkflow .of (StyledWriter .class )
107- .flow (workflow ("loopFlow" )
108- .agent (creativeWriter )
109- .loop (until , styleScorer , styleEditor ))
110- .build ();
100+ StyledWriter styledWriter =
101+ AgenticWorkflow .of (StyledWriter .class )
102+ .flow (workflow ("loopFlow" ).agent (creativeWriter ).loop (until , styleScorer , styleEditor ))
103+ .build ();
111104
112105 String story = styledWriter .writeStoryWithStyle ("dragons and wizards" , "comedy" );
113106 assertNotNull (story );
@@ -122,13 +115,13 @@ public void loopWorkflowWithMaxIterations() {
122115 var summaryStory = newSummaryStory ();
123116
124117 NovelCreator novelCreator =
125- AgenticWorkflow .of (NovelCreator .class )
126- .flow (
127- workflow ("seqFlow" )
128- .agent (creativeWriter )
129- .sequence (audienceEditor , styleEditor )
130- .agent (summaryStory ))
131- .build ();
118+ AgenticWorkflow .of (NovelCreator .class )
119+ .flow (
120+ workflow ("seqFlow" )
121+ .agent (creativeWriter )
122+ .sequence (audienceEditor , styleEditor )
123+ .agent (summaryStory ))
124+ .build ();
132125
133126 String story = novelCreator .createNovel ("dragons and wizards" , "young adults" , "fantasy" );
134127 assertNotNull (story );
@@ -140,25 +133,25 @@ public void humanInTheLoop() {
140133 var astrologyAgent = newAstrologyAgent ();
141134
142135 var askSign =
143- new Function <AgenticScope , AgenticScope >() {
144- @ Override
145- public AgenticScope apply (AgenticScope holder ) {
146- System .out .println ("What's your star sign?" );
147- // var sign = System.console().readLine();
148- holder .writeState ("sign" , "piscis" );
149- return holder ;
150- }
151- };
136+ new Function <AgenticScope , AgenticScope >() {
137+ @ Override
138+ public AgenticScope apply (AgenticScope holder ) {
139+ System .out .println ("What's your star sign?" );
140+ // var sign = System.console().readLine();
141+ holder .writeState ("sign" , "piscis" );
142+ return holder ;
143+ }
144+ };
152145
153146 String result =
154- AgenticWorkflow .of (HoroscopeAgent .class )
155- .flow (
156- workflow ("humanInTheLoop" )
157- .inputFrom (askSign )
158- // .tasks(tasks -> tasks.callFn(fn(askSign))) // TODO should work too
159- .agent (astrologyAgent ))
160- .build ()
161- .invoke ("My name is Mario. What is my horoscope?" );
147+ AgenticWorkflow .of (HoroscopeAgent .class )
148+ .flow (
149+ workflow ("humanInTheLoop" )
150+ .inputFrom (askSign )
151+ // .tasks(tasks -> tasks.callFn(fn(askSign))) // TODO should work too
152+ .agent (astrologyAgent ))
153+ .build ()
154+ .invoke ("My name is Mario. What is my horoscope?" );
162155
163156 assertNotNull (result );
164157 }
@@ -171,9 +164,9 @@ public void errorHandling() {
171164 var styleEditor = newStyleEditor ();
172165
173166 Workflow wf =
174- workflow ("seqFlow" )
175- .sequence ("process" , creativeWriter , audienceEditor , styleEditor )
176- .build ();
167+ workflow ("seqFlow" )
168+ .sequence ("process" , creativeWriter , audienceEditor , styleEditor )
169+ .build ();
177170
178171 List <TaskItem > items = wf .getDo ();
179172 assertThat (items ).hasSize (3 );
@@ -184,9 +177,9 @@ public void errorHandling() {
184177 items .forEach (it -> assertThat (it .getTask ().getCallTask ()).isInstanceOf (CallTaskJava .class ));
185178
186179 Map <String , Object > input =
187- Map .of (
188- "style" , "fantasy" ,
189- "audience" , "young adults" );
180+ Map .of (
181+ "style" , "fantasy" ,
182+ "audience" , "young adults" );
190183
191184 Map <String , Object > result ;
192185 try (WorkflowApplication app = WorkflowApplication .builder ().build ()) {
@@ -209,14 +202,14 @@ public void conditionalWorkflow() {
209202 var legalExpert = newLegalExpert ();
210203
211204 Workflow wf =
212- workflow ("conditional" )
213- .sequence ("process" , category )
214- .tasks (
215- doTasks (
216- conditional (RequestCategory .MEDICAL ::equals , medicalExpert ),
217- conditional (RequestCategory .TECHNICAL ::equals , technicalExpert ),
218- conditional (RequestCategory .LEGAL ::equals , legalExpert )))
219- .build ();
205+ workflow ("conditional" )
206+ .sequence ("process" , category )
207+ .tasks (
208+ doTasks (
209+ conditional (RequestCategory .MEDICAL ::equals , medicalExpert ),
210+ conditional (RequestCategory .TECHNICAL ::equals , technicalExpert ),
211+ conditional (RequestCategory .LEGAL ::equals , legalExpert )))
212+ .build ();
220213
221214 Map <String , Object > input = Map .of ("question" , "What is the best treatment for a common cold?" );
222215
@@ -229,5 +222,4 @@ public void conditionalWorkflow() {
229222
230223 assertThat (result ).containsKey ("response" );
231224 }
232-
233225}
0 commit comments