1
1
import json
2
2
from functools import partial
3
3
4
+ from json_repair import repair_json
5
+
4
6
from patchwork .common .client .llm .utils import example_json_to_schema
5
7
from patchwork .common .utils .utils import RetryData , exclude_none_dict , retry
6
8
from patchwork .logger import logger
13
15
from patchwork .steps .SimplifiedLLM .typed import SimplifiedLLMInputs
14
16
15
17
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
-
23
18
class SimplifiedLLM (Step ):
24
19
def __init__ (self , inputs ):
25
20
super ().__init__ (inputs )
@@ -40,6 +35,20 @@ def __record_status_or_raise(self, retry_data: RetryData, step: Step):
40
35
else :
41
36
raise ValueError (step .status_message )
42
37
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 } \n Error: \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 } \n Error: \n { e } " )
50
+ raise e
51
+
43
52
def __retry_unit (self , prepare_prompt_outputs , call_llm_inputs , retry_data : RetryData ):
44
53
call_llm = CallLLM (call_llm_inputs )
45
54
call_llm_outputs = call_llm .run ()
@@ -49,7 +58,7 @@ def __retry_unit(self, prepare_prompt_outputs, call_llm_inputs, retry_data: Retr
49
58
json_responses = []
50
59
for response in call_llm_outputs .get ("openai_responses" ):
51
60
try :
52
- json_response = json . loads (response , strict = False )
61
+ json_response = self . __json_loads (response )
53
62
json_responses .append (json_response )
54
63
except json .JSONDecodeError as e :
55
64
logger .error (f"Json to decode: \n { response } \n Error: \n { e } " )
0 commit comments