From 47b63dcb40f371c6c808bc9d7ea32b301482c84f Mon Sep 17 00:00:00 2001 From: extio-de Date: Sun, 14 Sep 2025 11:29:48 +0200 Subject: [PATCH] chore: Bump version to 1.6.10 and enhance AgentContext and AgentExecutorService with optional agent list handling --- README.md | 2 ++ pom.xml | 2 +- .../de/extio/lmlib/agent/AgentContext.java | 7 +++++ .../lmlib/agent/AgentExecutorService.java | 29 +++++++++++++++---- 4 files changed, 33 insertions(+), 7 deletions(-) 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 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); + } + } + } + }