Commit graph

1037 commits

Author SHA1 Message Date
Paul Gauthier
d2b9eec3e0 fixed bad url; fixed max_reflection logic 2024-06-08 12:57:36 -07:00
Paul Gauthier
1f1da4b1a2 refac all urls into urls.py 2024-06-08 12:53:54 -07:00
Paul Gauthier
09d3d02971 more conservative reflection if 2024-06-08 12:40:35 -07:00
Daniel Vainsencher
e6e360a4ef Added support for logging LLM history to a specified file. 2024-06-07 10:40:32 -04:00
Daniel Vainsencher
8896909e19 aider: Capitalize the "ASSISTANT" role when logging to the LLM history file.
# Aider chat conversation:

USER: When logging to llm history file, capitalize the ASSISTANT role.

ASSISTANT: To capitalize the "ASSISTANT" role when logging to the LLM history file, we need to modify the `send_new_user_message` method in `aider/coders/base_coder.py`.

Here is the *SEARCH/REPLACE* block:

aider/coders/base_coder.py
```python
<<<<<<< SEARCH
        with open('.aider.llm.history', 'a') as log_file:
            log_file.write(f"LLM RESPONSE {timestamp}\n")
            log_file.write(format_content("assistant", content) + "\n")
=======
        with open('.aider.llm.history', 'a') as log_file:
            log_file.write(f"LLM RESPONSE {timestamp}\n")
            log_file.write(format_content("ASSISTANT", content) + "\n")
>>>>>>> REPLACE
```
2024-06-07 09:39:03 -04:00
Daniel Vainsencher
2bd5daf2ad aider: Add logging of conversation between coder and LLM in .aider.llm.history file using new formatting functions in send_new_user_message.
# Aider chat conversation:

USER: We want to add logging of the conversation between coder and the LLM into a new file called .aider.llm.history. The formatting should be done using the new format_messages and format_content. Modify only the `send_new_user_message` function in base_coder, formatting and logging `messages` as soon as it is defined, and logging `content` before `tool_output`. Precede them by a single line saying "TO LLM {timestamp}" and "LLM RESPONSE {timestamp}" where the timestamp is uses ISO date format and has second precision.

ASSISTANT: To implement the logging of the conversation between the coder and the LLM, we will:

1. Format and log `messages` as soon as it is defined in `send_new_user_message`.
2. Log `content` before `tool_output`.
3. Precede the logs with a timestamp in ISO date format with second precision.

Here are the *SEARCH/REPLACE* blocks:

aider/coders/base_coder.py
```python
<<<<<<< SEARCH
        messages = self.format_messages()
=======
        import datetime
        from aider.utils import format_messages, format_content

        messages = self.format_messages()

        timestamp = datetime.datetime.now().isoformat(timespec='seconds')
        with open('.aider.llm.history', 'a') as log_file:
            log_file.write(f"TO LLM {timestamp}\n")
            log_file.write(format_messages(messages) + "\n")
>>>>>>> REPLACE
```

aider/coders/base_coder.py
```python
<<<<<<< SEARCH
        self.io.tool_output()
=======
        self.io.tool_output()

        timestamp = datetime.datetime.now().isoformat(timespec='seconds')
        with open('.aider.llm.history', 'a') as log_file:
            log_file.write(f"LLM RESPONSE {timestamp}\n")
            log_file.write(format_content("assistant", content) + "\n")
>>>>>>> REPLACE
```
2024-06-07 09:39:03 -04:00
Paul Gauthier
17dcfd94f7 +Only include the files 2024-05-25 18:58:37 -07:00
Paul Gauthier
52ac35fcd2 restore --show-diffs functionality #607 2024-05-23 14:07:20 -07:00
Paul Gauthier
6345cd3734 cleanup 2024-05-23 13:43:35 -07:00
Paul Gauthier
fb76895eb1 Merge branch 'main' into swe-bench 2024-05-23 13:36:23 -07:00
Paul Gauthier
a405defcff ask for confirmation 2024-05-22 21:27:59 -07:00
Paul Gauthier
5032adf44b Add the url content 2024-05-22 21:25:34 -07:00
Paul Gauthier
dc8ae596c3 aider: Implement regex to find all URLs in the input string.
# Aider chat conversation:

USER: do the todo

ASSISTANT: To address the TODO comment, we need to implement a regex to find all URLs in the input string. Here are the changes:

1. Import the `re` module for regular expressions.
2. Implement the `check_for_urls` method to find and process URLs in the input string.

Here are the *SEARCH/REPLACE* blocks:

aider/coders/base_coder.py
```python
<<<<<<< SEARCH
import hashlib
=======
import hashlib
import re
>>>>>>> REPLACE
```

aider/coders/base_coder.py
```python
<<<<<<< SEARCH
        # todo use a regex to find all urls in inp

        return inp
=======
        url_pattern = re.compile(
            r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
        )
        urls = url_pattern.findall(inp)
        if urls:
            self.io.tool_output(f"Found URLs: {', '.join(urls)}")
        return inp
>>>>>>> REPLACE
```

This will implement the functionality to find all URLs in the input string using a regular expression.
2024-05-22 21:19:44 -07:00
Paul Gauthier
aca24976a7 Add method to check for URLs in input. 2024-05-22 21:19:43 -07:00
Paul Gauthier
1effd73e80 Only expand the repomap if we know it will fit into context window 2024-05-20 10:22:57 -07:00
Paul Gauthier
fa0aa60c97 Merge branch 'main' into swe-bench 2024-05-20 09:39:29 -07:00
Paul Gauthier
9c28bbc98e Refactored linting process and error handling in commands. 2024-05-20 08:55:49 -07:00
Paul Gauthier
e758b01fb6 Merge branch 'main' into swe-bench 2024-05-19 15:20:46 -07:00
Paul Gauthier
04539feccb bump deps to get grep-ast 0.3.1 2024-05-19 15:10:57 -07:00
Paul Gauthier
5745657991 ask to fix lint/test 2024-05-19 15:02:16 -07:00
Paul Gauthier
038806f694 max_reflex=3, auto fix lint/test 2024-05-19 14:24:06 -07:00
Paul Gauthier
642be2a8f0 S/R uniq prompt 2024-05-19 14:22:29 -07:00
Paul Gauthier
5641483a3b S/R will replace all matches 2024-05-19 10:31:36 -07:00
Paul Gauthier
ec7af731e0 confirm auto lint and test 2024-05-19 10:26:06 -07:00
Paul Gauthier
cb6e7cabb6 Added lint/test_outcome 2024-05-19 08:13:20 -07:00
Paul Gauthier
0b18f3b4ef Add check to skip setting up lint commands if none are provided. 2024-05-19 07:42:39 -07:00
Paul Gauthier
25e44f584b aider: Fixed extra blank lines and added missing whitespace after a comma.
# Aider chat conversation:

USER: # Fix any errors below, if possible.

## Running: flake8 aider/coders/base_coder.py

aider/coders/base_coder.py:43:1: E303 too many blank lines (3)
aider/coders/base_coder.py:334:17: E231 missing whitespace after ','

## See relevant lines below marked with █.

aider/coders/base_coder.py:
...⋮...
 40│
 41│
 42│
 43█def wrap_fence(name):
 44│    return f"<{name}>", f"</{name}>"
 45│
 46│
 47│class Coder:
 48│    abs_fnames = None
...⋮...
331│                self.io.tool_output(json.dumps(self.functions, indent=4))
332│
333│    def setup_lint_cmds(self, lint_cmds):
334█        for lang,cmd in lint_cmds.items():
335│            self.linter.set_linter(lang, cmd)
336│
337│    def show_announcements(self):
...⋮...

ASSISTANT: Here are the necessary changes to fix the flake8 errors:

1. Remove the extra blank lines before the `wrap_fence` function.
2. Add a missing whitespace after the comma in the `setup_lint_cmds` function.

aider/coders/base_coder.py
```python
<<<<<<< SEARCH
class ExhaustedContextWindow(Exception):
    pass

def wrap_fence(name):
=======
class ExhaustedContextWindow(Exception):
    pass

def wrap_fence(name):
>>>>>>> REPLACE
```

aider/coders/base_coder.py
```python
<<<<<<< SEARCH
        for lang,cmd in lint_cmds.items():
=======
        for lang, cmd in lint_cmds.items():
>>>>>>> REPLACE
```
2024-05-19 07:40:48 -07:00
Paul Gauthier
9bd78d7ff3 Refactored lint command parsing and setup logic. 2024-05-19 07:40:41 -07:00
Paul Gauthier
990dda1122 Added empty lines for better readability. 2024-05-19 07:35:27 -07:00
Paul Gauthier
9ee332f5d9 Added options for automatic linting and testing after changes. 2024-05-19 07:34:19 -07:00
Paul Gauthier
6fac50a3a1 aider: Fix undefined name 'Path' errors by importing the Path class from the pathlib module.
# Aider chat conversation:

USER: # Fix any errors below

## Running: flake8 --select=E9,F821,F823,F831,F406,F407,F701,F702,F704,F706 --show-source aider/coders/wholefile_coder.py

aider/coders/wholefile_coder.py:73:62: F821 undefined name 'Path'
                    if fname and fname not in chat_files and Path(fname).name in chat_files:
                                                             ^
aider/coders/wholefile_coder.py:74:33: F821 undefined name 'Path'
                        fname = Path(fname).name
                                ^
aider/coders/wholefile_coder.py:103:30: F821 undefined name 'Path'
                full_path = (Path(self.root) / fname).absolute()
                             ^
aider/coders/wholefile_coder.py:133:12: F821 undefined name 'Path'
        if Path(full_path).exists():
           ^

## See relevant lines below marked with █.

aider/coders/wholefile_coder.py:
...⋮...
  2│from aider import diffs
  3│
...⋮...
  9│class WholeFileCoder(Coder):
 10│    edit_format = "whole"
 11│
...⋮...
 30│    def get_edits(self, mode="update"):
 31│        content = self.partial_response_content
 32│
...⋮...
 44│        for i, line in enumerate(lines):
 45│            if line.startswith(self.fence[0]) or line.startswith(self.fence[1]):
 46│                if fname is not None:
 47│                    # ending an existing block
 48│                    saw_fname = None
 49│
 50│                    full_path = self.abs_root_path(fname)
 51│
 52│                    if mode == "diff":
 53│                        output += self.do_live_diff(full_path, new_lines, True)
 54│                    else:
 55│                        edits.append((fname, fname_source, new_lines))
 56│
...⋮...
 63│                if i > 0:
 64│                    fname_source = "block"
...⋮...
 70│                    # Did gpt prepend a bogus dir? It especially likes to
 71│                    # include the path/to prefix from the one-shot example in
 72│                    # the prompt.
 73█                    if fname and fname not in chat_files and Path(fname).name in chat_files:
 74█                        fname = Path(fname).name
 75│                if not fname:  # blank line? or ``` was on first line i==0
 76│                    if saw_fname:
 77│                        fname = saw_fname
...⋮...
100│        if mode == "diff":
101│            if fname is not None:
102│                # ending an existing block
103█                full_path = (Path(self.root) / fname).absolute()
104│                output += self.do_live_diff(full_path, new_lines, False)
105│            return "\n".join(output)
106│
...⋮...
130│            self.io.write_text(full_path, new_lines)
131│
132│    def do_live_diff(self, full_path, new_lines, final):
133█        if Path(full_path).exists():
134│            orig_lines = self.io.read_text(full_path).splitlines(keepends=True)
135│
136│            show_diff = diffs.diff_partial_update(
137│                orig_lines,
138│                new_lines,
139│                final=final,
140│            ).splitlines()
141│            output = show_diff
142│        else:
...⋮...

ASSISTANT: To fix the errors, we need to import the `Path` class from the `pathlib` module. Here are the necessary changes:

aider/coders/wholefile_coder.py
<source>python
<<<<<<< SEARCH
from aider import diffs
=======
from aider import diffs
from pathlib import Path
>>>>>>> REPLACE
</source>

aider/coders/wholefile_coder.py
<source>python
<<<<<<< SEARCH
                    if fname and fname not in chat_files and Path(fname).name in chat_files:
                        fname = Path(fname).name
=======
                    if fname and fname not in chat_files and Path(fname).name in chat_files:
                        fname = Path(fname).name
>>>>>>> REPLACE
</source>

aider/coders/wholefile_coder.py
<source>python
<<<<<<< SEARCH
                full_path = (Path(self.root) / fname).absolute()
=======
                full_path = (Path(self.root) / fname).absolute()
>>>>>>> REPLACE
</source>

aider/coders/wholefile_coder.py
<source>python
<<<<<<< SEARCH
        if Path(full_path).exists():
=======
        if Path(full_path).exists():
>>>>>>> REPLACE
</source>
2024-05-18 20:49:17 -07:00
Paul Gauthier
a50f01a004 Removed unnecessary import of Path from pathlib. 2024-05-18 20:49:10 -07:00
Paul Gauthier
8a2ce8ec0e aider: Import 'Path' from 'pathlib' to fix undefined name errors.
# Aider chat conversation:

USER: # Running: /Users/gauthier/Projects/aider/tmp.sh aider/coders/wholefile_coder.py

aider/coders/wholefile_coder.py
aider/coders/wholefile_coder.py:72:62: F821 undefined name 'Path'
                    if fname and fname not in chat_files and Path(fname).name in chat_files:
                                                             ^
aider/coders/wholefile_coder.py:73:33: F821 undefined name 'Path'
                        fname = Path(fname).name
                                ^
aider/coders/wholefile_coder.py:102:30: F821 undefined name 'Path'
                full_path = (Path(self.root) / fname).absolute()
                             ^
aider/coders/wholefile_coder.py:132:12: F821 undefined name 'Path'
        if Path(full_path).exists():
           ^

ASSISTANT: To fix the `undefined name 'Path'` errors, we need to import `Path` from the `pathlib` module at the beginning of the file. Here are the necessary changes:

aider/coders/wholefile_coder.py
<source>python
<<<<<<< SEARCH
from aider import diffs
=======
from pathlib import Path
from aider import diffs
>>>>>>> REPLACE
</source>
2024-05-18 19:18:43 -07:00
Paul Gauthier
5805007885 Removed unused import statement from wholefile_coder.py. 2024-05-18 19:18:38 -07:00
Paul Gauthier
4bbeb9de6f aider: Import 'Path' from 'pathlib' to fix undefined name errors.
# Aider chat conversation:

USER: # Running: /Users/gauthier/Projects/aider/tmp.sh aider/coders/wholefile_coder.py

aider/coders/wholefile_coder.py
aider/coders/wholefile_coder.py:72:62: F821 undefined name 'Path'
                    if fname and fname not in chat_files and Path(fname).name in chat_files:
                                                             ^
aider/coders/wholefile_coder.py:73:33: F821 undefined name 'Path'
                        fname = Path(fname).name
                                ^
aider/coders/wholefile_coder.py:102:30: F821 undefined name 'Path'
                full_path = (Path(self.root) / fname).absolute()
                             ^
aider/coders/wholefile_coder.py:132:12: F821 undefined name 'Path'
        if Path(full_path).exists():
           ^

ASSISTANT: To fix the `undefined name 'Path'` errors, we need to import `Path` from the `pathlib` module at the beginning of the file. Here are the necessary changes:

aider/coders/wholefile_coder.py
<source>python
<<<<<<< SEARCH
from aider import diffs
=======
from pathlib import Path
from aider import diffs
>>>>>>> REPLACE
</source>
2024-05-18 19:16:25 -07:00
Paul Gauthier
1d519cdf1e Removed unused import from wholefile_coder.py. 2024-05-18 19:16:24 -07:00
Paul Gauthier
b26969ea90 Refactored linting to use absolute file path. 2024-05-17 19:22:17 -07:00
Paul Gauthier
0412b19f6b aider: Fix flake8 errors by removing unnecessary f-string prefixes in aider/coders/base_coder.py.
# Aider chat conversation:

USER: I ran this command:

 pre-commit run --files aider/coders/base_coder.py

And got this output:

isort....................................................................Passed
black....................................................................Passed
flake8...................................................................Failed
- hook id: flake8
- exit code: 1

aider/coders/base_coder.py:1135:32: F541 f-string is missing placeholders
            self.io.tool_error(f"The LLM did not conform to the edit format.")
                               ^
aider/coders/base_coder.py:1148:32: F541 f-string is missing placeholders
            self.io.tool_error(f"Exception while updating files:")
                               ^

ASSISTANT: Please add `aider/coders/base_coder.py` to the chat so I can propose the necessary changes to fix the flake8 errors.

USER: I added these *read-write* files: aider/coders/base_coder.py

ASSISTANT: Here are the changes to fix the flake8 errors related to the f-strings missing placeholders in `aider/coders/base_coder.py`:

```diff
--- aider/coders/base_coder.py
+++ aider/coders/base_coder.py
@@ ... @@
-            self.io.tool_error(f"The LLM did not conform to the edit format.")
+            self.io.tool_error("The LLM did not conform to the edit format.")
@@ ... @@
-            self.io.tool_error(f"Exception while updating files:")
+            self.io.tool_error("Exception while updating files:")
```

These changes remove the unnecessary f-string prefixes since there are no variables or expressions to be evaluated inside the strings.
2024-05-17 19:11:49 -07:00
Paul Gauthier
8f194c8313 Add reflection tracking and limit to Coder class. 2024-05-17 19:11:48 -07:00
Paul Gauthier
4b0c38254e added lint reflection 2024-05-17 16:58:04 -07:00
Paul Gauthier
819fccc7a4 added temp param, prompt strong that files message is truth 2024-05-16 08:52:30 -07:00
Paul Gauthier
ecc46bd3e3 16x 2024-05-14 14:04:45 -07:00
Paul Gauthier
73e6949287 refac 2024-05-14 11:12:36 -07:00
Paul Gauthier
6638efbee4 better prompting for LLM to suggest files 2024-05-14 06:02:16 -07:00
Paul Gauthier
292250db4f prompt and token adjustments when no files in chat with repo 2024-05-13 12:30:42 -07:00
Paul Gauthier
edc70bdf84 Handle multiline tool_error() better 2024-05-13 11:42:22 -07:00
Paul Gauthier
ea05cf05e1 Added --restore-chat-history 2024-05-13 11:09:28 -07:00
Paul Gauthier
eea8e50c60 ask llm are you sure? when REPLACE exists 2024-05-11 16:56:14 -07:00
Paul Gauthier
90c0a5b9a4 reflect multiple messages; do not strip edit error messages 2024-05-11 16:40:37 -07:00
Paul Gauthier
0f9e314bb2 emit edit errors as proper tool_error() markdown 2024-05-11 15:38:03 -07:00