Commit graph

10395 commits

Author SHA1 Message Date
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
Paul Gauthier
419fccfa8a wip 2023-06-08 12:44:41 -07:00
Paul Gauthier
59e8f798d1 aider: Updated aiohttp version constraint in requirements.txt.
# Context:
USER: $ pip install -i https://test.pypi.org/simple/ aider-chat
Looking in indexes: https://test.pypi.org/simple/
Collecting aider-chat
  Downloading a61a5f1941/aider_chat-0.5.3-py3-none-any.whl (42 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.0/42.0 kB 614.5 kB/s eta 0:00:00
INFO: pip is looking at multiple versions of aider-chat to determine which version is compatible with other requirements. This could take a while.
  Downloading e8a3663c60/aider_chat-0.5.2-py3-none-any.whl (42 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.1/42.1 kB 1.2 MB/s eta 0:00:00
  Downloading f69bb4653a/aider_chat-0.5.1-py3-none-any.whl (42 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.1/42.1 kB 1.3 MB/s eta 0:00:00
  Downloading 005ae4324a/aider_chat-0.5.0-py3-none-any.whl (38 kB)
ERROR: Cannot install aider-chat==0.5.0, aider-chat==0.5.1, aider-chat==0.5.2 and aider-chat==0.5.3 because these package versions have conflicting dependencies.

The conflict is caused by:
    aider-chat 0.5.3 depends on aiohttp==3.8.4
    aider-chat 0.5.2 depends on aiohttp==3.8.4
    aider-chat 0.5.1 depends on aiohttp==3.8.4
    aider-chat 0.5.0 depends on aiohttp==3.8.4

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-with-dependency-conflicts

ASSISTANT: It seems there is a dependency conflict when trying to install `aider-chat` from TestPyPI. The conflict is caused by the `aiohttp` package version. To resolve this issue, you can try the following steps:

1. Update the `requirements.txt` file to loosen the version constraint for `aiohttp`. For example, you can change it to `aiohttp>=3.8.4` to allow any version greater than or equal to 3.8.4.
2. Update the `setup.py` file to read the updated `requirements.txt` file.
3. Re-upload the package to TestPyPI with the updated dependencies.

Here's the change you need to make in the `requirements.txt` file:

```plaintext

^C KeyboardInterrupt
USER: why is it trying to install multiple versions of aider-chat?
ASSISTANT: The reason pip is looking at multiple versions of `aider-chat` is that it's trying to find a version that is compatible with the other packages and their dependencies in your environment. This process is part of pip's dependency resolution mechanism.

In this case, it seems that all the versions of `aider-chat` have a conflicting dependency on `aiohttp==3.8.4`. To resolve this issue, you can try loosening the version constraint for `aiohttp` in the `requirements.txt` file, as I mentioned in my previous response. This should help pip find a compatible version of `aider-chat` that works with the other packages in your environment.
USER: I added these *read-write* files: requirements.txt
ASSISTANT: Great! Now, let's update the `requirements.txt` file to loosen the version constraint for `aiohttp`. Change the line with `aiohttp==3.8.4` to `aiohttp>=3.8.4`. Here's the change you need to make:

```plaintext
requirements.txt
<<<<<<< ORIGINAL
aiohttp==3.8.4
=======
aiohttp>=3.8.4
>>>>>>> UPDATED
```

After making this change, you can re-upload the package to TestPyPI with the updated dependencies and try installing it again.
2023-06-07 17:15:13 -07:00
Paul Gauthier
1eb9ab1b70 aider: Added regex to remove lines containing bullets with anchor links from long_description in setup.py.
# Context:
USER: also filter out the bullets which are just #anchor links to elsewhere in the readme
ASSISTANT: To filter out the bullets with anchor links in the `long_description` in `setup.py`, you can use a regular expression to remove the lines containing those links. Here's the change you need to make in `setup.py`:

```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)
=======
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)
>>>>>>> UPDATED
```

This change adds another `re.sub()` function to remove lines containing bullets with anchor links from the `long_description`.
2023-06-07 17:11:16 -07:00
Paul Gauthier
f8f2eb0f76 aider: Filtered out image links from long_description in setup.py.
# Context:
USER: pypi descriptions don't support markdown image links. filter out images before passing it
ASSISTANT: To filter out image links from the `long_description` in `setup.py`, you can use a regular expression to remove the lines containing image links. Here's the change you need to make in `setup.py`:

```python
setup.py
<<<<<<< ORIGINAL
with open("README.md", "r", encoding="utf-8") as f:
    long_description = f.read()
=======
import re

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

This change imports the `re` module and uses the `re.sub()` function to remove lines containing image links from the `long_description`.
2023-06-07 16:59:35 -07:00
Paul Gauthier
ece1cdd557 aider: Updated the setup.py to use the README.md as the long description source.
# Context:
USER: update the `setup.py` to use README.md as the long description source
ASSISTANT: To update the `setup.py` to use the `README.md` as the long description source, follow these steps:

1. Read the contents of the `README.md` file and store it in a variable.
2. Add the `long_description` and `long_description_content_type` arguments to the `setup()` function.

Here's the updated `setup.py`:

```python
setup.py
<<<<<<< ORIGINAL
from setuptools import find_packages, setup

with open("requirements.txt") as f:
    requirements = f.read().splitlines()

setup(
    name="aider-chat",
    version="0.5.0",
    packages=find_packages(),
    install_requires=requirements,
    entry_points={
        "console_scripts": [
            "aider = aider.main:main",
        ],
    },
)
=======
from setuptools import find_packages, setup

with open("requirements.txt") as f:
    requirements = f.read().splitlines()

with open("README.md", "r", encoding="utf-8") as f:
    long_description = f.read()

setup(
    name="aider-chat",
    version="0.5.0",
    packages=find_packages(),
    install_requires=requirements,
    entry_points={
        "console_scripts": [
            "aider = aider.main:main",
        ],
    },
    long_description=long_description,
    long_description_content_type="text/markdown",
)
>>>>>>> UPDATED
```
2023-06-07 16:56:24 -07:00
Paul Gauthier
d65e782e80 Changed package name aider -> aider-chat 2023-06-07 16:43:46 -07:00
Paul Gauthier
07c5c7f477 Update debugging main in repomap 2023-06-07 14:57:57 -07:00
Paul Gauthier
85a14309ca bump version 2023-06-07 13:53:04 -07:00
Paul Gauthier
587261ef12 added adier/models.py 2023-06-07 13:14:55 -07:00
Paul Gauthier
31c7274639 no bash markup 2023-06-07 13:12:49 -07:00
Paul Gauthier
de9868063b Updated README 2023-06-07 13:11:51 -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
70b981029c
Update README.md 2023-06-07 10:32:12 -07:00
Paul Gauthier
2149eaceab copy 2023-06-07 09:39:28 -07:00
Paul Gauthier
3ab59252c8 copy 2023-06-07 09:38:28 -07:00
Paul Gauthier
68cbd3a968 copy 2023-06-07 09:37:49 -07:00
Paul Gauthier
96104d6281 copy 2023-06-07 09:37:10 -07:00
Paul Gauthier
eb48a0f589 copy 2023-06-07 09:35:32 -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
00f2fb9bf6 copy 2023-06-06 14:05:06 -07:00
Paul Gauthier
74b1bc9f68 copy 2023-06-06 14:04:29 -07:00
Paul Gauthier
1bd321742b copy 2023-06-06 14:02:38 -07:00
Paul Gauthier
34e764bbf5 copy 2023-06-06 13:04:50 -07:00
Paul Gauthier
dbeed906ad copy 2023-06-06 13:04:21 -07:00
Paul Gauthier
4753db6eac copy 2023-06-06 12:50:18 -07:00
Paul Gauthier
261419ae5b copy 2023-06-06 12:49:47 -07:00