From 5c3c89b5803efa7f3af7bdee62caf0ed0405ce27 Mon Sep 17 00:00:00 2001 From: extio-de Date: Sat, 13 Sep 2025 19:47:30 +0200 Subject: [PATCH] chore: Bump version to 1.6.9 and enhance JsonAgentResponseHandler with prefixFields and array of objects support --- pom.xml | 2 +- .../JsonAgentResponseHandler.java | 52 +++++++++++++------ 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 68c2f03..556fbe6 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ lm-lib de.extio lm-lib - 1.6.8 + 1.6.9 21 diff --git a/src/main/java/de/extio/lmlib/agent/responsehandler/JsonAgentResponseHandler.java b/src/main/java/de/extio/lmlib/agent/responsehandler/JsonAgentResponseHandler.java index 6c9fb9e..2153c90 100755 --- a/src/main/java/de/extio/lmlib/agent/responsehandler/JsonAgentResponseHandler.java +++ b/src/main/java/de/extio/lmlib/agent/responsehandler/JsonAgentResponseHandler.java @@ -1,9 +1,11 @@ package de.extio.lmlib.agent.responsehandler; +import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedHashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,7 +25,15 @@ public class JsonAgentResponseHandler implements AgentResponseHandler { private final ObjectMapper objectMapper; + private final String prefixFields; + public JsonAgentResponseHandler() { + this(null); + } + + public JsonAgentResponseHandler(final String prefixFields) { + this.prefixFields = prefixFields == null ? "" : prefixFields; + this.objectMapper = new ObjectMapper(); this.objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false); this.objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false); @@ -59,30 +69,38 @@ public class JsonAgentResponseHandler implements AgentResponseHandler { return false; } - boolean hasResponse = false; - final Iterator> fields = jsonNode.fields(); + final var items = new LinkedHashMap>(); + final Iterator> fields = jsonNode.properties().iterator(); while (fields.hasNext()) { final var entry = fields.next(); if (entry.getValue().isArray()) { - final var items = new LinkedHashSet<>(); - entry.getValue().elements().forEachRemaining(item -> items.add(item.asText())); - context.getContext().put(entry.getKey(), List.copyOf(items)); - hasResponse = true; - LOGGER.debug("Response: {} {}", entry.getKey(), items); + entry.getValue().elements().forEachRemaining(nestedArray -> nestedArray.properties().forEach(nestedProperty -> this.parseProperty(items, nestedProperty))); } - else if (entry.getValue().isTextual() || entry.getValue().isNumber() || entry.getValue().isBoolean()) { - context.setStringValue(entry.getKey(), entry.getValue().asText()); - hasResponse = true; - LOGGER.debug("Response: {} {}", entry.getKey(), entry.getValue().asText()); + else { + this.parseProperty(items, entry); } } + LOGGER.debug("Response: {} {}", items.size(), items); + context.getContext().putAll(items); - if (!hasResponse) { - addJsonResponseErrorPrompt(context); - } - return hasResponse; + return true; } - + + private void parseProperty(final LinkedHashMap> items, final Entry nestedProperty) { + if (nestedProperty.getValue().isObject()) { + final var nestedValuesIter = nestedProperty.getValue().values(); + while (nestedValuesIter.hasNext()) { + final var v = nestedValuesIter.next(); + if (v.isTextual() || v.isNumber() || v.isBoolean()) { + items.computeIfAbsent(this.prefixFields + nestedProperty.getKey(), k -> new ArrayList<>()).add(v.asText()); + } + } + } + else { + items.computeIfAbsent(this.prefixFields + nestedProperty.getKey(), k -> new ArrayList<>()).add(nestedProperty.getValue().asText()); + } + } + private void addJsonResponseErrorPrompt(final AgentContext context) { final var turn = context.getConversation().getConversation().getLast(); context.getConversation().replaceTurn(new Conversation.Turn(turn.type(), turn.text() + "\n\nThe previous response could not be fully processed or validated. Please make sure to format the response in valid JSON syntax with properly escaped characters."));