mangiucugna / json_repair

A python module to repair invalid JSON, commonly used to parse the output of LLMs
https://pypi.org/project/json-repair/
MIT License
826 stars 48 forks source link

[Bug]: Maximum recursion depth reached when parsing very long incompatible strings (2972 chars) #54

Closed eleanorRumsey closed 4 months ago

eleanorRumsey commented 4 months ago

Version of the library

0.25.0

Describe the bug

Hi! Really appreciate this library :)

Somehow it's happened a few times recently that output from an LLM results in a RecursionError: maximum recursion depth exceeded when passed into repair_json. Unfortunately I don't have the specific output for those cases, but I've been able to reproduce one case.

How to reproduce

An input to repair_json() where there are at least 2972 sequential characters that don't contain valid JSON (for instance a paragraph of text) will result in this error.

Examples:

repair_json("a" * 2972)
repair_json('{"key": "value"}' + ("a" * 2972))
repair_json(("a" * 2972) + '{"key": "value"}' + ("b" * 2972))
 paragraph = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tincidunt laoreet lorem, ac posuere sapien luctus ut. Etiam volutpat vehicula dolor sit amet aliquet. Maecenas id maximus velit. Phasellus velit justo, consequat et tristique ac, tincidunt sed ligula. Cras ut auctor enim. Ut interdum euismod risus id posuere. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum cursus felis massa, id faucibus nisl commodo vitae. Maecenas ex ipsum, consequat a eleifend sed, lacinia id nibh. Pellentesque semper ultrices nunc sit amet tincidunt. Integer pulvinar mi magna, a ultrices sem euismod vitae. Nullam odio turpis, suscipit eget viverra a, rutrum nec tellus.

Curabitur vitae tincidunt lorem, id tincidunt massa. Nam mi massa, accumsan sit amet tellus in, venenatis facilisis est. Sed eu risus fermentum, varius nulla ac, ullamcorper lacus. Nulla facilisi. Praesent a ex nunc. Integer iaculis elit vitae libero pretium elementum. Nullam eu leo vitae neque ullamcorper fermentum a sed tellus. Ut sollicitudin, nibh a faucibus suscipit, enim dolor sodales ante, a accumsan neque diam a justo. Mauris vel orci vitae tellus iaculis dictum id in magna. Duis auctor id dui eget iaculis. Sed quis massa commodo, aliquet tellus quis, tristique nisl.

In luctus tempus quam tempus vulputate. Maecenas laoreet arcu diam, sed bibendum sapien egestas vitae. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Phasellus laoreet ipsum non ante cursus imperdiet. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean laoreet accumsan mollis. Proin feugiat, lacus non congue tincidunt, erat arcu tincidunt metus, eget dignissim ante quam ut diam. Vivamus luctus aliquam placerat. Fusce risus ante, porta ac molestie at, laoreet et odio. Sed quis facilisis magna. Vestibulum sagittis nunc tellus, iaculis ultricies est cursus vitae. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Duis posuere venenatis posuere. Sed a gravida est, sit amet condimentum massa.

Morbi efficitur aliquam dui a imperdiet. Duis lacus enim, interdum a orci nec, varius porttitor est. Donec vel mi eu mauris sagittis hendrerit sed quis nunc. Vestibulum tortor leo, pulvinar in dignissim ut, ultricies sit amet est. Morbi et viverra magna, eu lacinia nisl. Cras vitae tincidunt dui, vel lobortis velit. Suspendisse tristique imperdiet odio, ac sodales velit pulvinar at. Sed diam enim, imperdiet sit amet mi sollicitudin, rutrum condimentum leo. In id est quis diam pellentesque pharetra sit amet eget tortor.

Etiam vehicula massa quam, sit amet consequat tellus tincidunt vitae. Nam semper ex ut hendrerit pretium. Nam eleifend tincidunt lectus, ut consectetur orci mattis id. Mauris eu sapien id turpis ullamcorper facilisis vitae nec mi. Ut metus augue, mollis nec faucibus sed, malesuada quis ipsum. Vivamus sit amet odio orci. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec posuere lectus risus, pharetra vestibulum turpis vulputate a. Nunc quis felis ullamcorper, blandit purus sit amet, ultricies nibh. Nam vitae sem imperdiet, posuere ex nec, rutrum metus. Aliquam congue magna id ultrices hendrerit.
"""

repair_json(paragraph)

Expected behavior

It would be fine for my use case to just return an empty string or None if this error is caught, or a certain recursion depth is reached.