diff --git a/pom.xml b/pom.xml
index 6f65991..90c2f58 100755
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
lm-lib
de.extio
lm-lib
- 1.9.2
+ 1.9.4
21
diff --git a/src/main/java/de/extio/lmlib/agent/responsehandler/CsvAgentResponseHandler.java b/src/main/java/de/extio/lmlib/agent/responsehandler/CsvAgentResponseHandler.java
index ec47ceb..1c33bec 100644
--- a/src/main/java/de/extio/lmlib/agent/responsehandler/CsvAgentResponseHandler.java
+++ b/src/main/java/de/extio/lmlib/agent/responsehandler/CsvAgentResponseHandler.java
@@ -1,11 +1,6 @@
package de.extio.lmlib.agent.responsehandler;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
@@ -20,68 +15,32 @@ public class CsvAgentResponseHandler implements AgentResponseHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(CsvAgentResponseHandler.class);
- private final Class> targetClass;
+ private final List headings;
- private final String contextKey;
+ private final String keyPrefix;
private final String fieldSeparator;
- private final String listSeparator;
-
- private final Field[] fields;
-
- private final List fieldNames;
-
- private final Constructor> constructor;
-
private final String fieldSeparatorQuoted;
- private final String listSeparatorQuoted;
-
private final String errorPromptSuffix;
- public CsvAgentResponseHandler(final Class> targetClass, final String contextKey) {
- this(targetClass, contextKey, ";", ",");
+ public CsvAgentResponseHandler(final List headings, final String keyPrefix) {
+ this(headings, keyPrefix, ";");
}
- public CsvAgentResponseHandler(final Class> targetClass, final String contextKey,
- final String fieldSeparator, final String listSeparator) {
- this.targetClass = targetClass;
- this.contextKey = contextKey;
+ public CsvAgentResponseHandler(final List headings, final String keyPrefix, final String fieldSeparator) {
+ if (headings == null || headings.isEmpty()) {
+ throw new IllegalArgumentException("Headings list cannot be null or empty");
+ }
+ this.headings = List.copyOf(headings);
+ this.keyPrefix = keyPrefix != null ? keyPrefix : "";
this.fieldSeparator = fieldSeparator;
- this.listSeparator = listSeparator;
-
- // Pre-compute static data
- this.fields = targetClass.getDeclaredFields();
- this.fieldNames = Arrays.stream(this.fields)
- .map(Field::getName)
- .toList();
- this.constructor = this.findRecordConstructor();
- if (this.constructor == null) {
- throw new IllegalStateException("No suitable constructor found for " + targetClass.getName());
- }
this.fieldSeparatorQuoted = Pattern.quote(fieldSeparator);
- this.listSeparatorQuoted = (listSeparator != null && !listSeparator.isEmpty())
- ? Pattern.quote(listSeparator)
- : null;
- // Pre-compute error message suffix
- final String listInfo = (listSeparator != null && !listSeparator.isEmpty())
- ? " and '" + listSeparator + "' for list items"
- : "";
this.errorPromptSuffix = "\n\nThe previous response could not be fully processed or validated. " +
- "Please format the response as CSV with '" + fieldSeparator + "' as field separator" +
- listInfo + ". One object per line.";
- }
-
- private Constructor> findRecordConstructor() {
- final Field[] targetFields = this.targetClass.getDeclaredFields();
- for (final Constructor> ctor : this.targetClass.getDeclaredConstructors()) {
- if (ctor.getParameterCount() == targetFields.length) {
- return ctor;
- }
- }
- return null;
+ "Please format the response as CSV with '" + fieldSeparator + "' as field separator. " +
+ "Expected columns: " + String.join(", ", headings) + ". One row per line.";
}
@Override
@@ -93,15 +52,13 @@ public class CsvAgentResponseHandler implements AgentResponseHandler {
}
try {
- final List