mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-25 06:44:59 +00:00
do_gpt_powered_replace
This commit is contained in:
parent
8e2ae1df30
commit
04382f0b2b
1 changed files with 61 additions and 17 deletions
78
coder.py
78
coder.py
|
@ -281,30 +281,83 @@ The ``` delimiters are very important!
|
||||||
def update_files(self, content):
|
def update_files(self, content):
|
||||||
for match in self.pattern.finditer(content):
|
for match in self.pattern.finditer(content):
|
||||||
path, original, updated = match.groups()
|
path, original, updated = match.groups()
|
||||||
self.do_replace(path, original, updated)
|
if self.do_replace(path, original, updated):
|
||||||
|
continue
|
||||||
|
edit = match.group()
|
||||||
|
self.do_gpt_powered_replace(path, edit)
|
||||||
|
|
||||||
def do_replace(self, fname, before, after):
|
def do_replace(self, fname, before_text, after_text):
|
||||||
fname = Path(fname)
|
fname = Path(fname)
|
||||||
content = fname.read_text().splitlines()
|
content = fname.read_text().splitlines()
|
||||||
before = [l.strip() for l in before.splitlines()]
|
before_lines = [l.strip() for l in before_text.splitlines()]
|
||||||
stripped_content = [l.strip() for l in content]
|
stripped_content = [l.strip() for l in content]
|
||||||
where = find_index(stripped_content, before)
|
where = find_index(stripped_content, before_lines)
|
||||||
|
|
||||||
if where < 0:
|
if where < 0:
|
||||||
raise ValueError(before)
|
return
|
||||||
|
|
||||||
new_content = content[:where]
|
new_content = content[:where]
|
||||||
new_content += after.splitlines()
|
new_content += after_text.splitlines()
|
||||||
new_content += content[where+len(before):]
|
new_content += content[where+len(before_lines):]
|
||||||
new_content = '\n'.join(new_content) + '\n'
|
new_content = '\n'.join(new_content) + '\n'
|
||||||
|
|
||||||
fname.write_text(new_content)
|
fname.write_text(new_content)
|
||||||
print('Applied CHANGE', fname)
|
print('Applied CHANGE', fname)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def do_gpt_powered_replace(self, fname, edit):
|
||||||
|
print(f'Could not find CURRENT block in {fname}, asking GPT to make the edit...')
|
||||||
|
fname = Path(fname)
|
||||||
|
content = fname.read_text()
|
||||||
|
prompt = f'''
|
||||||
|
Apply this change:
|
||||||
|
|
||||||
|
{edit}
|
||||||
|
|
||||||
|
To this file:
|
||||||
|
|
||||||
|
{fname}
|
||||||
|
```
|
||||||
|
{content}
|
||||||
|
```
|
||||||
|
'''
|
||||||
|
sys_prompt = '''
|
||||||
|
You are an expert code editor.
|
||||||
|
Perform the requested edit.
|
||||||
|
Output ONLY the new version of the file.
|
||||||
|
Do not output explanations!
|
||||||
|
Do not wrap the output in ``` delimiters.
|
||||||
|
Just the content of the file!
|
||||||
|
'''
|
||||||
|
|
||||||
|
messages = [
|
||||||
|
dict(role = 'system', content = sys_prompt),
|
||||||
|
dict(role = 'user', content = prompt),
|
||||||
|
]
|
||||||
|
res = self.send(messages)
|
||||||
|
|
||||||
|
fname.write_text(res)
|
||||||
|
|
||||||
|
|
||||||
|
def test_do_gpt_powered_replace(coder):
|
||||||
|
fname = Path('../easy-chat/index.html')
|
||||||
|
edit = '''
|
||||||
|
../easy-chat/index.html
|
||||||
|
<<<<<<< ORIGINAL
|
||||||
|
<p class="user"><span class="fa fa-volume-up" onclick="speak(this.parentNode)"></span><span>Hello!</span></p>
|
||||||
|
<p class="assistant"><span class="fa fa-volume-up" onclick="speak(this.parentNode)"></span><span>How</span> <span>can</span> <span>I</span> <span>help</span>
|
||||||
|
<span>you?</span></p>
|
||||||
|
=======
|
||||||
|
<p class="user"><span>Hello!</span><span class="fa fa-volume-up" onclick="speak(this.parentNode)"></span></p>
|
||||||
|
<p class="assistant"><span>How</span> <span>can</span> <span>I</span> <span>help</span><span>you?</span><span class="fa fa-volume-up" onclick="speak(this.parentNode)"></span></p>
|
||||||
|
>>>>>>> UPDATED
|
||||||
|
'''
|
||||||
|
coder.do_gpt_powered_replace(fname, edit)
|
||||||
|
|
||||||
coder = Coder()
|
coder = Coder()
|
||||||
|
#test_do_gpt_powered_replace(coder) ; sys.exit()
|
||||||
|
|
||||||
coder.system(prompt_webdev)
|
coder.system(prompt_webdev)
|
||||||
|
|
||||||
for fname in sys.argv[1:]:
|
for fname in sys.argv[1:]:
|
||||||
coder.add_file(fname)
|
coder.add_file(fname)
|
||||||
|
|
||||||
|
@ -312,15 +365,6 @@ for fname in sys.argv[1:]:
|
||||||
|
|
||||||
coder.run()
|
coder.run()
|
||||||
|
|
||||||
#dname = Path('../easy-chat')
|
|
||||||
#coder.file(dname / 'index.html')
|
|
||||||
#coder.file(dname / 'chat.css')
|
|
||||||
#coder.file(dname / 'chat.js')
|
|
||||||
|
|
||||||
#for fname in coder.fnames:
|
|
||||||
# print(coder.quoted_file(fname))
|
|
||||||
#sys.exit()
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Change all the speaker icons to orange.
|
Change all the speaker icons to orange.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue