diff --git a/README.md b/README.md
index 0b366a1..0edda48 100644
--- a/README.md
+++ b/README.md
@@ -167,6 +167,8 @@ The agentic flow is started with an AgentContext and an initial agent.
Example:
final var context = new AgentContext(List.of(new Agent1(), new Agent2()));
+ // Passing an explicit agent list is optional. If you omit the list, the framework will autowire all Agent beans from the Spring context:
+ // final var context = new AgentContext();
context.getContext().setStringValue("key", "Payload here");
context.getContext().setStringValues("key2", List.of("All context keys", "support collections", "for aggregation purposes"));
context.getContext().setValue("key3", new RandomDatatype());
diff --git a/pom.xml b/pom.xml
index 556fbe6..025a6e9 100755
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
lm-lib
de.extio
lm-lib
- 1.6.9
+ 1.6.10
21
diff --git a/src/main/java/de/extio/lmlib/agent/AgentContext.java b/src/main/java/de/extio/lmlib/agent/AgentContext.java
index b626255..883b51c 100755
--- a/src/main/java/de/extio/lmlib/agent/AgentContext.java
+++ b/src/main/java/de/extio/lmlib/agent/AgentContext.java
@@ -3,6 +3,7 @@ package de.extio.lmlib.agent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -41,6 +42,12 @@ public final class AgentContext {
private Consumer agentContextUpdateConsumer;
+ public AgentContext() {
+ this.agents = new HashMap<>();
+ this.context = new ConcurrentHashMap<>();
+ this.requestStatistic = new AgentRequestStatistic();
+ }
+
public AgentContext(final Collection extends BaseAgent> agents) {
this.agents = agents.stream().collect(Collectors.toMap(BaseAgent::name, agent -> agent));
this.context = new ConcurrentHashMap<>();
diff --git a/src/main/java/de/extio/lmlib/agent/AgentExecutorService.java b/src/main/java/de/extio/lmlib/agent/AgentExecutorService.java
index df61819..e630ddf 100755
--- a/src/main/java/de/extio/lmlib/agent/AgentExecutorService.java
+++ b/src/main/java/de/extio/lmlib/agent/AgentExecutorService.java
@@ -3,6 +3,7 @@ package de.extio.lmlib.agent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -30,6 +31,9 @@ public class AgentExecutorService implements InitializingBean, DisposableBean {
@Autowired
private ClientService clientService;
+ @Autowired(required = false)
+ private List allAgents;
+
private ExecutorService branchExecutorService;
private ExecutorService agentExecutorService;
@@ -45,20 +49,21 @@ public class AgentExecutorService implements InitializingBean, DisposableBean {
this.branchExecutorService.close();
this.agentExecutorService.close();
}
-
+
public List walk(final String firstAgent, final AgentContext context) {
return this.walk(firstAgent, context, null);
}
-
+
public List walk(final String firstAgent, final AgentContext context, final Consumer agentContextUpdateConsumer) {
+ this.discoverAgents(context);
final var agent = context.getAgents().get(firstAgent);
if (agent == null) {
throw new IllegalArgumentException("Agent not found: " + firstAgent);
}
-
+
return this.walk(agent, context, agentContextUpdateConsumer);
}
-
+
public List walk(final BaseAgent agent, final AgentContext context) {
return this.walk(agent, context, null);
}
@@ -66,12 +71,14 @@ public class AgentExecutorService implements InitializingBean, DisposableBean {
public List walk(final BaseAgent agent, final AgentContext context, final Consumer agentContextUpdateConsumer) {
LOGGER.debug("Agent: {}", agent.name());
+ this.discoverAgents(context);
+
Client client = null;
if (agent.agentType(context) != AgentType.PROCESSING_ONLY) {
client = this.clientService.getClient(agent.modelCategory(context));
}
context.setAgentContextUpdateConsumer(agentContextUpdateConsumer);
-
+
final var branches = agent.execute(client, this.agentExecutorService, context);
final var responses = Collections.synchronizedList(new ArrayList());
@@ -80,7 +87,7 @@ public class AgentExecutorService implements InitializingBean, DisposableBean {
if (agentContextUpdateConsumer != null) {
agentContextUpdateConsumer.accept(branchContext);
}
-
+
if (!branchContext.isError() && branchContext.getNextAgent() != null) {
final var branchAgent = context.getAgents().get(branchContext.getNextAgent().name());
if (branchAgent == null) {
@@ -108,4 +115,14 @@ public class AgentExecutorService implements InitializingBean, DisposableBean {
return responses;
}
+ private void discoverAgents(final AgentContext context) {
+ if (context.getAgents().isEmpty() && this.allAgents != null) {
+ for (final var agent : this.allAgents) {
+ @SuppressWarnings("unchecked")
+ final var agentsMap = (Map) context.getAgents();
+ agentsMap.put(agent.name(), agent);
+ }
+ }
+ }
+
}