Merge branch 'main' into call-graph

This commit is contained in:
Paul Gauthier 2023-06-01 08:59:00 -07:00
commit 6472c152b4
5 changed files with 47 additions and 18 deletions

View file

@ -8,8 +8,8 @@ It also has features that [help GPT understand and modify larger codebases](http
![aider screencast](assets/screencast.svg) ![aider screencast](assets/screencast.svg)
- [Example chat transcripts](#example-chat-transcripts)
- [Getting started](#getting-started) - [Getting started](#getting-started)
- [Example chat transcripts](#example-chat-transcripts)
- [Features](#features) - [Features](#features)
- [Installation](#installation) - [Installation](#installation)
- [Usage](#usage) - [Usage](#usage)
@ -17,6 +17,19 @@ It also has features that [help GPT understand and modify larger codebases](http
- [Tips](#tips) - [Tips](#tips)
- [Limitations](#limitations) - [Limitations](#limitations)
## Getting started
```
$ pip install git+https://github.com/paul-gauthier/aider.git
$ export OPENAI_API_KEY=sk-...
$ aider myapp.py
Added myapp.py to the chat
Using git repo: .git
myapp.py> change the fibonacci function from recursion to iteration
```
## Example chat transcripts ## Example chat transcripts
Here are some example transcripts that show how you can chat with `aider` to write and edit code with GPT-4. Here are some example transcripts that show how you can chat with `aider` to write and edit code with GPT-4.
@ -30,22 +43,8 @@ Here are some example transcripts that show how you can chat with `aider` to wri
* [**Create a Black Box Test Case**](https://aider.chat/examples/add-test.html): GPT creates a "black box" test case without access to the source of the method being tested, using only a * [**Create a Black Box Test Case**](https://aider.chat/examples/add-test.html): GPT creates a "black box" test case without access to the source of the method being tested, using only a
[high level map of the repository based on ctags](https://aider.chat/docs/ctags.html). [high level map of the repository based on ctags](https://aider.chat/docs/ctags.html).
* [**Honor the NO_COLOR env var**](https://aider.chat/examples/no-color.html): The user pastes the NO_COLOR spec from no-color.org into the chat, and GPT-4 modifies the application to conform.
You can find more chat transcripts on the [examples page](https://aider.chat/examples/). You can find more chat transcripts on the [examples page](https://aider.chat/examples/).
## Getting started
```
$ pip install git+https://github.com/paul-gauthier/aider.git
$ aider filename.py
Added filename.py to the chat
Using git repo: .git
filename.py> switch the fibonacci function from recursion to iteration
```
## Features ## Features
* Chat with GPT-4 about your code by launching `aider` from the command line with set of source files to discuss and edit together. GPT can see and edit the content of those files. * Chat with GPT-4 about your code by launching `aider` from the command line with set of source files to discuss and edit together. GPT can see and edit the content of those files.
@ -71,7 +70,7 @@ which helps it understand and modify large codebases.
* From GitHub: `pip install git+https://github.com/paul-gauthier/aider.git` * From GitHub: `pip install git+https://github.com/paul-gauthier/aider.git`
* From your local copy of the repo in develop mode to pick up local edits immediately: `pip install -e .` * From your local copy of the repo in develop mode to pick up local edits immediately: `pip install -e .`
2. Set up your OpenAI API key as an environment variable `OPENAI_API_KEY` or by including `openai-api-key: sk-` in an `.aider.config.yml` file (see `aider --help`). 2. Set up your OpenAI API key as an environment variable `OPENAI_API_KEY` or by including `openai-api-key: sk-...` in an `.aider.config.yml` file (see `aider --help`).
3. Optionally, install [universal ctags](https://github.com/universal-ctags/ctags). This is helpful if you plan to work with repositories with more than a handful of files. This allows `aider --ctags` to build a [map of your entire git repo](https://aider.chat/docs/ctags.html) and share it with GPT to help it better understand and modify large codebases. 3. Optionally, install [universal ctags](https://github.com/universal-ctags/ctags). This is helpful if you plan to work with repositories with more than a handful of files. This allows `aider --ctags` to build a [map of your entire git repo](https://aider.chat/docs/ctags.html) and share it with GPT to help it better understand and modify large codebases.

View file

@ -29,6 +29,11 @@ class Coder:
last_aider_commit_hash = None last_aider_commit_hash = None
last_asked_for_commit_time = 0 last_asked_for_commit_time = 0
def check_model_availability(self, main_model):
available_models = openai.Model.list()
model_ids = [model.id for model in available_models["data"]]
return main_model in model_ids
def __init__( def __init__(
self, self,
io, io,
@ -64,10 +69,16 @@ class Coder:
self.console = Console(force_terminal=True, no_color=True) self.console = Console(force_terminal=True, no_color=True)
self.commands = Commands(self.io, self) self.commands = Commands(self.io, self)
if not self.check_model_availability(main_model):
self.io.tool_error(
f"Your openai key does not support {main_model}, using gpt-3.5-turbo."
)
main_model = "gpt-3.5-turbo"
self.main_model = main_model self.main_model = main_model
if main_model == "gpt-3.5-turbo": if main_model == "gpt-3.5-turbo":
self.io.tool_error( self.io.tool_error(
f"aider doesn't work well with {main_model}, use gpt-4 for best results." f"Aider doesn't work well with {main_model}, use gpt-4 for best results."
) )
self.set_repo(fnames) self.set_repo(fnames)

View file

@ -1,11 +1,19 @@
import os import os
import unittest import unittest
from unittest.mock import MagicMock from unittest.mock import MagicMock, patch
from aider.coder import Coder from aider.coder import Coder
class TestCoder(unittest.TestCase): class TestCoder(unittest.TestCase):
def setUp(self):
self.patcher = patch("aider.coder.Coder.check_model_availability")
self.mock_check = self.patcher.start()
self.mock_check.return_value = True
def tearDown(self):
self.patcher.stop()
def test_check_for_file_mentions(self): def test_check_for_file_mentions(self):
# Mock the IO object # Mock the IO object
mock_io = MagicMock() mock_io = MagicMock()

View file

@ -2,6 +2,7 @@ import os
import shutil import shutil
import tempfile import tempfile
from unittest import TestCase from unittest import TestCase
from unittest.mock import patch
from aider.commands import Commands from aider.commands import Commands
from aider.io import InputOutput from aider.io import InputOutput
@ -13,10 +14,16 @@ class TestCommands(TestCase):
self.tempdir = tempfile.mkdtemp() self.tempdir = tempfile.mkdtemp()
os.chdir(self.tempdir) os.chdir(self.tempdir)
self.patcher = patch("aider.coder.Coder.check_model_availability")
self.mock_check = self.patcher.start()
self.mock_check.return_value = True
def tearDown(self): def tearDown(self):
os.chdir(self.original_cwd) os.chdir(self.original_cwd)
shutil.rmtree(self.tempdir) shutil.rmtree(self.tempdir)
self.patcher.stop()
def test_cmd_add(self): def test_cmd_add(self):
# Initialize the Commands and InputOutput objects # Initialize the Commands and InputOutput objects
io = InputOutput(pretty=False, yes=True) io = InputOutput(pretty=False, yes=True)

View file

@ -18,10 +18,14 @@ class TestMain(TestCase):
self.original_cwd = os.getcwd() self.original_cwd = os.getcwd()
self.tempdir = tempfile.mkdtemp() self.tempdir = tempfile.mkdtemp()
os.chdir(self.tempdir) os.chdir(self.tempdir)
self.patcher = patch("aider.main.Coder.check_model_availability")
self.mock_check = self.patcher.start()
self.mock_check.return_value = True
def tearDown(self): def tearDown(self):
os.chdir(self.original_cwd) os.chdir(self.original_cwd)
shutil.rmtree(self.tempdir) shutil.rmtree(self.tempdir)
self.patcher.stop()
def test_main_with_empty_dir_no_files_on_command(self): def test_main_with_empty_dir_no_files_on_command(self):
pipe_input = create_input(StringIO("")) pipe_input = create_input(StringIO(""))