refine code

This commit is contained in:
geekan 2024-01-10 16:24:21 +08:00
parent 4df716bc6c
commit 2b3a4e06cc
6 changed files with 44 additions and 44 deletions

View file

@ -51,7 +51,7 @@ class DebugError(Action):
async def run(self, *args, **kwargs) -> str:
output_doc = await self.file_repo.get_file(
filename=self.context.output_filename, relative_path=TEST_OUTPUTS_FILE_REPO
filename=self.i_context.output_filename, relative_path=TEST_OUTPUTS_FILE_REPO
)
if not output_doc:
return ""
@ -61,14 +61,14 @@ class DebugError(Action):
if matches:
return ""
logger.info(f"Debug and rewrite {self.context.test_filename}")
logger.info(f"Debug and rewrite {self.i_context.test_filename}")
code_doc = await self.file_repo.get_file(
filename=self.context.code_filename, relative_path=self.context.src_workspace
filename=self.i_context.code_filename, relative_path=self.i_context.src_workspace
)
if not code_doc:
return ""
test_doc = await self.file_repo.get_file(
filename=self.context.test_filename, relative_path=TEST_CODES_FILE_REPO
filename=self.i_context.test_filename, relative_path=TEST_CODES_FILE_REPO
)
if not test_doc:
return ""

View file

@ -117,25 +117,25 @@ class RunCode(Action):
return stdout.decode("utf-8"), stderr.decode("utf-8")
async def run(self, *args, **kwargs) -> RunCodeResult:
logger.info(f"Running {' '.join(self.context.command)}")
if self.context.mode == "script":
logger.info(f"Running {' '.join(self.i_context.command)}")
if self.i_context.mode == "script":
outs, errs = await self.run_script(
command=self.context.command,
working_directory=self.context.working_directory,
additional_python_paths=self.context.additional_python_paths,
command=self.i_context.command,
working_directory=self.i_context.working_directory,
additional_python_paths=self.i_context.additional_python_paths,
)
elif self.context.mode == "text":
outs, errs = await self.run_text(code=self.context.code)
elif self.i_context.mode == "text":
outs, errs = await self.run_text(code=self.i_context.code)
logger.info(f"{outs=}")
logger.info(f"{errs=}")
context = CONTEXT.format(
code=self.context.code,
code_file_name=self.context.code_filename,
test_code=self.context.test_code,
test_file_name=self.context.test_filename,
command=" ".join(self.context.command),
code=self.i_context.code,
code_file_name=self.i_context.code_filename,
test_code=self.i_context.test_code,
test_file_name=self.i_context.test_filename,
command=" ".join(self.i_context.command),
outs=outs[:500], # outs might be long but they are not important, truncate them to avoid token overflow
errs=errs[:10000], # truncate errors to avoid token overflow
)

View file

@ -98,14 +98,14 @@ class SummarizeCode(Action):
return code_rsp
async def run(self):
design_pathname = Path(self.context.design_filename)
design_pathname = Path(self.i_context.design_filename)
repo = self.file_repo
design_doc = await repo.get_file(filename=design_pathname.name, relative_path=SYSTEM_DESIGN_FILE_REPO)
task_pathname = Path(self.context.task_filename)
task_pathname = Path(self.i_context.task_filename)
task_doc = await repo.get_file(filename=task_pathname.name, relative_path=TASK_FILE_REPO)
src_file_repo = self.git_repo.new_file_repository(relative_path=self.context.src_workspace)
code_blocks = []
for filename in self.context.codes_filenames:
for filename in self.i_context.codes_filenames:
code_doc = await src_file_repo.get(filename)
code_block = f"```python\n{code_doc.content}\n```\n-----"
code_blocks.append(code_block)

View file

@ -114,7 +114,7 @@ class WriteCode(Action):
else:
code_context = await self.get_codes(
coding_context.task_doc,
exclude=self.context.filename,
exclude=self.i_context.filename,
git_repo=self.git_repo,
src_workspace=self.context.src_workspace,
)
@ -125,14 +125,14 @@ class WriteCode(Action):
code=code_context,
logs=logs,
feedback=bug_feedback.content if bug_feedback else "",
filename=self.context.filename,
filename=self.i_context.filename,
summary_log=summary_doc.content if summary_doc else "",
)
logger.info(f"Writing {coding_context.filename}..")
code = await self.write_code(prompt)
if not coding_context.code_doc:
# avoid root_path pydantic ValidationError if use WriteCode alone
root_path = self.context.src_workspace if self.context.src_workspace else ""
root_path = self.i_context.src_workspace if self.i_context.src_workspace else ""
coding_context.code_doc = Document(filename=coding_context.filename, root_path=str(root_path))
coding_context.code_doc.content = code
return coding_context

View file

@ -135,20 +135,20 @@ class WriteCodeReview(Action):
return result, code
async def run(self, *args, **kwargs) -> CodingContext:
iterative_code = self.context.code_doc.content
iterative_code = self.i_context.code_doc.content
k = self.context.config.code_review_k_times or 1
for i in range(k):
format_example = FORMAT_EXAMPLE.format(filename=self.context.code_doc.filename)
task_content = self.context.task_doc.content if self.context.task_doc else ""
format_example = FORMAT_EXAMPLE.format(filename=self.i_context.code_doc.filename)
task_content = self.i_context.task_doc.content if self.i_context.task_doc else ""
code_context = await WriteCode.get_codes(
self.context.task_doc,
exclude=self.context.filename,
self.i_context.task_doc,
exclude=self.i_context.filename,
git_repo=self.context.git_repo,
src_workspace=self.src_workspace,
)
context = "\n".join(
[
"## System Design\n" + str(self.context.design_doc) + "\n",
"## System Design\n" + str(self.i_context.design_doc) + "\n",
"## Tasks\n" + task_content + "\n",
"## Code Files\n" + code_context + "\n",
]
@ -156,25 +156,25 @@ class WriteCodeReview(Action):
context_prompt = PROMPT_TEMPLATE.format(
context=context,
code=iterative_code,
filename=self.context.code_doc.filename,
filename=self.i_context.code_doc.filename,
)
cr_prompt = EXAMPLE_AND_INSTRUCTION.format(
format_example=format_example,
)
logger.info(
f"Code review and rewrite {self.context.code_doc.filename}: {i + 1}/{k} | {len(iterative_code)=}, "
f"{len(self.context.code_doc.content)=}"
f"Code review and rewrite {self.i_context.code_doc.filename}: {i + 1}/{k} | {len(iterative_code)=}, "
f"{len(self.i_context.code_doc.content)=}"
)
result, rewrited_code = await self.write_code_review_and_rewrite(
context_prompt, cr_prompt, self.context.code_doc.filename
context_prompt, cr_prompt, self.i_context.code_doc.filename
)
if "LBTM" in result:
iterative_code = rewrited_code
elif "LGTM" in result:
self.context.code_doc.content = iterative_code
return self.context
self.i_context.code_doc.content = iterative_code
return self.i_context
# code_rsp = await self._aask_v1(prompt, "code_rsp", OUTPUT_MAPPING)
# self._save(context, filename, code)
# 如果rewrited_code是None原code perfect那么直接返回code
self.context.code_doc.content = iterative_code
return self.context
self.i_context.code_doc.content = iterative_code
return self.i_context

View file

@ -55,16 +55,16 @@ class WriteTest(Action):
return code
async def run(self, *args, **kwargs) -> TestingContext:
if not self.context.test_doc:
self.context.test_doc = Document(
filename="test_" + self.context.code_doc.filename, root_path=TEST_CODES_FILE_REPO
if not self.i_context.test_doc:
self.i_context.test_doc = Document(
filename="test_" + self.i_context.code_doc.filename, root_path=TEST_CODES_FILE_REPO
)
fake_root = "/data"
prompt = PROMPT_TEMPLATE.format(
code_to_test=self.context.code_doc.content,
test_file_name=self.context.test_doc.filename,
source_file_path=fake_root + "/" + self.context.code_doc.root_relative_path,
code_to_test=self.i_context.code_doc.content,
test_file_name=self.i_context.test_doc.filename,
source_file_path=fake_root + "/" + self.i_context.code_doc.root_relative_path,
workspace=fake_root,
)
self.context.test_doc.content = await self.write_code(prompt)
return self.context
self.i_context.test_doc.content = await self.write_code(prompt)
return self.i_context