chore: Bump version to 1.6.9 and enhance JsonAgentResponseHandler with prefixFields and array of objects support
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -4,7 +4,7 @@
|
|||||||
<artifactId>lm-lib</artifactId>
|
<artifactId>lm-lib</artifactId>
|
||||||
<groupId>de.extio</groupId>
|
<groupId>de.extio</groupId>
|
||||||
<name>lm-lib</name>
|
<name>lm-lib</name>
|
||||||
<version>1.6.8</version>
|
<version>1.6.9</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>21</java.version>
|
<java.version>21</java.version>
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
package de.extio.lmlib.agent.responsehandler;
|
package de.extio.lmlib.agent.responsehandler;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -23,7 +25,15 @@ public class JsonAgentResponseHandler implements AgentResponseHandler {
|
|||||||
|
|
||||||
private final ObjectMapper objectMapper;
|
private final ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
private final String prefixFields;
|
||||||
|
|
||||||
public JsonAgentResponseHandler() {
|
public JsonAgentResponseHandler() {
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonAgentResponseHandler(final String prefixFields) {
|
||||||
|
this.prefixFields = prefixFields == null ? "" : prefixFields;
|
||||||
|
|
||||||
this.objectMapper = new ObjectMapper();
|
this.objectMapper = new ObjectMapper();
|
||||||
this.objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
|
this.objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
|
||||||
this.objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
|
this.objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
|
||||||
@@ -59,30 +69,38 @@ public class JsonAgentResponseHandler implements AgentResponseHandler {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hasResponse = false;
|
final var items = new LinkedHashMap<String, List<String>>();
|
||||||
final Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields();
|
final Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.properties().iterator();
|
||||||
while (fields.hasNext()) {
|
while (fields.hasNext()) {
|
||||||
final var entry = fields.next();
|
final var entry = fields.next();
|
||||||
if (entry.getValue().isArray()) {
|
if (entry.getValue().isArray()) {
|
||||||
final var items = new LinkedHashSet<>();
|
entry.getValue().elements().forEachRemaining(nestedArray -> nestedArray.properties().forEach(nestedProperty -> this.parseProperty(items, nestedProperty)));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
else if (entry.getValue().isTextual() || entry.getValue().isNumber() || entry.getValue().isBoolean()) {
|
else {
|
||||||
context.setStringValue(entry.getKey(), entry.getValue().asText());
|
this.parseProperty(items, entry);
|
||||||
hasResponse = true;
|
|
||||||
LOGGER.debug("Response: {} {}", entry.getKey(), entry.getValue().asText());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LOGGER.debug("Response: {} {}", items.size(), items);
|
||||||
|
context.getContext().putAll(items);
|
||||||
|
|
||||||
if (!hasResponse) {
|
return true;
|
||||||
addJsonResponseErrorPrompt(context);
|
|
||||||
}
|
|
||||||
return hasResponse;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void parseProperty(final LinkedHashMap<String, List<String>> items, final Entry<String, JsonNode> 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) {
|
private void addJsonResponseErrorPrompt(final AgentContext context) {
|
||||||
final var turn = context.getConversation().getConversation().getLast();
|
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."));
|
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."));
|
||||||
|
|||||||
Reference in New Issue
Block a user