Skip to content

Commit 2015576

Browse files
committed
Add sequence
Signed-off-by: Ricardo Zanini <[email protected]>
1 parent 24c94d0 commit 2015576

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

fluent/agentic/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@
5858
<artifactId>mockito-core</artifactId>
5959
<scope>test</scope>
6060
</dependency>
61+
<dependency>
62+
<groupId>org.assertj</groupId>
63+
<artifactId>assertj-core</artifactId>
64+
</dependency>
6165
<dependency>
6266
<groupId>dev.langchain4j</groupId>
6367
<artifactId>langchain4j-ollama</artifactId>

fluent/agentic/src/main/java/io/serverlessworkflow/fluent/agentic/AgentDoTaskFluent.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,19 @@
1515
*/
1616
package io.serverlessworkflow.fluent.agentic;
1717

18+
import java.util.UUID;
19+
1820
public interface AgentDoTaskFluent<SELF extends AgentDoTaskFluent<SELF>> {
1921

2022
SELF agent(String name, Object agent);
23+
24+
default SELF agent(Object agent) {
25+
return agent(UUID.randomUUID().toString(), agent);
26+
}
27+
28+
SELF sequence(String name, Object... agents);
29+
30+
default SELF sequence(Object... agents) {
31+
return sequence("seq-" + UUID.randomUUID(), agents);
32+
}
2133
}

fluent/agentic/src/main/java/io/serverlessworkflow/fluent/agentic/AgentTaskItemListBuilder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ public AgentTaskItemListBuilder agent(String name, Object agent) {
4242
return this;
4343
}
4444

45+
@Override
46+
public AgentTaskItemListBuilder sequence(String name, Object... agents) {
47+
for (int i = 0; i < agents.length; i++) {
48+
agent(name + "-" + i, agents[i]);
49+
}
50+
return self();
51+
}
52+
4553
@Override
4654
public AgentTaskItemListBuilder self() {
4755
return this;

fluent/agentic/src/main/java/io/serverlessworkflow/fluent/agentic/DelegatingAgentDoTaskFluent.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,16 @@ private AgentDoTaskFluent<SELF> d() {
2727
}
2828

2929
@SuppressWarnings("unchecked")
30+
@Override
3031
default SELF agent(String name, Object agent) {
3132
d().agent(name, agent);
3233
return (SELF) this;
3334
}
35+
36+
@SuppressWarnings("unchecked")
37+
@Override
38+
default SELF sequence(String name, Object... agents) {
39+
d().sequence(name, agents);
40+
return (SELF) this;
41+
}
3442
}

fluent/agentic/src/test/java/io/serverlessworkflow/fluent/agentic/AgenticWorkflowBuilderTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package io.serverlessworkflow.fluent.agentic;
1717

1818
import static io.serverlessworkflow.fluent.agentic.Models.BASE_MODEL;
19+
import static org.assertj.core.api.Assertions.assertThat;
1920
import static org.junit.jupiter.api.Assertions.assertEquals;
2021
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
2122
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -24,6 +25,7 @@
2425
import dev.langchain4j.agentic.AgentServices;
2526
import io.serverlessworkflow.api.types.Workflow;
2627
import io.serverlessworkflow.api.types.func.CallJava;
28+
import org.junit.jupiter.api.DisplayName;
2729
import org.junit.jupiter.api.Test;
2830

2931
public class AgenticWorkflowBuilderTest {
@@ -46,4 +48,49 @@ public void verifyAgentCall() {
4648
assertEquals(1, workflow.getDo().size());
4749
assertInstanceOf(CallJava.class, workflow.getDo().get(0).getTask().getCallTask().get());
4850
}
51+
52+
@Test
53+
void sequenceAgents() {
54+
Agents.MovieExpert movieExpert = newMovieExpert();
55+
Workflow wf =
56+
AgenticWorkflowBuilder.workflow("seqFlow")
57+
.tasks(d -> d.sequence("lineup", movieExpert, movieExpert))
58+
.build();
59+
60+
assertThat(wf.getDo()).hasSize(2);
61+
assertThat(wf.getDo().get(0).getName()).isEqualTo("lineup-0");
62+
assertThat(wf.getDo().get(1).getName()).isEqualTo("lineup-1");
63+
wf.getDo()
64+
.forEach(
65+
ti -> {
66+
assertThat(ti.getTask().getCallTask()).isNotNull();
67+
assertThat(ti.getTask().getCallTask().get()).isNotNull();
68+
});
69+
}
70+
71+
@Test
72+
@DisplayName("Mix spec verbs with agent()")
73+
void mixSpecAndAgent() {
74+
Workflow wf =
75+
AgenticWorkflowBuilder.workflow("mixFlow")
76+
.tasks(
77+
d ->
78+
d.set("init", s -> s.expr("$.mood = 'comedy'"))
79+
.agent("pickMovies", newMovieExpert())
80+
.set("done", "$.done = true"))
81+
.build();
82+
83+
assertThat(wf.getDo()).hasSize(3);
84+
assertThat(wf.getDo().get(0).getTask().getSetTask()).isNotNull();
85+
assertThat(wf.getDo().get(1).getTask().getCallTask().get()).isNotNull();
86+
assertThat(wf.getDo().get(2).getTask().getSetTask()).isNotNull();
87+
}
88+
89+
private Agents.MovieExpert newMovieExpert() {
90+
return spy(
91+
AgentServices.agentBuilder(Agents.MovieExpert.class)
92+
.outputName("movies")
93+
.chatModel(BASE_MODEL)
94+
.build());
95+
}
4996
}

0 commit comments

Comments
 (0)