Commit graph

659 commits

Author SHA1 Message Date
Paul Gauthier
87be865a71 Improved /tokens output 2023-06-21 14:55:13 -07:00
Paul Gauthier
3974629d50 /clear should only clear history, not drop files 2023-06-21 14:36:31 -07:00
Paul Gauthier
6e3738c901 Better logic to determine context window size 2023-06-21 14:10:30 -07:00
Paul Gauthier
44198e8b3b Fix for issue #24, provided by @wwestenbrink 2023-06-20 06:57:19 -07:00
Paul Gauthier
d76bf0b8b0 added --assistant-output-color 2023-06-19 15:59:47 -07:00
Paul Gauthier
824ec054c6 version bump to 0.6.6 2023-06-17 07:27:17 -07:00
Paul Gauthier
1751025766 version bump 2023-06-17 07:15:49 -07:00
Paul Gauthier
0ca0db3edf fix; bump to 0.6.4 2023-06-17 07:08:45 -07:00
Paul Gauthier
9fc0b9d696 bump to 0.6.3 2023-06-17 07:07:13 -07:00
Paul Gauthier
8fc4f32117 Changed version flag to use long option. 2023-06-17 07:06:33 -07:00
Paul Gauthier
d8938ee033 aider: Added support for --version flag to display the version number.
# Context:
USER: should `aider --help` show the version now?
ASSISTANT: Yes, with the changes you made, running `aider --help` should show the version information. However, the version will be displayed when you run `aider --version`. The `--help` output will include a line mentioning the `--version` flag, but it won't directly show the version number.
USER: I ran this command:

 aider --version

And got this output:

Traceback (most recent call last):
  File "/Users/gauthier/Projects/aider/.venv/bin/aider", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/gauthier/Projects/aider/aider/main.py", line 32, in main
    parser = configargparse.ArgumentParser(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/.venv/lib/python3.11/site-packages/configargparse.py", line 433, in __init__
    argparse.ArgumentParser.__init__(self, *args, **kwargs)
TypeError: ArgumentParser.__init__() got an unexpected keyword argument 'version'

ASSISTANT: I apologize for the confusion earlier. It seems I made a mistake. `configargparse` does not have a built-in `version` parameter like `argparse`. Instead, you can add a custom argument with the `--version` flag and handle it manually. Here's how you can modify your `aider/main.py` file:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
        version=__version__,
    )
=======
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
    )

    parser.add_argument(
        "--version",
        action="store_true",
        help="Show the version number and exit",
    )
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    args = parser.parse_args(args)
=======
    args, unknown_args = parser.parse_known_args(args)

    if args.version:
        print(f"aider version {__version__}")
        sys.exit(0)

    # Re-parse the arguments to include unknown_args
    args = parser.parse_args(args + unknown_args)

^C KeyboardInterrupt
USER: can we add soemthing like this: parser.add_argument('-v', '--version', action='version', version='%(prog)s ' + __version__)

ASSISTANT: I apologize for the confusion earlier. It turns out that `configargparse` does support the `version` action, similar to `argparse`. You can add the `--version` argument as you suggested. Here's how you can modify your `aider/main.py` file:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
        version=__version__,
    )
=======
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
    )

    parser.add_argument(
        "-v", "--version", action="version", version=f"%(prog)s {__version__}", help="Show the version number and exit"
    )
>>>>>>> UPDATED
```

Now, running `aider --version` or `aider -v` will display the version number as expected.
2023-06-17 07:05:58 -07:00
Paul Gauthier
cdb62c1462 aider: Added version to argparse in main.py.
# Context:
USER: now import `__version__` into main and pass it to `configargparse`
ASSISTANT: To import `__version__` into `aider/main.py` and pass it to `configargparse`, you can modify the `aider/main.py` file as follows:

```python
aider/main.py
<<<<<<< ORIGINAL
import os
import sys

import configargparse
import git

from aider import models
from aider.coder import Coder
from aider.io import InputOutput
=======
import os
import sys

import configargparse
import git

from aider import models, __version__
from aider.coder import Coder
from aider.io import InputOutput
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
    )
=======
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
        version=__version__,
    )
>>>>>>> UPDATED
```

Now, the version from `aider/__init__.py` will be passed to `configargparse.ArgumentParser`, and it will be displayed in the help output when the user runs your tool with the `--version` flag.
2023-06-17 07:01:44 -07:00
Paul Gauthier
79f6be2163 aider: Added __version__ variable to aider/__init__.py and imported it in setup.py.
# Context:
USER: is it safe/sensible to put __version__ into `aider/__init__.py` and have setup.py import that to learn the version?
ASSISTANT: Yes, it is safe and sensible to put the `__version__` variable in `aider/__init__.py` and have `setup.py` import it to learn the version. This is a common practice in Python projects to maintain a single source of truth for the package version.

Here's how you can modify the `aider/__init__.py` and `setup.py` files:

```python
aider/__init__.py
<<<<<<< ORIGINAL
=======
__version__ = "0.6.2"
>>>>>>> UPDATED
```

```python
setup.py
<<<<<<< ORIGINAL
import re

with open("README.md", "r", encoding="utf-8") as f:
    long_description = f.read()
    long_description = re.sub(r"\n!\[.*\]\(.*\)", "", long_description)
    long_description = re.sub(r"\n- \[.*\]\(#.*\)", "", long_description)

setup(
    name="aider-chat",
    version="0.6.2",
=======
from aider import __version__

with open("README.md", "r", encoding="utf-8") as f:
    long_description = f.read()
    long_description = re.sub(r"\n!\[.*\]\(.*\)", "", long_description)
    long_description = re.sub(r"\n- \[.*\]\(#.*\)", "", long_description)

setup(
    name="aider-chat",
    version=__version__,
>>>>>>> UPDATED
```

This way, you can maintain the version in `aider/__init__.py` and `setup.py` will always use the correct version.
2023-06-17 06:59:58 -07:00
Paul Gauthier
373b2e3b35 Changed the description of the CLI tool to be more descriptive. 2023-06-17 06:59:10 -07:00
Paul Gauthier
8fb4ab2be3 cleaned up Model init 2023-06-15 06:26:16 -07:00
Paul Gauthier
cc7a77eb05 Improved initial config messages 2023-06-14 19:23:47 -07:00
Paul Gauthier
8660d35601 More flexible models 2023-06-14 17:51:17 -07:00
Paul Gauthier
8b5dcecbe2 aider: Added regex to extract tokens from name in get_model function.
# Context:
USER: use a regex to check `name` for "-XXk" and set tokens = the number XX
ASSISTANT: To use a regex to check for "-XXk" in the `name` and set `tokens` to the number XX, you can modify the `get_model` function in the `aider/models.py` file. Here's the updated code:

```python
aider/models.py
<<<<<<< ORIGINAL
def get_model(name):
    models = GPT35_models + GPT4_models

    for model in models:
        if model.name == name:
            return model

    tokens = 0

    model = Model(name, tokens)
=======
import re

def get_model(name):
    models = GPT35_models + GPT4_models

    for model in models:
        if model.name == name:
            return model

    match = re.search(r'-([0-9]+)k', name)
    tokens = int(match.group(1)) if match else 0

    model = Model(name, tokens)
>>>>>>> UPDATED
```

This change imports the `re` module and uses the `re.search()` function to find the "-XXk" pattern in the `name`. If the pattern is found, it sets `tokens` to the number XX.
2023-06-14 17:11:29 -07:00
Paul Gauthier
8c91e107e0 wip 2023-06-14 17:10:27 -07:00
Paul Gauthier
67ee800c55 refactor models to add gpt-4-32k-0613 2023-06-14 17:09:53 -07:00
Paul Gauthier
ce8069196c Improve messaging about universal ctags 2023-06-14 16:12:51 -07:00
Paul Gauthier
be34086ac0 aider: Captured stdout/err in check_for_ctags subprocess call.
# Context:
USER: in `check_for_ctags` capture stdout/err so they aren't displayed
ASSISTANT: No changes are needed.
2023-06-14 15:58:47 -07:00
Paul Gauthier
25a28e6f9c Improved support for gpt-3.5-turbo-16k 2023-06-13 12:19:56 -07:00
Paul Gauthier
1ce38d230b Added basic support for gpt-3.5-turbo-16k 2023-06-13 11:59:03 -07:00
Paul Gauthier
131245fa64 Fix bug when gpt35 can not make a dirty commit message 2023-06-10 14:23:04 -07:00
Paul Gauthier
193901ee43 Changed OpenAI API base endpoint to https://api.openai.com/v1. 2023-06-10 10:50:45 -07:00
Paul Gauthier
3e7f791112 aider: Added support for passing openai_api_base into the Coder class.
# Context:
USER: we need to pass `openai_api_base` into Coder
ASSISTANT: To pass `openai_api_base` into the Coder class, you need to modify the `aider/main.py` file and update the Coder class instantiation. Here's the change you need to make:

```python
aider/main.py
<<<<<<< ORIGINAL
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dirty_commits=args.dirty_commits,
        dry_run=args.dry_run,
        map_tokens=args.map_tokens,
        verbose=args.verbose,
        openai_api_key=args.openai_api_key,
    )
=======
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dirty_commits=args.dirty_commits,
        dry_run=args.dry_run,
        map_tokens=args.map_tokens,
        verbose=args.verbose,
        openai_api_key=args.openai_api_key,
        openai_api_base=args.openai_api_base,
    )
>>>>>>> UPDATED
```

Now, you also need to update the `__init__` method of the Coder class in the `aider/coder.py` file to accept the `openai_api_base` argument and use it:

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(
        self,
        io,
        main_model=models.GPT4.name,
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dirty_commits=True,
        dry_run=False,
        map_tokens=1024,
        verbose=False,
        openai_api_key=None,
    ):
        if not openai_api_key:
            raise MissingAPIKeyError("No OpenAI API key provided.")
        openai.api_key = openai_api_key
        openai.api_base = args.openai_api_base
=======
    def __init__(
        self,
        io,
        main_model=models.GPT4.name,
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dirty_commits=True,
        dry_run=False,
        map_tokens=1024,
        verbose=False,
        openai_api_key=None,
        openai_api_base=None,
    ):
        if not openai_api_key:
            raise MissingAPIKeyError("No OpenAI API key provided.")
        openai.api_key = openai_api_key
        openai.api_base = openai_api_base
>>>>>>> UPDATED
```

These changes will allow you to pass the `openai_api_base` value into the Coder class and use it.
2023-06-10 10:40:54 -07:00
Paul Gauthier
3bef60ecf0 aider: Added option to set OpenAI API base endpoint.
# Context:
USER: is it possible to add OPEN_AI_BASE or openai.api_base endpoint

default:
openai.api_base = "https://api.openai.com/v1/chat/completions"

ASSISTANT: Yes, you can add an option to set the OpenAI API base endpoint. Here's how to do it:

1. Add a new argument to the argument parser in `aider/main.py`.
2. Set the `openai.api_base` in the `Coder` class in `aider/coder.py`.

Here are the changes you need to make:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--openai-api-key",
        metavar="OPENAI_API_KEY",
        help="Specify the OpenAI API key",
        env_var="OPENAI_API_KEY",
    )
=======
    parser.add_argument(
        "--openai-api-key",
        metavar="OPENAI_API_KEY",
        help="Specify the OpenAI API key",
        env_var="OPENAI_API_KEY",
    )
    parser.add_argument(
        "--openai-api-base",
        metavar="OPENAI_API_BASE",
        default="https://api.openai.com/v1/chat/completions",
        help="Specify the OpenAI API base endpoint (default: https://api.openai.com/v1/chat/completions)",
    )
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
        if openai_api_key:
            openai.api_key = openai_api_key
        else:
            raise MissingAPIKeyError("No OpenAI API key provided.")
=======
        if not openai_api_key:
            raise MissingAPIKeyError("No OpenAI API key provided.")
        openai.api_key = openai_api_key
        openai.api_base = args.openai_api_base
>>>>>>> UPDATED
```

Now you can use the `--openai-api-base` option to set the OpenAI API base endpoint when running the script.
2023-06-10 06:40:15 -07:00
Paul Gauthier
806805c0b1 Ensure leading_whitespace is actually space 2023-06-10 06:16:22 -07:00
Paul Gauthier
8d408e1fc4 Try replace_part_with_missing_leading_whitespace first, so that single line edits get the benefit 2023-06-09 15:05:34 -07:00
Paul Gauthier
5612c8e13d Don't indent blank lines 2023-06-09 14:51:37 -07:00
Paul Gauthier
5a3fd35c16 If all lines in the part start with whitespace, then honor it. 2023-06-09 14:50:21 -07:00
Paul Gauthier
329baf3717 Fix the actual replace step 2023-06-09 14:46:43 -07:00
Paul Gauthier
1daf175c83 aider: Implemented replace_part_with_missing_leading_whitespace function to find and replace the portion of whole that matches part with the same leading whitespace and replace it with replace containing the same leading whitespace.
# Context:
USER: in `replace_part_with_missing_leading_whitespace`, we want to find the string part in whole and replace it with the string `replace`. but `part` may not exactly occur in whole. instead, every line of part appears in whole with a fixed amount of extra whitespace in front of it. so every line in part might appear in whole with 4 spaces prepended. or every line might have 2 tabs. always the exact same whitespaces. finish implementing this function so that it finds the portion of whole which matches part in this manner (if any) and replace it with `replace` where replace is updated to contain that repeated/omitted whitespace.
ASSISTANT: To implement the `replace_part_with_missing_leading_whitespace` function, follow these steps:

1. Split `whole` and `part` into lines.
2. Iterate through the lines of `whole` and find the first line that matches the first line of `part` with any leading whitespace.
3. Check if the following lines in `whole` also match the remaining lines in `part` with the same leading whitespace.
4. If all lines match, replace the matched lines in `whole` with the lines in `replace` with the same leading whitespace.
5. Return the modified `whole` or `None` if no match is found.

Here's the updated function:

```python
aider/utils.py
<<<<<<< ORIGINAL
def replace_part_with_missing_leading_whitespace(whole, part, replace):
    pass
=======
def replace_part_with_missing_leading_whitespace(whole, part, replace):
    whole_lines = whole.splitlines()
    part_lines = part.splitlines()
    replace_lines = replace.splitlines()

    for i in range(len(whole_lines) - len(part_lines) + 1):
        leading_whitespace = ""
        for j, c in enumerate(whole_lines[i]):
            if c == part_lines[0][0]:
                leading_whitespace = whole_lines[i][:j]
                break

        if not leading_whitespace:
            continue

        matched = all(
            whole_lines[i + k].startswith(leading_whitespace + part_lines[k])
            for k in range(len(part_lines))
        )

        if matched:
            for k in range(len(part_lines)):
                whole_lines[i + k] = leading_whitespace + replace_lines[k]
            return "\n".join(whole_lines)

    return None
>>>>>>> UPDATED
```

This implementation should find the portion of `whole` that matches `part` with the same leading whitespace and replace it with `replace` containing the same leading whitespace.
2023-06-09 14:37:08 -07:00
Paul Gauthier
490796de78 wip 2023-06-09 14:32:45 -07:00
Paul Gauthier
e4d9e71f5b simplified append/create 2023-06-09 14:27:17 -07:00
Paul Gauthier
07c5c7f477 Update debugging main in repomap 2023-06-07 14:57:57 -07:00
Paul Gauthier
587261ef12 added adier/models.py 2023-06-07 13:14:55 -07:00
Paul Gauthier
9ac8a60f5f Finish support for gpt-4-32k 2023-06-07 12:42:43 -07:00
Paul Gauthier
571896f0bd Added gpt-4-32k 2023-06-07 12:39:56 -07:00
Paul Gauthier
b70f8ea7bc Use models...max_context_tokens 2023-06-07 12:37:10 -07:00
Paul Gauthier
a874d617d3 rename 2023-06-07 12:29:51 -07:00
Paul Gauthier
9cef379abd refac 2023-06-07 12:28:45 -07:00
Paul Gauthier
c8216d9687 No need to force show_diffs=True for 3.5 2023-06-06 18:17:39 -07:00
Paul Gauthier
99c86ccddf aider: Updated diff_partial_update function to include 5 lines of context in unified_diff function call.
# Context:
USER: expand the context diff to 5 lines of context
ASSISTANT: To expand the context diff to 5 lines of context, you need to modify the `diff_partial_update` function in the `aider/diffs.py` file. Update the `unified_diff` function call to include the `n` parameter with a value of 5.

Here's the change:

```python
aider/diffs.py
<<<<<<< ORIGINAL
    diff = difflib.unified_diff(lines_orig, lines_updated)
=======
    diff = difflib.unified_diff(lines_orig, lines_updated, n=5)
>>>>>>> UPDATED
```
2023-06-06 18:13:36 -07:00
Paul Gauthier
1faef90841 copy 2023-06-06 07:29:47 -07:00
Paul Gauthier
de0df5e7b1 fixed bug in check_model_availability 2023-06-06 07:28:12 -07:00
Paul Gauthier
8f70f1b251 renamed 2023-06-05 22:34:44 -07:00
Paul Gauthier
05c08b36a7 move cur_messages->done_messages, even with --no-auto-commit 2023-06-05 22:30:52 -07:00
Paul Gauthier
8abff61aff better handle malformed file block 2023-06-05 22:23:06 -07:00