aider/aider/coders/single_wholefile_func_coder.py
2024-08-15 12:35:53 -07:00

102 lines
2.9 KiB
Python

from aider import diffs
from ..dump import dump # noqa: F401
from .base_coder import Coder
from .single_wholefile_func_prompts import SingleWholeFileFunctionPrompts
class SingleWholeFileFunctionCoder(Coder):
edit_format = "func"
functions = [
dict(
name="write_file",
description="write new content into the file",
# strict=True,
parameters=dict(
type="object",
properties=dict(
explanation=dict(
type="string",
description=(
"Step by step plan for the changes to be made to the code (future"
" tense, markdown format)"
),
),
content=dict(
type="string",
description="Content to write to the file",
),
),
required=["explanation", "content"],
additionalProperties=False,
),
),
]
def __init__(self, *args, **kwargs):
self.gpt_prompts = SingleWholeFileFunctionPrompts()
super().__init__(*args, **kwargs)
def update_cur_messages(self, edited):
if edited:
self.cur_messages += [
dict(role="assistant", content=self.gpt_prompts.redacted_edit_message)
]
else:
self.cur_messages += [dict(role="assistant", content=self.partial_response_content)]
def render_incremental_response(self, final=False):
res = ""
if self.partial_response_content:
res += self.partial_response_content
args = self.parse_partial_args()
if not args:
return ""
for k, v in args.items():
res += "\n"
res += f"{k}:\n"
res += v
return res
def live_diffs(self, fname, content, final):
lines = content.splitlines(keepends=True)
# ending an existing block
full_path = self.abs_root_path(fname)
content = self.io.read_text(full_path)
if content is None:
orig_lines = []
else:
orig_lines = content.splitlines()
show_diff = diffs.diff_partial_update(
orig_lines,
lines,
final,
fname=fname,
).splitlines()
return "\n".join(show_diff)
def get_edits(self):
chat_files = self.get_inchat_relative_files()
assert len(chat_files) == 1, chat_files
args = self.parse_partial_args()
if not args:
return []
res = chat_files[0], args["content"]
dump(res)
return [res]
def apply_edits(self, edits):
for path, content in edits:
full_path = self.abs_root_path(path)
self.io.write_text(full_path, content)