import re # Some models occasionally leave literal backslash-u escape sequences un-decoded inside # tool-call argument strings (a known JSON-generation quirk) — e.g. the string ends up # containing the six characters ü instead of the character ü. json.loads() alone # doesn't catch this because the escaping happened *inside* an already-valid JSON string, # not at the JSON structural level. _DOUBLE_ESCAPED_UNICODE_RE = re.compile(r"\\u([0-9a-fA-F]{4})") def _fix_string(text: str) -> str: if "\\u" not in text: return text return _DOUBLE_ESCAPED_UNICODE_RE.sub(lambda m: chr(int(m.group(1), 16)), text) def fix_double_escaped_unicode(value): """Recursively repair double-escaped unicode in a parsed JSON value (dict/list/str).""" if isinstance(value, str): return _fix_string(value) if isinstance(value, list): return [fix_double_escaped_unicode(v) for v in value] if isinstance(value, dict): return {k: fix_double_escaped_unicode(v) for k, v in value.items()} return value