|
@@ -35,6 +35,10 @@ class JSONReplaceTool(BuiltinTool):
|
|
|
if not replace_model:
|
|
|
return self.create_text_message('Invalid parameter replace_model')
|
|
|
|
|
|
+ # get value decode.
|
|
|
+ # if true, it will be decoded to an dict
|
|
|
+ value_decode = tool_parameters.get('value_decode', False)
|
|
|
+
|
|
|
ensure_ascii = tool_parameters.get('ensure_ascii', True)
|
|
|
try:
|
|
|
if replace_model == 'pattern':
|
|
@@ -42,17 +46,17 @@ class JSONReplaceTool(BuiltinTool):
|
|
|
replace_pattern = tool_parameters.get('replace_pattern', '')
|
|
|
if not replace_pattern:
|
|
|
return self.create_text_message('Invalid parameter replace_pattern')
|
|
|
- result = self._replace_pattern(content, query, replace_pattern, replace_value, ensure_ascii)
|
|
|
+ result = self._replace_pattern(content, query, replace_pattern, replace_value, ensure_ascii, value_decode)
|
|
|
elif replace_model == 'key':
|
|
|
result = self._replace_key(content, query, replace_value, ensure_ascii)
|
|
|
elif replace_model == 'value':
|
|
|
- result = self._replace_value(content, query, replace_value, ensure_ascii)
|
|
|
+ result = self._replace_value(content, query, replace_value, ensure_ascii, value_decode)
|
|
|
return self.create_text_message(str(result))
|
|
|
except Exception:
|
|
|
return self.create_text_message('Failed to replace JSON content')
|
|
|
|
|
|
# Replace pattern
|
|
|
- def _replace_pattern(self, content: str, query: str, replace_pattern: str, replace_value: str, ensure_ascii: bool) -> str:
|
|
|
+ def _replace_pattern(self, content: str, query: str, replace_pattern: str, replace_value: str, ensure_ascii: bool, value_decode: bool) -> str:
|
|
|
try:
|
|
|
input_data = json.loads(content)
|
|
|
expr = parse(query)
|
|
@@ -61,6 +65,12 @@ class JSONReplaceTool(BuiltinTool):
|
|
|
|
|
|
for match in matches:
|
|
|
new_value = match.value.replace(replace_pattern, replace_value)
|
|
|
+ if value_decode is True:
|
|
|
+ try:
|
|
|
+ new_value = json.loads(new_value)
|
|
|
+ except json.JSONDecodeError:
|
|
|
+ return "Cannot decode replace value to json object"
|
|
|
+
|
|
|
match.full_path.update(input_data, new_value)
|
|
|
|
|
|
return json.dumps(input_data, ensure_ascii=ensure_ascii)
|
|
@@ -92,10 +102,15 @@ class JSONReplaceTool(BuiltinTool):
|
|
|
return str(e)
|
|
|
|
|
|
# Replace value
|
|
|
- def _replace_value(self, content: str, query: str, replace_value: str, ensure_ascii: bool) -> str:
|
|
|
+ def _replace_value(self, content: str, query: str, replace_value: str, ensure_ascii: bool, value_decode: bool) -> str:
|
|
|
try:
|
|
|
input_data = json.loads(content)
|
|
|
expr = parse(query)
|
|
|
+ if value_decode is True:
|
|
|
+ try:
|
|
|
+ replace_value = json.loads(replace_value)
|
|
|
+ except json.JSONDecodeError:
|
|
|
+ return "Cannot decode replace value to json object"
|
|
|
|
|
|
matches = expr.find(input_data)
|
|
|
|