mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-29 16:54:59 +00:00
102 lines
2.9 KiB
Python
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)
|