Commit graph

653 commits

Author SHA1 Message Date
Paul Gauthier
42fbe28897 examples_as_sys_msg for sonnet gets 100% compliance on exercism eval 2024-06-24 11:03:29 -07:00
Paul Gauthier
30154957bb Ask for even more concise S/R blocks 2024-06-24 10:50:30 -07:00
Paul Gauthier
7be08c782c Tell Sonnet to make concise SEARCH/REPLACE blocks #705 2024-06-23 17:24:14 -07:00
Paul Gauthier
716e4d99a0 ensure the LLM response is logged even if token limits reached #705 2024-06-23 16:22:05 -07:00
Paul Gauthier
ecb3d81055 Updated token error to reflect that token counts can be approximate 2024-06-23 16:19:04 -07:00
Paul Gauthier
c207c7839a Added --attribute-author/committer options #698 2024-06-21 17:14:21 -07:00
Paul Gauthier
4fd61f1112 More flexible filename search for deepseek coder v2 2024-06-21 08:51:53 -07:00
Paul Gauthier
fb26174357 print token counts with commas 2024-06-20 16:17:13 -07:00
Paul Gauthier
5a3627de6e finish removing aider: prefix 2024-06-18 08:37:13 -07:00
paul-gauthier
a596a32290
Merge pull request #631 from daniel-vainsencher/dvf_llm_log 2024-06-17 13:58:46 -07:00
Paul Gauthier
45e27af589 restored editblock_prompt 2024-06-16 12:09:20 -07:00
Paul Gauthier
a30e656304 improved token limit err msgs and docs #678 2024-06-14 07:28:33 -07:00
Daniel Vainsencher
3e9f6dcca2
Merge branch 'main' into dvf_llm_log 2024-06-12 18:32:48 -04:00
Daniel Vainsencher
c40b3fa310 Review comments 2024-06-12 18:28:55 -04:00
Paul Gauthier
a07492b90a moved --vim to Other Settings 2024-06-12 11:30:26 -07:00
Paul Gauthier
6216a273fe drop context at the caller 2024-06-11 13:33:46 -07:00
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