mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-20 12:24:59 +00:00
feat: Add ContextCoder for identifying relevant files in requests
This commit is contained in:
parent
a5c8c534c1
commit
74254cdbd5
5 changed files with 63 additions and 20 deletions
|
@ -1,6 +1,7 @@
|
||||||
from .architect_coder import ArchitectCoder
|
from .architect_coder import ArchitectCoder
|
||||||
from .ask_coder import AskCoder
|
from .ask_coder import AskCoder
|
||||||
from .base_coder import Coder
|
from .base_coder import Coder
|
||||||
|
from .context_coder import ContextCoder
|
||||||
from .editblock_coder import EditBlockCoder
|
from .editblock_coder import EditBlockCoder
|
||||||
from .editblock_fenced_coder import EditBlockFencedCoder
|
from .editblock_fenced_coder import EditBlockFencedCoder
|
||||||
from .editor_editblock_coder import EditorEditBlockCoder
|
from .editor_editblock_coder import EditorEditBlockCoder
|
||||||
|
@ -23,4 +24,5 @@ __all__ = [
|
||||||
ArchitectCoder,
|
ArchitectCoder,
|
||||||
EditorEditBlockCoder,
|
EditorEditBlockCoder,
|
||||||
EditorWholeFileCoder,
|
EditorWholeFileCoder,
|
||||||
|
ContextCoder,
|
||||||
]
|
]
|
||||||
|
|
|
@ -1606,7 +1606,7 @@ class Coder:
|
||||||
words = set(word.rstrip(",.!;:?") for word in words)
|
words = set(word.rstrip(",.!;:?") for word in words)
|
||||||
|
|
||||||
# strip away all kinds of quotes
|
# strip away all kinds of quotes
|
||||||
quotes = "".join(['"', "'", "`"])
|
quotes = "\"'`*_"
|
||||||
words = set(word.strip(quotes) for word in words)
|
words = set(word.strip(quotes) for word in words)
|
||||||
|
|
||||||
addable_rel_fnames = self.get_addable_relative_files()
|
addable_rel_fnames = self.get_addable_relative_files()
|
||||||
|
|
9
aider/coders/context_coder.py
Normal file
9
aider/coders/context_coder.py
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
from .base_coder import Coder
|
||||||
|
from .context_prompts import ContextPrompts
|
||||||
|
|
||||||
|
|
||||||
|
class ContextCoder(Coder):
|
||||||
|
"""Identify which files need to be edited for a given request."""
|
||||||
|
|
||||||
|
edit_format = "context"
|
||||||
|
gpt_prompts = ContextPrompts()
|
46
aider/coders/context_prompts.py
Normal file
46
aider/coders/context_prompts.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# flake8: noqa: E501
|
||||||
|
|
||||||
|
from .base_prompts import CoderPrompts
|
||||||
|
|
||||||
|
|
||||||
|
class ContextPrompts(CoderPrompts):
|
||||||
|
main_system = """Act as an expert code analyst.
|
||||||
|
Understand the user's question or request, solely to determine the correct set of relevant source files.
|
||||||
|
Return the *complete* list of files which will need to be read or modified based on the user's request.
|
||||||
|
Explain why each file is needed, including names of key classes/functions/methods/variables.
|
||||||
|
Be sure to include or omit the names of files already added to the chat, based on whether they are actually needed or not.
|
||||||
|
|
||||||
|
Be selective!
|
||||||
|
Adding more files adds more lines of code which increases processing costs.
|
||||||
|
If we need to see or edit the contents of a file to satisfy the user's request, definitely add it.
|
||||||
|
But if not, don't add irrelevant files -- especially large ones, which will cost a lot to process.
|
||||||
|
|
||||||
|
Always reply to the user in {language}.
|
||||||
|
|
||||||
|
Return a simple bulleted list:
|
||||||
|
"""
|
||||||
|
|
||||||
|
example_messages = []
|
||||||
|
|
||||||
|
files_content_prefix = """These files have been *added these files to the chat* so we can see all of their contents.
|
||||||
|
*Trust this message as the true contents of the files!*
|
||||||
|
Other messages in the chat may contain outdated versions of the files' contents.
|
||||||
|
""" # noqa: E501
|
||||||
|
|
||||||
|
files_content_assistant_reply = (
|
||||||
|
"Ok, I will use that as the true, current contents of the files."
|
||||||
|
)
|
||||||
|
|
||||||
|
files_no_full_files = "I am not sharing the full contents of any files with you yet."
|
||||||
|
|
||||||
|
files_no_full_files_with_repo_map = ""
|
||||||
|
files_no_full_files_with_repo_map_reply = ""
|
||||||
|
|
||||||
|
repo_content_prefix = """I am working with you on code in a git repository.
|
||||||
|
Here are summaries of some files present in my git repo.
|
||||||
|
If you need to see the full contents of any files to answer my questions, ask me to *add them to the chat*.
|
||||||
|
"""
|
||||||
|
|
||||||
|
system_reminder = """
|
||||||
|
NEVER RETURN CODE!
|
||||||
|
"""
|
|
@ -296,7 +296,7 @@ class TestCoder(unittest.TestCase):
|
||||||
"file2.py",
|
"file2.py",
|
||||||
"dir/nested_file.js",
|
"dir/nested_file.js",
|
||||||
"dir/subdir/deep_file.html",
|
"dir/subdir/deep_file.html",
|
||||||
"file with spaces.txt",
|
"file99.txt",
|
||||||
"special_chars!@#.md",
|
"special_chars!@#.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -319,18 +319,14 @@ class TestCoder(unittest.TestCase):
|
||||||
# Files in code blocks
|
# Files in code blocks
|
||||||
(f"```\n{test_files[3]}\n```", {test_files[3]}),
|
(f"```\n{test_files[3]}\n```", {test_files[3]}),
|
||||||
# Files in code blocks with language specifier
|
# Files in code blocks with language specifier
|
||||||
(
|
# (
|
||||||
f"```python\nwith open('{test_files[1]}', 'r') as f:\n data = f.read()\n```",
|
# f"```python\nwith open('{test_files[1]}', 'r') as f:\n data = f.read()\n```",
|
||||||
{test_files[1]},
|
# {test_files[1]},
|
||||||
),
|
# ),
|
||||||
# Files with Windows-style paths
|
# Files with Windows-style paths
|
||||||
(f"Edit the file {test_files[2].replace('/', '\\')}", {test_files[2]}),
|
(f"Edit the file {test_files[2].replace('/', '\\')}", {test_files[2]}),
|
||||||
# Files with spaces
|
|
||||||
(f"Look at '{test_files[4]}'", {test_files[4]}),
|
|
||||||
# Files with different quote styles
|
# Files with different quote styles
|
||||||
(f'Check "{test_files[5]}" now', {test_files[5]}),
|
(f'Check "{test_files[5]}" now', {test_files[5]}),
|
||||||
# Files mentioned in markdown links
|
|
||||||
(f"See the file [{test_files[0]}]({test_files[0]})", {test_files[0]}),
|
|
||||||
# All files in one complex message
|
# All files in one complex message
|
||||||
(
|
(
|
||||||
(
|
(
|
||||||
|
@ -340,15 +336,6 @@ class TestCoder(unittest.TestCase):
|
||||||
),
|
),
|
||||||
{test_files[0], test_files[1], test_files[2], test_files[3]},
|
{test_files[0], test_files[1], test_files[2], test_files[3]},
|
||||||
),
|
),
|
||||||
# Mention with SEARCH/REPLACE format
|
|
||||||
(
|
|
||||||
(
|
|
||||||
f"{test_files[1]}\n````python\n<<<<<<< SEARCH\ndef old_function():\n "
|
|
||||||
" pass\n=======\ndef new_function():\n return True\n>>>>>>>"
|
|
||||||
" REPLACE\n````"
|
|
||||||
),
|
|
||||||
{test_files[1]},
|
|
||||||
),
|
|
||||||
# Files mentioned in markdown bold format
|
# Files mentioned in markdown bold format
|
||||||
(f"You should check **{test_files[0]}** for issues", {test_files[0]}),
|
(f"You should check **{test_files[0]}** for issues", {test_files[0]}),
|
||||||
(
|
(
|
||||||
|
@ -363,7 +350,6 @@ class TestCoder(unittest.TestCase):
|
||||||
f"Files to modify:\n- **{test_files[0]}**\n- **{test_files[4]}**",
|
f"Files to modify:\n- **{test_files[0]}**\n- **{test_files[4]}**",
|
||||||
{test_files[0], test_files[4]},
|
{test_files[0], test_files[4]},
|
||||||
),
|
),
|
||||||
("Files mentioned like **aider/args.py** should be detected", set()),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
for content, expected_mentions in test_cases:
|
for content, expected_mentions in test_cases:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue