Skip to content

Commit efcadd5

Browse files
committed
more
Signed-off-by: Dmitrii Tikhomirov <[email protected]>
1 parent 517257b commit efcadd5

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,31 @@ interface SceneAgent extends AgentInstance {
140140
@Agent("Generates the opening scene of the story from a plot outline.")
141141
String invoke(@V("plot") String plot);
142142
}
143-
}
143+
144+
interface MeetingInvitationDraft extends AgentInstance {
145+
146+
@UserMessage(
147+
"""
148+
You are a professional meeting invitation writer. Draft a concise and clear meeting invitation email based on the following details:
149+
Subject: {{subject}}
150+
Date: {{date}}
151+
Time: {{time}}
152+
Location: {{location}}
153+
Agenda: {{agenda}}
154+
""")
155+
@Agent("Drafts a professional meeting invitation email.")
156+
String invoke(@V("subject") String subject, @V("date") String date, @V("time") String time, @V("location") String location, @V("agenda") String agenda);
157+
}
158+
159+
interface MeetingInvitationStyle extends AgentInstance {
160+
161+
@UserMessage(
162+
"""
163+
You are a professional meeting invitation writer. Rewrite the following meeting invitation email to better fit the {{style}} style:
164+
Original Invitation: {{invitation}}
165+
""")
166+
@Agent("Edits a meeting invitation email to better fit a given style.")
167+
String invoke(@V("invitation") String invitation, @V("style") String style);
168+
}
169+
170+
}

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@
2323
import static org.mockito.Mockito.mock;
2424
import static org.mockito.Mockito.when;
2525

26+
import dev.langchain4j.agentic.AgentServices;
27+
import dev.langchain4j.agentic.workflow.HumanInTheLoop;
2628
import io.serverlessworkflow.api.types.Workflow;
2729
import io.serverlessworkflow.impl.WorkflowApplication;
2830
import java.util.HashMap;
2931
import java.util.List;
3032
import java.util.Map;
3133
import java.util.Set;
3234
import java.util.concurrent.ExecutionException;
35+
import java.util.concurrent.atomic.AtomicReference;
3336
import java.util.function.Function;
3437
import java.util.stream.Collectors;
3538
import org.junit.jupiter.api.Test;
@@ -220,4 +223,53 @@ public void testSeqAndThenParallel() throws ExecutionException, InterruptedExcep
220223
assertEquals(technologyTraits, result.get("branch-1-cultureAndTechnology"));
221224
}
222225
}
226+
227+
@Test
228+
public void humanInTheLoop() throws ExecutionException, InterruptedException {
229+
final MeetingInvitationDraft meetingInvitationDraft = mock(MeetingInvitationDraft.class);
230+
when(meetingInvitationDraft.invoke(eq("Meeting with John Doe"),
231+
eq("2023-10-01"), eq("08:00AM"),
232+
eq("London"),
233+
eq("Discuss project updates")))
234+
.thenReturn("Drafted meeting invitation for John Doe");
235+
when(meetingInvitationDraft.outputName()).thenReturn("draft");
236+
237+
238+
final MeetingInvitationStyle meetingInvitationStyle = mock(MeetingInvitationStyle.class);
239+
when(meetingInvitationStyle.invoke(eq("Drafted meeting invitation for John Doe"), eq("formal")))
240+
.thenReturn("Styled meeting invitation for John Doe");
241+
when(meetingInvitationStyle.outputName()).thenReturn("styled");
242+
243+
AtomicReference<String> request = new AtomicReference<>();
244+
245+
HumanInTheLoop humanInTheLoop = AgentServices.humanInTheLoopBuilder()
246+
.description("What level of formality would you like? (please reply with “formal”, “casual”, or “friendly”)")
247+
.inputName("style")
248+
.outputName("style")
249+
.requestWriter(q -> request.set("What level of formality would you like? (please reply with “formal”, “casual”, or “friendly”)"))
250+
.responseReader(() -> "formal")
251+
.build();
252+
253+
Workflow workflow =
254+
AgentWorkflowBuilder.workflow("meetingInvitationFlow")
255+
.tasks(
256+
d ->
257+
d.sequence("draft", meetingInvitationDraft, humanInTheLoop, meetingInvitationStyle)
258+
).build();
259+
Map<String, String> initialValues = new HashMap<>();
260+
initialValues.put("title", "Meeting with John Doe");
261+
initialValues.put("date", "2023-10-01");
262+
initialValues.put("time", "08:00AM");
263+
initialValues.put("location", "London");
264+
initialValues.put("agenda", "Discuss project updates");
265+
266+
try (WorkflowApplication app = WorkflowApplication.builder().build()) {
267+
String result =
268+
app.workflowDefinition(workflow).instance(initialValues).start().get().asText().orElseThrow();
269+
270+
assertEquals("Styled meeting invitation for John Doe", result);
271+
}
272+
273+
274+
}
223275
}

0 commit comments

Comments
 (0)