1. RunCode -> DebugError loop done; 2. modify default k for memory search

This commit is contained in:
yzlin 2023-08-01 12:16:38 +08:00
parent 6bf527d31e
commit 8abdca3057
10 changed files with 140 additions and 70 deletions

View file

@ -5,7 +5,9 @@
@Author : alexanderwu
@File : debug_error.py
"""
import re
from metagpt.actions.action import Action
from metagpt.utils.common import CodeParser
PROMPT_TEMPLATE = """
NOTICE
@ -21,7 +23,7 @@ Now you should start rewriting the code:
## file name of the code to rewrite: Write code with triple quoto. Do your best to implement THIS ONLY ONE FILE.
"""
class DebugError(Action):
def __init__(self, name, context=None, llm=None):
def __init__(self, name="DebugError", context=None, llm=None):
super().__init__(name, context, llm)
# async def run(self, code, error):
@ -31,8 +33,15 @@ class DebugError(Action):
# return fixed_code
async def run(self, context):
if "PASS" in context:
return "", "the original code works fine, no need to debug"
file_name = re.search("## File To Rewrite:\s*(.+\\.py)", context).group(1)
prompt = PROMPT_TEMPLATE.format(context=context)
rsp = await self._aask(prompt)
return rsp
code = CodeParser.parse_code(block="", text=rsp)
return file_name, code

View file

@ -16,8 +16,25 @@ PROMPT_TEMPLATE = """
Role: You are a senior development and qa engineer, your role is summarize the code running result.
If the running result does not include an error, you should explicitly approve the result.
On the other hand, if the running result indicates some error, you should point out which part, the development code or the test code, produces the error,
and give specific instructions on fixing the errors.
and give specific instructions on fixing the errors. Here is the code info:
{context}
Now you should begin your analysis
---
## instruction:
Please summarize the cause of the errors and give correction instruction
## File To Rewrite:
Determine the ONE file to rewrite in order to fix the error, for example, xyz.py, or test_xyz.py
## Status:
Determine if all of the code works fine, if so write PASS, else FAIL,
WRITE ONLY ONE WORD, PASS OR FAIL, IN THI SECTION
## Send To:
Please write Engineer if the errors are due to problematic development codes, and QaEngineer to problematic test codes, and NoOne if there are no errors,
WRITE ONLY ONE WORD, Engineer OR QaEngineer OR NoOne, IN THIS SECTION.
---
You should fill in necessary instruction, status, send to, and finally return all content between the --- segment line.
"""
CONTEXT = """
## Development Code File Name
{code_file_name}
## Development Code
@ -35,18 +52,6 @@ and give specific instructions on fixing the errors.
## Running Output
standard output: {outs};
standard errors: {errs};
## instruction:
Please summarize the cause of the errors and give correction instruction
## File To Rewrite
Determine the ONE file to rewrite in order to fix the error, for example, xyz.py, or test_xyz.py
## Status:
Determine if all of the code works fine, if so write PASS, else FAIL,
WRITE ONLY ONE WORD, PASS OR FAIL, IN THI SECTION
## Send To:
Please write Engineer if the errors are due to problematic development codes, and QaEngineer to problematic test codes, and NoOne if there are no errors,
WRITE ONLY ONE WORD, Engineer OR QaEngineer OR NoOne, IN THIS SECTION.
---
You should fill in necessary summary, status, send to, and finally return all content between the --- segment line.
"""
class RunCode(Action):
@ -97,15 +102,20 @@ class RunCode(Action):
elif mode == "text":
outs, errs = await self.run_text(code=code)
logger.info(outs)
logger.info(errs)
prompt = PROMPT_TEMPLATE.format(
logger.info(f"{outs=}")
logger.info(f"{errs=}")
context = CONTEXT.format(
code=code, code_file_name=code_file_name,
test_code=test_code, test_file_name=test_file_name,
command=" ".join(command),
outs=outs, errs=errs
outs=outs[:500], # outs might be long but they are not important, truncate them to avoid token overflow
errs=errs
)
prompt = PROMPT_TEMPLATE.format(context=context)
rsp = await self._aask(prompt)
return rsp
result = context + rsp
return result

View file

@ -30,7 +30,7 @@ you should correctly import the necessary classes based on these file locations!
"""
class WriteTest(Action):
def __init__(self, name="", context=None, llm=None):
def __init__(self, name="WriteTest", context=None, llm=None):
super().__init__(name, context, llm)
async def write_code(self, prompt):