From e3e2767b0a0c3c534eba33df63f5e0061025357c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Ho=CC=88nicke?= Date: Sat, 27 May 2023 00:00:14 +0200 Subject: [PATCH] =?UTF-8?q?=E2=8F=AA=20fix:=20self=20healing=20response=20?= =?UTF-8?q?parser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../options/generate/chains/fix_based_on_error.py | 14 +++----------- dev_gpt/options/generate/generator.py | 7 +++---- dev_gpt/options/generate/parser.py | 4 ++-- dev_gpt/options/generate/templates_user.py | 4 ++-- test/unit/test_response_parsing.py | 1 - 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/dev_gpt/options/generate/chains/fix_based_on_error.py b/dev_gpt/options/generate/chains/fix_based_on_error.py index 249680a..e8de899 100644 --- a/dev_gpt/options/generate/chains/fix_based_on_error.py +++ b/dev_gpt/options/generate/chains/fix_based_on_error.py @@ -28,19 +28,11 @@ Your task: You must return the fixed {content_type}. Most importantly, you are not allowed to return something else - only the fixed {content_type}. -Positive example: -**solution.json** -```json -{ +Example: +{{ "key1": "value1", "key2": "value2" -} -Negative example: -{ - "key1": "value1", - "key2": "value2" -} -''' +}}''' diff --git a/dev_gpt/options/generate/generator.py b/dev_gpt/options/generate/generator.py index 1ccee63..3a9c899 100644 --- a/dev_gpt/options/generate/generator.py +++ b/dev_gpt/options/generate/generator.py @@ -440,10 +440,11 @@ pytest self.previous_solutions.append(suggested_solution) def generate_solution_suggestion(self, summarized_error, all_files_string): - json_string = self.generate_and_persist_file( + suggested_solutions = self.generate_and_persist_file( section_title='Suggest solution for code issue', template=template_suggest_solutions_code_issue, - file_name_s=['solutions.json'], + file_name_s=['not_needed'], + parse_result_fn=self_healing_json_parser, summarized_error=summarized_error, task_description=self.microservice_specification.task, test_description=self.microservice_specification.test, @@ -451,8 +452,6 @@ pytest response_format_example=response_format_suggest_solutions, ) - suggested_solutions = self_healing_json_parser(json_string)['solutions.json'] - if len(self.previous_errors) > 0: was_error_seen_before = json.loads( self.generate_and_persist_file( diff --git a/dev_gpt/options/generate/parser.py b/dev_gpt/options/generate/parser.py index b9ce890..bc40dc0 100644 --- a/dev_gpt/options/generate/parser.py +++ b/dev_gpt/options/generate/parser.py @@ -18,8 +18,8 @@ def boolean_parser(x): def json_parser(x): if '```' in x: - pattern = r'```(json)?(.+)```' - x = re.findall(pattern, x, re.DOTALL)[-1][-1] + pattern = r'([\[\{].+[\]\}])' + x = re.findall(pattern, x, re.DOTALL)[-1] return json.loads(x) def self_healing_json_parser(original_json_string): diff --git a/dev_gpt/options/generate/templates_user.py b/dev_gpt/options/generate/templates_user.py index 786f33e..e72dacc 100644 --- a/dev_gpt/options/generate/templates_user.py +++ b/dev_gpt/options/generate/templates_user.py @@ -332,7 +332,7 @@ Note: the first line you output must be: **apt-get-packages.json** ) -response_format_suggest_solutions = '''**solutions.json** +response_format_suggest_solutions = '''\ ```json {{ "1": "", @@ -369,7 +369,7 @@ Note that any changes needed to make the test pass must be written under the con After thinking about the possible solutions, output them as JSON ranked from best to worst. You must use the following format: ''' + response_format_suggest_solutions + ''' -Ensure the response starts with **solutions.json** and can be parsed by Python json.loads''' +Ensure the response can be parsed by Python json.loads''' ) diff --git a/test/unit/test_response_parsing.py b/test/unit/test_response_parsing.py index 33d4102..9596ec4 100644 --- a/test/unit/test_response_parsing.py +++ b/test/unit/test_response_parsing.py @@ -52,7 +52,6 @@ def test_self_healing_json_parser(tmpdir): os.environ['VERBOSE'] = 'true' GPTSession(os.path.join(str(tmpdir), 'log.json'), model='gpt-3.5-turbo') json_response = '''\ -solutions.json ```json { "1": "Change line 7 of microservice.py to 'pdf_file = input_dict['pdf_file'].encode('latin-1')' to convert the bytes object to a string before passing it to PyPDF2.",