Commit graph

1626 commits

Author SHA1 Message Date
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
14d42ee79d bump setup.py to 0.6.2 2023-06-17 06:47:24 -07:00
Paul Gauthier
7708b2b271 bump setup.py to 0.6.1 2023-06-17 06:46:13 -07:00
Paul Gauthier
fc30663ce4 aider: work in progress
# Context:
USER: can i use github actions to make it easy to release a new version on github and pypi
ASSISTANT: Yes, you can use GitHub Actions to automate the release process for both GitHub and PyPI. To do this, you'll need to create a new GitHub Actions workflow file and configure it with the necessary steps.

Please follow these steps:

1. Create a new file named `release.yml` in the `.github/workflows/` directory of your repository. If the directory doesn't exist, create it.

```yaml
.github/workflows/release.yml
<<<<<<< ORIGINAL
=======
name: Release

on:
  push:
    tags:
      - 'v*'

jobs:
  build_and_publish:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.x

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install setuptools wheel twine

    - name: Build and publish
      env:
        TWINE_USERNAME: __token__
        TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
      run: |
        python setup.py sdist bdist_wheel
        twine upload dist/*
>>>>>>> UPDATED
```

2. Replace `PYPI_API_TOKEN` in the `TWINE_PASSWORD` line with your actual PyPI API token. You can create an API token by following the instructions in the [PyPI documentation](https://pypi.org/manage/account/token/).

3. Commit and push the changes to your repository.

Now, whenever you push a new tag starting with 'v' (e.g., `v1.0.0`), the GitHub Actions workflow will automatically build and publish your package to PyPI.

Please note that you'll need to have a `setup.py` file in your repository for this workflow to work correctly. If you don't have one, please let me know, and I can help you create one.
2023-06-17 06:44:02 -07:00
Paul Gauthier
89d9d17b2a bump setup.py to 0.6.0 2023-06-17 06:41:45 -07:00
Paul Gauthier
be4ed9477a Merge remote-tracking branch 'origin/main' 2023-06-15 06:26:37 -07:00
Paul Gauthier
8fb4ab2be3 cleaned up Model init 2023-06-15 06:26:16 -07:00
paul-gauthier
4d5eeac9bf
Update README.md 2023-06-14 19:57:29 -07:00
Paul Gauthier
bd91cb7fb7 copy 2023-06-14 19:33:39 -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
6a5f3e6bc5 copy 2023-06-14 07:18:17 -07:00
Paul Gauthier
91fed81c31 copy 2023-06-14 06:21:00 -07:00
Paul Gauthier
b7d229ac03 copy 2023-06-13 19:29:39 -07:00
Paul Gauthier
d54cc275dd copy 2023-06-13 19:28:45 -07:00
Paul Gauthier
29a4f947ee copy 2023-06-13 13:07:24 -07:00
Paul Gauthier
246204868e copy 2023-06-13 13:06:04 -07:00
Paul Gauthier
3b4c43eda1 copy 2023-06-13 13:05:22 -07:00
Paul Gauthier
99cbd10b56 copy 2023-06-13 12:28:40 -07:00
Paul Gauthier
9da118308b copy 2023-06-13 12:27:42 -07:00
Paul Gauthier
25a28e6f9c Improved support for gpt-3.5-turbo-16k 2023-06-13 12:19:56 -07:00
Paul Gauthier
e468763c7d Updated README for gpt-3.5-turbo-16k 2023-06-13 12:06:55 -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
39d24d9e24
Merge pull request #18 from paul-gauthier/issue-17
Added:  --openai-api-base OPENAI_API_BASE
2023-06-10 10:54:22 -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
737394f9b6 aider: Added a test case for replace_part_with_missing_leading_whitespace function.
# Context:
USER: add a test for `replace_part_with_missing_leading_whitespace`
ASSISTANT: To add a test for `replace_part_with_missing_leading_whitespace`, we will modify the `tests/test_utils.py` file.

```python
tests/test_utils.py
<<<<<<< ORIGINAL
if __name__ == "__main__":
    unittest.main()
=======
    def test_replace_part_with_missing_leading_whitespace(self):
        whole = "    line1\n    line2\n    line3\n"
        part = "line1\nline2"
        replace = "new_line1\nnew_line2"
        expected_output = "    new_line1\n    new_line2\n    line3\n"

        result = utils.replace_part_with_missing_leading_whitespace(whole, part, replace)
        self.assertEqual(result, expected_output)

if __name__ == "__main__":
    unittest.main()
>>>>>>> UPDATED
```

This new test case checks if the `replace_part_with_missing_leading_whitespace` function correctly handles the case when the part and replace blocks have missing leading whitespaces.
2023-06-09 14:52:37 -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
030fe5e179 copy 2023-06-09 07:44:12 -07:00
Paul Gauthier
7ba402a323 copy 2023-06-08 18:56:30 -07:00
Paul Gauthier
78b6c7602e copy 2023-06-08 18:56:04 -07:00
Paul Gauthier
fc527ef2cf Updated jekyll taglines 2023-06-08 16:36:51 -07:00
Paul Gauthier
c401729926 Updated README 2023-06-08 16:35:24 -07:00
Paul Gauthier
9f1cbcdd43 Restore aiohttp==3.8.4 2023-06-08 16:27:39 -07:00
Paul Gauthier
2a896daa0c Move back to 0.5.0 2023-06-08 16:24:45 -07:00