Commit graph

635 commits

Author SHA1 Message Date
Joshua Vial
d8f33a8124 Auto switch to gpt-4-vision-preview if image files added to context 2023-11-29 22:48:45 +13:00
Paul Gauthier
95fe1be4c5 /add and /drop should work on untracked files in a repo (without committing them) 2023-11-15 13:06:22 -08:00
Paul Gauthier
d2f924d6d1 fixed /tokens 2023-11-14 13:03:25 -08:00
Paul Gauthier
60ca8f8c0d properly render the main sys prompt 2023-11-14 11:07:35 -08:00
Paul Gauthier
bbc174a8fb just use the Rules as the reminder 2023-11-14 11:01:29 -08:00
Paul Gauthier
c24a4a4392 refactor into Model.token_count() 2023-11-14 10:11:13 -08:00
Paul Gauthier
90f57664a6 aider: Refactor cmd_tokens to use main_model.token_count() instead of calling tokenizer directly.
# Aider chat conversation:

USER: in `cmd_tokens` make use of main_model.token_count() rather than calling tokenizer directly

ASSISTANT: To make this change, we need to modify `aider/commands.py`. Specifically, we will update the `cmd_tokens` method to use `self.coder.main_model.token_count()` instead of calling `self.tokenizer.encode()` directly.

Here is the *SEARCH/REPLACE* block for the change:

aider/commands.py
<source>python
<<<<<<< SEARCH
        tokens = len(self.tokenizer.encode(json.dumps(msgs)))
=======
        tokens = self.coder.main_model.token_count(json.dumps(msgs))
>>>>>>> REPLACE
</source>

aider/commands.py
<source>python
<<<<<<< SEARCH
            tokens = len(self.tokenizer.encode(msgs))
=======
            tokens = self.coder.main_model.token_count(msgs)
>>>>>>> REPLACE
</source>

aider/commands.py
<source>python
<<<<<<< SEARCH
                tokens = len(self.tokenizer.encode(repo_content))
=======
                tokens = self.coder.main_model.token_count(repo_content)
>>>>>>> REPLACE
</source>

aider/commands.py
<source>python
<<<<<<< SEARCH
            tokens = len(self.tokenizer.encode(content))
=======
            tokens = self.coder.main_model.token_count(content)
>>>>>>> REPLACE
</source>

These changes will ensure that the `cmd_tokens` method uses the `token_count` method from the `main_model` to calculate the number of tokens, which is a more abstracted and potentially model-specific way of counting tokens.
2023-11-14 10:04:00 -08:00
Paul Gauthier
1fe48fd161 Updated /help messages 2023-11-03 09:23:04 -07:00
Paul Gauthier
d720bfe459 Properly test if /added file is already in the repo #314 2023-11-02 15:50:30 -07:00
Paul Gauthier
5c9275191e aider: Refused to add blocked file by .gitignore and printed error message.
# Aider chat conversation:

USER: crash when /add a file which is blocked by .gitignore; we should catch the error, print a tool_error an

d refuse to /add the file
. > /add tmp/wordpress.py

Traceback (most recent call last):
  File "/home/m/.local/bin/aider", line 8, in <module>
    sys.exit(main())
  File "/home/m/.local/lib/python3.10/site-packages/aider/main.py", line 564, in main
    coder.run()
  File "/home/m/.local/lib/python3.10/site-packages/aider/coders/base_coder.py", line 319, in run
    new_user_message = self.run_loop()
  File "/home/m/.local/lib/python3.10/site-packages/aider/coders/base_coder.py", line 398, in run_loop
    return self.commands.run(inp)
  File "/home/m/.local/lib/python3.10/site-packages/aider/commands.py", line 73, in run
    return self.do_run(matching_commands[0][1:], rest_inp)
  File "/home/m/.local/lib/python3.10/site-packages/aider/commands.py", line 51, in do_run
    return cmd_method(args)
  File "/home/m/.local/lib/python3.10/site-packages/aider/commands.py", line 316, in cmd_add
    self.coder.repo.repo.git.add(abs_file_path)
  File "/home/m/.local/lib/python3.10/site-packages/git/cmd.py", line 741, in <lambda>
    return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
  File "/home/m/.local/lib/python3.10/site-packages/git/cmd.py", line 1315, in _call_process
    return self.execute(call, **exec_kwargs)
  File "/home/m/.local/lib/python3.10/site-packages/git/cmd.py", line 1109, in execute
    raise GitCommandError(redacted_command, status, stderr_value, stdout_value)
git.exc.GitCommandError: Cmd('git') failed due to: exit code(1)
  cmdline: git add /home/m/Private/Projects/Freelance/nbdter69/pars_porntube/tmp/wordpress.py
  stderr: 'The following paths are ignored by one of your .gitignore files:
tmp
hint: Use -f if you really want to add them.
hint: Turn this message off by running
hint: "git config advice.addIgnoredFile false"'

ASSISTANT: To handle this issue, we need to modify the `cmd_add` method in the `Commands` class in the `aider/commands.py` file. We will add a check to see if the file is ignored by git before trying to add it. If it is ignored, we will print an error message and skip adding the file.

Here is the *SEARCH/REPLACE block* for the change:

<source>python
aider/commands.py
<<<<<<< SEARCH
        for matched_file in all_matched_files:
            abs_file_path = self.coder.abs_root_path(matched_file)

            if not abs_file_path.startswith(self.coder.root):
                self.io.tool_error(
                    f"Can not add {abs_file_path}, which is not within {self.coder.root}"
                )
                continue

            if self.coder.repo and matched_file not in git_files:
                self.coder.repo.repo.git.add(abs_file_path)
                git_added.append(matched_file)

            if abs_file_path in self.coder.abs_fnames:
                self.io.tool_error(f"{matched_file} is already in the chat")
            else:
                content = self.io.read_text(abs_file_path)
                if content is None:
                    self.io.tool_error(f"Unable to read {matched_file}")
                else:
                    self.coder.abs_fnames.add(abs_file_path)
                    self.io.tool_output(f"Added {matched_file} to the chat")
                    added_fnames.append(matched_file)
=======
        for matched_file in all_matched_files:
            abs_file_path = self.coder.abs_root_path(matched_file)

            if not abs_file_path.startswith(self.coder.root):
                self.io.tool_error(
                    f"Can not add {abs_file_path}, which is not within {self.coder.root}"
                )
                continue

            if self.coder.repo and matched_file not in git_files:
                try:
                    self.coder.repo.repo.git.add(abs_file_path)
                    git_added.append(matched_file)
                except git.exc.GitCommandError as e:
                    self.io.tool_error(f"Unable to add {matched_file}: {str(e)}")
                    continue

            if abs_file_path in self.coder.abs_fnames:
                self.io.tool_error(f"{matched_file} is already in the chat")
            else:
                content = self.io.read_text(abs_file_path)
                if content is None:
                    self.io.tool_error(f"Unable to read {matched_file}")
                else:
                    self.coder.abs_fnames.add(abs_file_path)
                    self.io.tool_output(f"Added {matched_file} to the chat")
                    added_fnames.append(matched_file)
>>>>>>> REPLACE
</source>
2023-11-02 10:08:25 -07:00
Omri Bloch
e8c4b3cf81 Do not autocommit after add if autocommit is disabled 2023-11-01 10:28:45 +02:00
Paul Gauthier
b6142af12b make sure **.txt does not crash chat #293 2023-10-25 15:52:26 -07:00
Paul Gauthier
5756812938 Adopt subprocess.run(shell=True) for /git 2023-10-18 12:37:39 -07:00
paul-gauthier
44aa5c6d63
Merge pull request #272 from alexanderkjeldaas/ak/run-shell
fix: /run (cd ..; ls) should work
2023-10-18 12:35:17 -07:00
Paul Gauthier
82dc995a04 Added helpful suggestions to /undo and /diff errors 2023-10-18 11:38:54 -07:00
Paul Gauthier
22eb344192 disable /voice if import soundfile failes #274 2023-10-12 07:00:51 -07:00
Alexander Kjeldaas
67c5bb5985 aider: Remove the use of shlex.split(args) in cmd_run method.
# Aider chat conversation:

USER: what does shlex.split(args) do?

ASSISTANT: The `shlex.split(args)` function is a method in Python's `shlex` module. It splits the string `args` into a list of substrings, using shell-like syntax. This means it handles quotes and backslashes like a Unix shell would.

For example, if `args` is a string like `"command -option 'argument with spaces'"`, `shlex.split(args)` would return the list `['command', '-option', 'argument with spaces']`.

This is useful when you want to pass a command line command as a string to a function like `subprocess.run()`, which expects a list of arguments.

USER: remove the use of shlex in cmd_run

ASSISTANT: To remove the use of `shlex.split(args)` in the `cmd_run` method, we need to modify the `aider/commands.py` file. Here's the change:

<source>python
aider/commands.py
<<<<<<< HEAD
            parsed_args = shlex.split(args)
            result = subprocess.run(
                parsed_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, shell=True
            )
=======
            result = subprocess.run(
                args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, shell=True
            )
>>>>>>> updated
</source>
2023-10-01 19:51:38 +02:00
Alexander Kjeldaas
b2eed01051 aider: Add shell=True to subprocess.run in cmd_run.
# Aider chat conversation:

USER: add `shell=True` to subprocess.run in cmd_run

ASSISTANT: To add `shell=True` to the `subprocess.run` call in the `cmd_run` method, we need to modify the `aider/commands.py` file. Here's the change:

<source>python
aider/commands.py
<<<<<<< HEAD
            result = subprocess.run(
                parsed_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True
            )
=======
            result = subprocess.run(
                parsed_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, shell=True
            )
>>>>>>> updated
</source>
2023-10-01 19:49:58 +02:00
Paul Gauthier
b78b8fabf4 use regex not shlex to parse quoted filenames portably on windows and others 2023-09-29 17:07:17 -07:00
Paul Gauthier
2dc01bb9bd handle abs paths on windows 2023-09-29 16:36:37 -07:00
Paul Gauthier
774589b376 test to ensure we accept abs filenames; use shlex so we handle quoted filenames; #152 #156 2023-09-29 15:02:45 -07:00
Paul Gauthier
dc19a1fe4b /add treats args as literal filenames initially, only glob if they do not exist #195 2023-09-29 13:44:49 -07:00
Paul Gauthier
399d86d437 block /add of files from outside coder.root #178 2023-09-29 13:27:43 -07:00
Paul Gauthier
98bacd0b5b test case and fix for /add blowing up in subdir #201 2023-09-29 10:49:27 -07:00
JV
041f3a4a38 initial code for working with openrouter 2023-08-23 14:39:12 +12:00
Paul Gauthier
963bc83a9c Late-bind importing sounddevice, as it was slowing down aider startup 2023-08-19 15:18:46 -07:00
Paul Gauthier
285536105e Properly handle all diff cases 2023-08-18 10:07:47 -07:00
Paul Gauthier
c07013abf4 finished roughing in --voice-language 2023-08-14 14:18:37 -03:00
Paul Gauthier
bddcdd39a8 Refactor record_and_transcribe method in voice.py to accept a language parameter. 2023-08-14 14:11:31 -03:00
Paul Gauthier
23579d4741 Refactor voice recording and transcription to allow for specifying the language. 2023-08-14 14:11:03 -03:00
Paul Gauthier
b6b271b70c pass the input history as a prompt to whisper 2023-08-11 11:03:37 -03:00
Paul Gauthier
9815d14368 rename 2023-08-11 10:49:27 -03:00
Paul Gauthier
233433cc11 properly handle ^c in /voice 2023-08-11 08:45:06 -03:00
Paul Gauthier
053751cb43 show loudness bar 2023-08-10 22:17:31 -03:00
Paul Gauthier
3ff2cb8dbe append voice messages to input history 2023-08-10 17:17:51 -03:00
Paul Gauthier
4812d17372 prettier 2023-08-10 17:12:19 -03:00
Paul Gauthier
7b993a9bbb gracefully handle missing portaudio 2023-08-10 16:55:45 -03:00
Paul Gauthier
ec91eb670e Refactor cmd_voice method to use user_input method instead of tool_output. 2023-08-10 16:23:35 -03:00
Paul Gauthier
47144a7e99 Add voice transcription to the cmd_voice command and output the transcribed text. 2023-08-10 16:18:13 -03:00
Paul Gauthier
2b1de442ed aider: Updated cmd_voice method to call record_and_transcribe function from aider/voice.py module and return its results.
# Aider chat conversation:

USER: the /voice cmd should call `record_and_transcribe` and return the results

ASSISTANT: To implement the `/voice` command, we need to modify the `aider/commands.py` file. Specifically, we need to update the `cmd_voice` method to call the `record_and_transcribe` function from the `aider/voice.py` module and return its results.

Here's the *edit block* for this change:

<source>python
aider/commands.py
<<<<<<< HEAD
    def cmd_voice(self, args):
        "Respond with 'hi gpt'"
        return 'hi gpt'
=======
    from .voice import record_and_transcribe

    def cmd_voice(self, args):
        "Record and transcribe voice input"
        return record_and_transcribe()
>>>>>>> updated
</source>
2023-08-10 16:15:02 -03:00
Paul Gauthier
2077bdcd79 aider: Add a new /voice command that returns 'hi gpt' when called.
# Aider chat conversation:

USER: add a new /voice command that just returns 'hi gpt' so that message gets sent

ASSISTANT: To add a new command, we need to add a new method to the `Commands` class in the `aider/commands.py` file. The method should be named `cmd_voice` and it should return the string 'hi gpt'.

Here is the *edit block* for this change:

<source>python
aider/commands.py
<<<<<<< HEAD
    def cmd_help(self, args):
        "Show help about all commands"
        commands = sorted(self.get_commands())
        for cmd in commands:
            cmd_method_name = f"cmd_{cmd[1:]}"
            cmd_method = getattr(self, cmd_method_name, None)
            if cmd_method:
                description = cmd_method.__doc__
                self.io.tool_output(f"{cmd} {description}")
            else:
                self.io.tool_output(f"{cmd} No description available.")
=======
    def cmd_help(self, args):
        "Show help about all commands"
        commands = sorted(self.get_commands())
        for cmd in commands:
            cmd_method_name = f"cmd_{cmd[1:]}"
            cmd_method = getattr(self, cmd_method_name, None)
            if cmd_method:
                description = cmd_method.__doc__
                self.io.tool_output(f"{cmd} {description}")
            else:
                self.io.tool_output(f"{cmd} No description available.")

    def cmd_voice(self, args):
        "Respond with 'hi gpt'"
        return 'hi gpt'
>>>>>>> updated
</source>
2023-08-10 15:40:54 -03:00
Joshua Vial
88d7e2ed09 disabling GIT_EDITOR when calling /git 2023-08-08 23:01:36 +12:00
Paul Gauthier
c271bfd932 Fixed /commit after repo refactor, added test coverage 2023-08-04 06:39:04 -03:00
Paul Gauthier
ecd37b1ad5 prettier cost output in /tokens 2023-07-26 17:43:16 -03:00
Paul Gauthier
2094b3176b aider: Adjusted the calculation of the cost in the cmd_tokens method to account for the prices in Model being per 1k tokens.
# Aider chat conversation:

USER: the prices in `Model` are per 1k tokens

ASSISTANT: I see, the prices in the `Model` class are per 1k tokens. Therefore, we need to adjust the calculation of the cost in the `cmd_tokens` method in the `Commands` class in the `aider/commands.py` file.

We will divide the `completion_price` by 1000 before multiplying it with the token count to get the cost.

Here are the changes:

<source>python
aider/commands.py
<<<<<<< ORIGINAL
        total = 0
        total_cost = 0.0
        for tk, msg, tip in res:
            total += tk
            cost = tk * self.coder.main_model.completion_price
            total_cost += cost
            msg = msg.ljust(col_width)
            self.io.tool_output(f"{fmt(tk)} {msg} {tip} (cost: ${cost:.2f})")

        self.io.tool_output("=" * width)
        self.io.tool_output(f"{fmt(total)} tokens total (cost: ${total_cost:.2f})")
=======
        total = 0
        total_cost = 0.0
        for tk, msg, tip in res:
            total += tk
            cost = tk * (self.coder.main_model.completion_price / 1000)
            total_cost += cost
            msg = msg.ljust(col_width)
            self.io.tool_output(f"{fmt(tk)} {msg} {tip} (cost: ${cost:.2f})")

        self.io.tool_output("=" * width)
        self.io.tool_output(f"{fmt(total)} tokens total (cost: ${total_cost:.2f})")
>>>>>>> UPDATED
</source>
2023-07-26 17:35:42 -03:00
Paul Gauthier
35ccfac3fd aider: Updated the output of /tokens to include the total cost.
# Aider chat conversation:

USER: udpate the output of /tokens to include the total $ cost

ASSISTANT: To include the total cost in the output of the `/tokens` command, we need to modify the `cmd_tokens` method in the `Commands` class in the `aider/commands.py` file.

We will add a new variable `total_cost` to keep track of the total cost. For each token count, we will calculate the cost by multiplying the token count by the model's `completion_price` (since we're considering the cost of generating these tokens). We will then add this cost to `total_cost`.

Finally, we will add a line to the output to display the total cost.

Here are the changes:

<source>python
aider/commands.py
<<<<<<< ORIGINAL
        total = 0
        for tk, msg, tip in res:
            total += tk
            msg = msg.ljust(col_width)
            self.io.tool_output(f"{fmt(tk)} {msg} {tip}")

        self.io.tool_output("=" * width)
        self.io.tool_output(f"{fmt(total)} tokens total")
=======
        total = 0
        total_cost = 0.0
        for tk, msg, tip in res:
            total += tk
            cost = tk * self.coder.main_model.completion_price
            total_cost += cost
            msg = msg.ljust(col_width)
            self.io.tool_output(f"{fmt(tk)} {msg} {tip} (cost: ${cost:.2f})")

        self.io.tool_output("=" * width)
        self.io.tool_output(f"{fmt(total)} tokens total (cost: ${total_cost:.2f})")
>>>>>>> UPDATED
</source>
2023-07-26 17:34:50 -03:00
paul-gauthier
86309f336c
Merge pull request #137 from paul-gauthier/refactor-repo
Refactor git repo code into a new file
2023-07-26 07:24:10 -03:00
Paul Gauthier
3e77df7587 /tokens should warn when <1k tokens left 2023-07-25 09:25:01 -03:00
Paul Gauthier
143ca36733 Merge branch 'main' into refactor-repo 2023-07-23 10:23:38 -03:00
Paul Gauthier
450a5fff19 Added test case and fix for /drop too 2023-07-23 08:41:56 -03:00