diff --git a/experimental/fluent/agentic/src/main/java/io/serverlessworkflow/fluent/agentic/AgentWorkflowBuilder.java b/experimental/fluent/agentic/src/main/java/io/serverlessworkflow/fluent/agentic/AgentWorkflowBuilder.java index d09af6da..5472904f 100644 --- a/experimental/fluent/agentic/src/main/java/io/serverlessworkflow/fluent/agentic/AgentWorkflowBuilder.java +++ b/experimental/fluent/agentic/src/main/java/io/serverlessworkflow/fluent/agentic/AgentWorkflowBuilder.java @@ -16,8 +16,13 @@ package io.serverlessworkflow.fluent.agentic; import dev.langchain4j.agentic.scope.AgenticScope; +import io.serverlessworkflow.api.types.TaskItem; +import io.serverlessworkflow.api.types.Workflow; import io.serverlessworkflow.fluent.func.spi.FuncTransformations; import io.serverlessworkflow.fluent.spec.BaseWorkflowBuilder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.UUID; import java.util.function.Predicate; @@ -25,8 +30,11 @@ public class AgentWorkflowBuilder extends BaseWorkflowBuilder implements FuncTransformations { + private final List agentDoTaskBuilders; + AgentWorkflowBuilder(final String name, final String namespace, final String version) { super(name, namespace, version); + agentDoTaskBuilders = new ArrayList<>(); } public static AgentWorkflowBuilder workflow() { @@ -49,7 +57,7 @@ public AgentWorkflowBuilder agent(Object agent) { public AgentWorkflowBuilder agent(String name, Object agent) { final AgentDoTaskBuilder doTaskBuilder = this.newDo(); doTaskBuilder.agent(name, agent); - this.workflow.setDo(doTaskBuilder.build().getDo()); + agentDoTaskBuilders.add(doTaskBuilder); return this; } @@ -60,7 +68,7 @@ public AgentWorkflowBuilder sequence(Object... agents) { public AgentWorkflowBuilder sequence(String name, Object... agents) { final AgentDoTaskBuilder doTaskBuilder = this.newDo(); doTaskBuilder.sequence(name, agents); - this.workflow.setDo(doTaskBuilder.build().getDo()); + agentDoTaskBuilders.add(doTaskBuilder); return this; } @@ -71,7 +79,7 @@ public AgentWorkflowBuilder parallel(Object... agents) { public AgentWorkflowBuilder parallel(String name, Object... agents) { final AgentDoTaskBuilder doTaskBuilder = this.newDo(); doTaskBuilder.parallel(name, agents); - this.workflow.setDo(doTaskBuilder.build().getDo()); + agentDoTaskBuilders.add(doTaskBuilder); return this; } @@ -83,7 +91,7 @@ public AgentWorkflowBuilder loop( String name, Predicate exitCondition, Object... agents) { final AgentDoTaskBuilder doTaskBuilder = this.newDo(); doTaskBuilder.loop(name, loop -> loop.subAgents(agents).exitCondition(exitCondition)); - this.workflow.setDo(doTaskBuilder.build().getDo()); + agentDoTaskBuilders.add(doTaskBuilder); return this; } @@ -96,4 +104,15 @@ protected AgentDoTaskBuilder newDo() { protected AgentWorkflowBuilder self() { return this; } + + @Override + public Workflow build() { + List items = new ArrayList<>(workflow.getDo()); + this.agentDoTaskBuilders.stream() + .map(AgentDoTaskBuilder::build) + .forEach(b -> items.addAll(b.getDo())); + this.workflow.setDo(Collections.unmodifiableList(items)); + this.agentDoTaskBuilders.clear(); + return this.workflow; + } } diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseWorkflowBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseWorkflowBuilder.java index c3127a30..993f325f 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseWorkflowBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseWorkflowBuilder.java @@ -19,8 +19,12 @@ import io.serverlessworkflow.api.types.Export; import io.serverlessworkflow.api.types.Input; import io.serverlessworkflow.api.types.Output; +import io.serverlessworkflow.api.types.TaskItem; import io.serverlessworkflow.api.types.Workflow; import io.serverlessworkflow.fluent.spec.spi.TransformationHandlers; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.UUID; import java.util.function.Consumer; @@ -90,7 +94,9 @@ public SELF tasks(Consumer doTaskConsumer) { if (this.workflow.getDo() == null) { this.workflow.setDo(doTaskBuilder.build().getDo()); } else { - this.workflow.getDo().addAll(doTaskBuilder.build().getDo()); + List existingTasks = new ArrayList<>(this.workflow.getDo()); + existingTasks.addAll(doTaskBuilder.build().getDo()); + this.workflow.setDo(Collections.unmodifiableList(existingTasks)); } return self(); }