diff --git a/libs/langchain/langchain/output_parsers/json.py b/libs/langchain/langchain/output_parsers/json.py index f0f653eca2..7465aba2fe 100644 --- a/libs/langchain/langchain/output_parsers/json.py +++ b/libs/langchain/langchain/output_parsers/json.py @@ -13,7 +13,7 @@ def _replace_new_line(match: re.Match[str]) -> str: value = re.sub(r"\n", r"\\n", value) value = re.sub(r"\r", r"\\r", value) value = re.sub(r"\t", r"\\t", value) - value = re.sub('"', r"\"", value) + value = re.sub(r'(? None: "action": "Final Answer", "action_input": '```bar\n
\n\ttext\n
```', } + + +TEST_CASES_ESCAPED_QUOTES = [ + JSON_WITH_UNESCAPED_QUOTES_IN_NESTED_JSON, + JSON_WITH_ESCAPED_QUOTES_IN_NESTED_JSON, + JSON_WITH_ESCAPED_DOUBLE_QUOTES_IN_NESTED_JSON, +] + + +@pytest.mark.parametrize("json_string", TEST_CASES_ESCAPED_QUOTES) +def test_parse_nested_json_with_escaped_quotes(json_string: str) -> None: + parsed = parse_json_markdown(json_string) + assert parsed == { + "action": "Final Answer", + "action_input": '{"foo": "bar", "bar": "foo"}', + } + + +def test_parse_json_with_python_dict() -> None: + parsed = parse_json_markdown(JSON_WITH_PYTHON_DICT) + assert parsed == { + "action": "Final Answer", + "action_input": {"foo": "bar", "bar": "foo"}, + }