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."));