15
15
*/
16
16
package io .serverlessworkflow .fluent .agentic .langchain4j ;
17
17
18
+ import static io .serverlessworkflow .fluent .agentic .AgentWorkflowBuilder .workflow ;
19
+ import static io .serverlessworkflow .fluent .agentic .dsl .AgenticDSL .fn ;
20
+ import static io .serverlessworkflow .fluent .agentic .langchain4j .Agents .*;
18
21
import static io .serverlessworkflow .fluent .agentic .langchain4j .Agents .AudienceEditor ;
19
22
import static io .serverlessworkflow .fluent .agentic .langchain4j .Agents .CreativeWriter ;
20
23
import static io .serverlessworkflow .fluent .agentic .langchain4j .Agents .StyleEditor ;
21
24
import static io .serverlessworkflow .fluent .agentic .langchain4j .Models .BASE_MODEL ;
25
+ import static org .junit .jupiter .api .Assertions .assertNotNull ;
26
+ import static org .junit .jupiter .api .Assertions .assertTrue ;
22
27
import static org .mockito .ArgumentMatchers .any ;
23
28
import static org .mockito .ArgumentMatchers .eq ;
24
29
import static org .mockito .Mockito .spy ;
25
30
import static org .mockito .Mockito .verify ;
26
31
27
- import dev .langchain4j .agentic .AgenticServices ;
28
32
import dev .langchain4j .agentic .UntypedAgent ;
33
+ import dev .langchain4j .agentic .scope .AgenticScope ;
29
34
import dev .langchain4j .agentic .workflow .WorkflowAgentsBuilder ;
35
+
36
+ import java .util .List ;
30
37
import java .util .Map ;
38
+ import java .util .function .Function ;
39
+ import java .util .function .Predicate ;
40
+
41
+ import io .serverlessworkflow .fluent .agentic .AgenticServices ;
42
+ import io .serverlessworkflow .fluent .agentic .AgentsUtils ;
31
43
import org .junit .jupiter .api .Test ;
32
44
33
45
public class WorkflowAgentsIT {
@@ -38,21 +50,21 @@ void sequential_agents_tests() {
38
50
39
51
CreativeWriter creativeWriter =
40
52
spy (
41
- AgenticServices .agentBuilder (CreativeWriter .class )
53
+ dev . langchain4j . agentic . AgenticServices .agentBuilder (CreativeWriter .class )
42
54
.chatModel (BASE_MODEL )
43
55
.outputName ("story" )
44
56
.build ());
45
57
46
58
AudienceEditor audienceEditor =
47
59
spy (
48
- AgenticServices .agentBuilder (AudienceEditor .class )
60
+ dev . langchain4j . agentic . AgenticServices .agentBuilder (AudienceEditor .class )
49
61
.chatModel (BASE_MODEL )
50
62
.outputName ("story" )
51
63
.build ());
52
64
53
65
StyleEditor styleEditor =
54
66
spy (
55
- AgenticServices .agentBuilder (StyleEditor .class )
67
+ dev . langchain4j . agentic . AgenticServices .agentBuilder (StyleEditor .class )
56
68
.chatModel (BASE_MODEL )
57
69
.outputName ("story" )
58
70
.build ());
@@ -77,4 +89,76 @@ void sequential_agents_tests() {
77
89
verify (audienceEditor ).editStory (any (), eq ("young adults" ));
78
90
verify (styleEditor ).editStory (any (), eq ("fantasy" ));
79
91
}
92
+
93
+ @ Test
94
+ public void sequenceHelperTest () {
95
+ var creativeWriter = AgentsUtils .newCreativeWriter ();
96
+ var audienceEditor = AgentsUtils .newAudienceEditor ();
97
+ var styleEditor = AgentsUtils .newStyleEditor ();
98
+
99
+ NovelCreator novelCreator = AgenticServices .of (NovelCreator .class )
100
+ .flow (workflow ("seqFlow" )
101
+ .sequence (creativeWriter , audienceEditor , styleEditor )
102
+ ).build ();
103
+
104
+ String story = novelCreator .createNovel ("dragons and wizards" , "young adults" , "fantasy" );
105
+ assertNotNull (story );
106
+ }
107
+
108
+ @ Test
109
+ public void parallelWorkflow () {
110
+ var foodExpert = AgentsUtils .newFoodExpert ();
111
+ var movieExpert = AgentsUtils .newMovieExpert ();
112
+
113
+ EveningPlannerAgent eveningPlannerAgent = AgenticServices .of (EveningPlannerAgent .class )
114
+ .flow (workflow ("parallelFlow" )
115
+ .parallel (foodExpert , movieExpert )
116
+ ).build ();
117
+ List <EveningPlan > result = eveningPlannerAgent .plan ("romantic" );
118
+ assertTrue (result .size () > 0 );
119
+ }
120
+
121
+ @ Test
122
+ public void loopTest () {
123
+ var creativeWriter = AgentsUtils .newCreativeWriter ();
124
+ var scorer = AgentsUtils .newStyleScorer ();
125
+ var editor = AgentsUtils .newStyleEditor ();
126
+
127
+ Predicate <AgenticScope > until = s -> s .readState ("score" , 0 ).doubleValue () >= 0.8 ;
128
+
129
+
130
+ StyledWriter styledWriter = AgenticServices .of (StyledWriter .class )
131
+ .flow (workflow ("loopFlow" ).agent (creativeWriter )
132
+ .loop (until , scorer , editor )
133
+ ).build ();
134
+
135
+ String story = styledWriter .writeStoryWithStyle ("dragons and wizards" , "fantasy" );
136
+ assertNotNull (story );
137
+ }
138
+
139
+ @ Test
140
+ public void humanInTheLoop () {
141
+ var astrologyAgent = AgentsUtils .newAstrologyAgent ();
142
+
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?" );
159
+
160
+ assertNotNull (result );
161
+
162
+ }
163
+
80
164
}
0 commit comments