Skip to content

Commit cc015f6

Browse files
authored
Auto fix json output from LLMs (patched-codes#1000)
* Autofix fix malformed json output from llm models * bump version * update lockfile and lint * fix weird dependency issue
1 parent ef4fef5 commit cc015f6

File tree

4 files changed

+641
-594
lines changed

4 files changed

+641
-594
lines changed

patchwork/steps/PR/PR.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ def __handle_modified_code_files(self):
1616
if self.inputs.get("modified_code_files") is not None:
1717
return
1818

19+
self.inputs["modified_code_files"] = []
20+
1921
input_modified_files = self.inputs.get("modified_files")
2022
if input_modified_files is None or len(input_modified_files) < 1:
2123
return

patchwork/steps/SimplifiedLLM/SimplifiedLLM.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import json
22
from functools import partial
33

4+
from json_repair import repair_json
5+
46
from patchwork.common.client.llm.utils import example_json_to_schema
57
from patchwork.common.utils.utils import RetryData, exclude_none_dict, retry
68
from patchwork.logger import logger
@@ -13,13 +15,6 @@
1315
from patchwork.steps.SimplifiedLLM.typed import SimplifiedLLMInputs
1416

1517

16-
def json_loads(s: str) -> dict:
17-
try:
18-
return json.loads(s, strict=False)
19-
except json.JSONDecodeError:
20-
return dict()
21-
22-
2318
class SimplifiedLLM(Step):
2419
def __init__(self, inputs):
2520
super().__init__(inputs)
@@ -40,6 +35,20 @@ def __record_status_or_raise(self, retry_data: RetryData, step: Step):
4035
else:
4136
raise ValueError(step.status_message)
4237

38+
@staticmethod
39+
def __json_loads(json_str: str) -> dict:
40+
try:
41+
return json.loads(json_str, strict=False)
42+
except json.JSONDecodeError as e:
43+
logger.debug(f"Json to decode: \n{json_str}\nError: \n{e}")
44+
45+
try:
46+
json_str = repair_json(json_str, skip_json_loads=True)
47+
return json.loads(json_str, strict=False)
48+
except json.JSONDecodeError as e:
49+
logger.debug(f"Json to decode: \n{json_str}\nError: \n{e}")
50+
raise e
51+
4352
def __retry_unit(self, prepare_prompt_outputs, call_llm_inputs, retry_data: RetryData):
4453
call_llm = CallLLM(call_llm_inputs)
4554
call_llm_outputs = call_llm.run()
@@ -49,7 +58,7 @@ def __retry_unit(self, prepare_prompt_outputs, call_llm_inputs, retry_data: Retr
4958
json_responses = []
5059
for response in call_llm_outputs.get("openai_responses"):
5160
try:
52-
json_response = json.loads(response, strict=False)
61+
json_response = self.__json_loads(response)
5362
json_responses.append(json_response)
5463
except json.JSONDecodeError as e:
5564
logger.error(f"Json to decode: \n{response}\nError: \n{e}")

0 commit comments

Comments
 (0)