Skip to content

Commit c55e49a

Browse files
committed
add escape output parameter
Signed-off-by: Hailong Cui <ihailong@amazon.com>
1 parent 281c430 commit c55e49a

File tree

5 files changed

+22
-6
lines changed

5 files changed

+22
-6
lines changed

common/src/main/java/org/opensearch/ml/common/utils/StringUtils.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,16 @@ public static boolean isJson(String json) {
129129
* prepareJsonValue("{\"key\":123}") → {\"key\":123} (valid JSON object, unchanged)
130130
* </pre>
131131
* @param input
132+
* @param escape
132133
* @return
133134
*/
134-
public static String prepareJsonValue(String input) {
135+
public static String prepareJsonValue(String input, boolean escape) {
135136
if (isJson(input)) {
136-
return input;
137+
if (!escape) {
138+
return input;
139+
} else {
140+
return escapeJson(input);
141+
}
137142
}
138143
return escapeJson(input);
139144
}

common/src/main/java/org/opensearch/ml/common/utils/ToolUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
public class ToolUtils {
3434

3535
public static final String TOOL_OUTPUT_FILTERS_FIELD = "output_filter";
36+
public static final String TOOL_OUTPUT_ESCAPED = "output_escaped";
3637
public static final String TOOL_REQUIRED_PARAMS = "required_parameters";
3738
public static final String NO_ESCAPE_PARAMS = "no_escape_params";
3839

common/src/test/java/org/opensearch/ml/common/utils/StringUtilsTest.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -857,14 +857,21 @@ public void testValidateFields_InvalidCharacterSet() {
857857
@Test
858858
public void prepareJsonValue_returnsRawIfJson() {
859859
String json = "{\"key\": 123}";
860-
String result = StringUtils.prepareJsonValue(json);
860+
String result = StringUtils.prepareJsonValue(json, false);
861861
assertSame(json, result); // branch where isJson(input)==true
862862
}
863863

864+
@Test
865+
public void prepareJsonValue_returnEscapeJsonIfForce() {
866+
String json = "{\"key\": 123}";
867+
String result = StringUtils.prepareJsonValue(json, true);
868+
assertEquals("{\\\"key\\\": 123}", result);
869+
}
870+
864871
@Test
865872
public void prepareJsonValue_escapesBadCharsOtherwise() {
866873
String input = "Tom & Jerry \"<script>";
867-
String escaped = StringUtils.prepareJsonValue(input);
874+
String escaped = StringUtils.prepareJsonValue(input, false);
868875
assertNotEquals(input, escaped);
869876
assertFalse(StringUtils.isJson(escaped));
870877
assertEquals("Tom & Jerry \\\"<script>", escaped);

ml-algorithms/src/main/java/org/opensearch/ml/engine/algorithms/agent/MLConversationalFlowAgentRunner.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static org.opensearch.ml.common.conversation.ActionConstants.AI_RESPONSE_FIELD;
1010
import static org.opensearch.ml.common.conversation.ActionConstants.MEMORY_ID;
1111
import static org.opensearch.ml.common.conversation.ActionConstants.PARENT_INTERACTION_ID_FIELD;
12+
import static org.opensearch.ml.common.utils.ToolUtils.TOOL_OUTPUT_ESCAPED;
1213
import static org.opensearch.ml.common.utils.ToolUtils.TOOL_OUTPUT_FILTERS_FIELD;
1314
import static org.opensearch.ml.common.utils.ToolUtils.filterToolOutput;
1415
import static org.opensearch.ml.common.utils.ToolUtils.getToolName;
@@ -262,7 +263,7 @@ private void processOutput(
262263
String outputKey = toolName + ".output";
263264
Map<String, String> toolParameters = ToolUtils.buildToolParameters(params, previousToolSpec, tenantId);
264265
String filteredOutput = parseResponse(filterToolOutput(toolParameters, output));
265-
params.put(outputKey, StringUtils.prepareJsonValue(filteredOutput));
266+
params.put(outputKey, StringUtils.prepareJsonValue(filteredOutput, Boolean.parseBoolean(toolParameters.getOrDefault(TOOL_OUTPUT_ESCAPED, "false"))));
266267
boolean traceDisabled = params.containsKey(DISABLE_TRACE) && Boolean.parseBoolean(params.get(DISABLE_TRACE));
267268

268269
if (previousToolSpec.isIncludeOutputInAgentResponse() || finalI == toolSpecs.size()) {

ml-algorithms/src/main/java/org/opensearch/ml/engine/algorithms/agent/MLFlowAgentRunner.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package org.opensearch.ml.engine.algorithms.agent;
77

8+
import static org.opensearch.ml.common.utils.ToolUtils.TOOL_OUTPUT_ESCAPED;
89
import static org.opensearch.ml.common.utils.ToolUtils.TOOL_OUTPUT_FILTERS_FIELD;
910
import static org.opensearch.ml.common.utils.ToolUtils.filterToolOutput;
1011
import static org.opensearch.ml.common.utils.ToolUtils.getToolName;
@@ -114,7 +115,8 @@ public void run(MLAgent mlAgent, Map<String, String> params, ActionListener<Obje
114115
String outputKey = toolName + ".output";
115116
Map<String, String> toolParameters = ToolUtils.buildToolParameters(params, previousToolSpec, mlAgent.getTenantId());
116117
String filteredOutput = parseResponse(filterToolOutput(toolParameters, output));
117-
params.put(outputKey, StringUtils.prepareJsonValue(filteredOutput));
118+
params.put(outputKey, StringUtils.prepareJsonValue(filteredOutput,
119+
Boolean.parseBoolean(toolParameters.getOrDefault(TOOL_OUTPUT_ESCAPED, "false"))));
118120
if (previousToolSpec.isIncludeOutputInAgentResponse() || finalI == toolSpecs.size()) {
119121
if (toolParameters.containsKey(TOOL_OUTPUT_FILTERS_FIELD)) {
120122
flowAgentOutput.add(ModelTensor.builder().name(outputKey).result(filteredOutput).build());

0 commit comments

Comments
 (0)