mirror of
https://github.com/Aider-AI/aider.git
synced 2025-06-12 07:35:00 +00:00
moved website/ -> aider/website/
This commit is contained in:
parent
eb80b32915
commit
22a494bb59
155 changed files with 9 additions and 9 deletions
45
aider/website/docs/benchmarks-0125.md
Normal file
45
aider/website/docs/benchmarks-0125.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
---
|
||||
title: The January GPT-4 Turbo is lazier than the last version
|
||||
excerpt: The new `gpt-4-0125-preview` model is quantiatively lazier at coding than previous GPT-4 versions, according to a new "laziness" benchmark.
|
||||
highlight_image: /assets/benchmarks-0125.jpg
|
||||
nav_exclude: true
|
||||
---
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
|
||||
{% endif %}
|
||||
|
||||
# The January GPT-4 Turbo is lazier than the last version
|
||||
|
||||
[](https://aider.chat/assets/benchmarks-0125.svg)
|
||||
|
||||
[OpenAI just released a new version of GPT-4 Turbo](https://openai.com/blog/new-embedding-models-and-api-updates).
|
||||
This new model is intended to reduce the "laziness" that has been widely observed with the previous `gpt-4-1106-preview` model:
|
||||
|
||||
> Today, we are releasing an updated GPT-4 Turbo preview model, gpt-4-0125-preview. This model completes tasks like code generation more thoroughly than the previous preview model and is intended to reduce cases of “laziness” where the model doesn’t complete a task.
|
||||
|
||||
With that in mind, I've been benchmarking the new model using
|
||||
aider's existing
|
||||
[lazy coding benchmark](https://aider.chat/docs/unified-diffs.html).
|
||||
|
||||
## Benchmark results
|
||||
|
||||
Overall,
|
||||
the new `gpt-4-0125-preview` model seems lazier
|
||||
than the November `gpt-4-1106-preview` model:
|
||||
|
||||
- It gets worse benchmark scores when using the [unified diffs](https://aider.chat/docs/unified-diffs.html) code editing format.
|
||||
- Using aider's older SEARCH/REPLACE block editing format, the new January model outperforms the older November model. But it still performs worse than both models using unified diffs.
|
||||
|
||||
## Related reports
|
||||
|
||||
This is one in a series of reports
|
||||
that use the aider benchmarking suite to assess and compare the code
|
||||
editing capabilities of OpenAI's GPT models.
|
||||
You can review the other reports
|
||||
for additional information:
|
||||
|
||||
- [GPT code editing benchmarks](https://aider.chat/docs/benchmarks.html) evaluates the March and June versions of GPT-3.5 and GPT-4.
|
||||
- [Code editing benchmarks for OpenAI's "1106" models](https://aider.chat/docs/benchmarks-1106.html).
|
||||
- [Aider's lazy coding benchmark](https://aider.chat/docs/unified-diffs.html).
|
||||
|
||||
|
92
aider/website/docs/benchmarks-1106.md
Normal file
92
aider/website/docs/benchmarks-1106.md
Normal file
|
@ -0,0 +1,92 @@
|
|||
---
|
||||
title: Code editing benchmarks for OpenAI's "1106" models
|
||||
excerpt: A quantitative comparison of the code editing capabilities of the new GPT-3.5 and GPT-4 versions that were released in Nov 2023.
|
||||
highlight_image: /assets/benchmarks-1106.jpg
|
||||
nav_exclude: true
|
||||
---
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
|
||||
{% endif %}
|
||||
|
||||
# Code editing benchmarks for OpenAI's "1106" models
|
||||
|
||||
[](https://aider.chat/assets/benchmarks-1106.svg)
|
||||
|
||||
[](https://aider.chat/assets/benchmarks-speed-1106.svg)
|
||||
|
||||
[OpenAI just released new versions of GPT-3.5 and GPT-4](https://openai.com/blog/new-models-and-developer-products-announced-at-devday),
|
||||
and there's a lot
|
||||
of interest about their ability to code compared to the previous versions.
|
||||
With that in mind, I've been benchmarking the new models.
|
||||
|
||||
[Aider](https://github.com/paul-gauthier/aider)
|
||||
is an open source command line chat tool that lets you work with GPT to edit
|
||||
code in your local git repo.
|
||||
To do this, aider needs to be able to reliably recognize when GPT wants to edit
|
||||
your source code,
|
||||
determine which files it wants to modify
|
||||
and accurately apply the changes it's trying to make.
|
||||
Doing a good job on this "code editing" task requires a good LLM, good prompting and
|
||||
a good tool driving the interactions with the LLM.
|
||||
|
||||
Aider relies on a
|
||||
[code editing benchmark](https://aider.chat/docs/benchmarks.html)
|
||||
to quantitatively evaluate
|
||||
performance
|
||||
whenever one of these things changes.
|
||||
For example,
|
||||
whenever I change aider's prompting or the backend which drives LLM conversations,
|
||||
I run the benchmark to make sure these changes produce improvements (not regressions).
|
||||
|
||||
The benchmark uses aider to try and complete
|
||||
[133 Exercism Python coding exercises](https://github.com/exercism/python).
|
||||
For each exercise, Exercism provides a starting python file with stubs for the needed functions,
|
||||
a natural language description of the problem to solve
|
||||
and a test suite to evaluate whether the coder has correctly solved the problem.
|
||||
|
||||
The benchmark gives aider two tries to complete the task:
|
||||
|
||||
1. On the first try, aider gives GPT the stub code file to edit and the natural language instructions that describe the problem. This reflects how you code with aider. You add your source code files to the chat and ask for changes, which are automatically applied.
|
||||
2. If the test suite fails after the first try, aider gives GPT the test error output and asks it to fix the code. Aider supports this sort of interaction using a command like `/run pytest` to run and share pytest results in the chat with GPT. You can `/run` whatever tests/linters/etc make sense for your language/framework/situation.
|
||||
|
||||
## Benchmark results
|
||||
|
||||
### gpt-4-1106-preview
|
||||
|
||||
For now, I have only benchmarked the GPT-4 models using the `diff` edit method.
|
||||
This is the edit format that aider uses by default with gpt-4.
|
||||
|
||||
- The new `gpt-4-1106-preview` model seems **2-2.5X faster** than the June GPT-4 model.
|
||||
- **It seems better at producing correct code on the first try**. It gets
|
||||
53% of the coding exercises correct, without needing to see errors from the test suite. Previous models only get 46-47% of the exercises correct on the first try.
|
||||
- The new model seems to perform similar
|
||||
(~65%) to the old models (63-64%) after their second chance to correct bugs by reviewing test suite error output.
|
||||
|
||||
### gpt-3.5-turbo-1106
|
||||
|
||||
I benchmarked the GPT-3.5 models with both the `whole` and `diff` edit format.
|
||||
None of the gpt-3.5 models seem able to effectively use the `diff` edit format, including the newest November (1106) model.
|
||||
|
||||
The comments below only focus on comparing the `whole` edit format results:
|
||||
|
||||
- The new `gpt-3.5-turbo-1106` model is completing the benchmark **3-4X faster** than the earlier GPT-3.5 models.
|
||||
- The success rate after the first try of 42% is comparable to the previous June (0613) model. The new November and previous June models are both worse than the original March (0301) model's 50% result on the first try.
|
||||
- The new model's 56% success rate after the second try seems comparable to the original March model, and somewhat better than the June model's 50% score.
|
||||
|
||||
|
||||
## Related reports
|
||||
|
||||
This is one in a series of reports
|
||||
that use the aider benchmarking suite to assess and compare the code
|
||||
editing capabilities of OpenAI's GPT models.
|
||||
You can review the other reports
|
||||
for additional information:
|
||||
|
||||
- [GPT code editing benchmarks](https://aider.chat/docs/benchmarks.html) evaluates the March and June versions of GPT-3.5 and GPT-4.
|
||||
- [Code editing speed benchmarks for OpenAI's "1106" models](https://aider.chat/2023/11/06/benchmarks-speed-1106.html) compares the performance of the new GPT models.
|
||||
|
||||
|
||||
## Updates
|
||||
|
||||
Last updated 11/14/23.
|
||||
OpenAI has relaxed rate limits so these results are no longer considered preliminary.
|
59
aider/website/docs/benchmarks-speed-1106.md
Normal file
59
aider/website/docs/benchmarks-speed-1106.md
Normal file
|
@ -0,0 +1,59 @@
|
|||
---
|
||||
title: Speed benchmarks of GPT-4 Turbo and gpt-3.5-turbo-1106
|
||||
excerpt: This report provides a detailed comparison of the speed of GPT-4 Turbo and gpt-3.5-turbo-1106 models based on the aider benchmarking suite.
|
||||
canonical_url: https://aider.chat/2023/11/06/benchmarks-speed-1106.html
|
||||
highlight_image: /assets/benchmarks-speed-1106.jpg
|
||||
nav_exclude: true
|
||||
---
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
|
||||
{% endif %}
|
||||
|
||||
# Speed benchmarks of GPT-4 Turbo and gpt-3.5-turbo-1106
|
||||
|
||||
<p class="post-date">{{ page.date | date: "%b %-d, %Y" }}</p>
|
||||
|
||||
[](https://aider.chat/assets/benchmarks-speed-1106.svg)
|
||||
|
||||
[OpenAI just released new versions of GPT-3.5 and GPT-4](https://openai.com/blog/new-models-and-developer-products-announced-at-devday),
|
||||
and there's a lot
|
||||
of interest about their capabilities and performance.
|
||||
With that in mind, I've been benchmarking the new models.
|
||||
|
||||
[Aider](https://github.com/paul-gauthier/aider)
|
||||
is an open source command line chat tool that lets you work with GPT to edit
|
||||
code in your local git repo.
|
||||
Aider relies on a
|
||||
[code editing benchmark](https://aider.chat/docs/benchmarks.html)
|
||||
to quantitatively evaluate
|
||||
performance.
|
||||
|
||||
This is the latest in a series of reports
|
||||
that use the aider benchmarking suite to assess and compare the code
|
||||
editing capabilities of OpenAI's GPT models. You can review previous
|
||||
reports to get more background on aider's benchmark suite:
|
||||
|
||||
- [GPT code editing benchmarks](https://aider.chat/docs/benchmarks.html) evaluates the March and June versions of GPT-3.5 and GPT-4.
|
||||
- [Code editing skill benchmarks for OpenAI's "1106" models](https://aider.chat/docs/benchmarks-1106.html) compares the olders models to the November (1106) models.
|
||||
|
||||
## Speed
|
||||
|
||||
This report compares the **speed** of the various GPT models.
|
||||
Aider's benchmark measures the response time of the OpenAI chat completion
|
||||
endpoint each time it asks GPT to solve a programming exercise in the benchmark
|
||||
suite. These results measure only the time spent waiting for OpenAI to
|
||||
respond to the prompt.
|
||||
So they are measuring
|
||||
how fast these models can
|
||||
generate responses which primarily consist of source code.
|
||||
|
||||
Some observations:
|
||||
|
||||
- **GPT-3.5 got 6-11x faster.** The `gpt-3.5-turbo-1106` model is 6-11x faster than the June (0613) version which has been the default `gpt-3.5-turbo` model.
|
||||
- **GPT-4 Turbo is 2-2.5x faster.** The new `gpt-4-1106-preview` model is 2-2.5x faster than the June (0613) version which has been the default `gpt-4` model.
|
||||
- The old March (0301) version of GPT-3.5 is actually faster than the June (0613) version. This was a surprising discovery.
|
||||
|
||||
## Updates
|
||||
|
||||
Last updated 11/14/23.
|
||||
OpenAI has relaxed rate limits so these results are no longer considered preliminary.
|
368
aider/website/docs/benchmarks.md
Normal file
368
aider/website/docs/benchmarks.md
Normal file
|
@ -0,0 +1,368 @@
|
|||
---
|
||||
title: GPT code editing benchmarks
|
||||
excerpt: Benchmarking GPT-3.5 and GPT-4 code editing skill using a new code editing benchmark suite based on the Exercism python exercises.
|
||||
highlight_image: /assets/benchmarks.jpg
|
||||
nav_exclude: true
|
||||
---
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
|
||||
{% endif %}
|
||||
|
||||
# GPT code editing benchmarks
|
||||
|
||||
[](https://aider.chat/assets/benchmarks.svg)
|
||||
|
||||
Aider is an open source command line chat tool that lets you work with GPT to edit
|
||||
code in your local git repo.
|
||||
To do this, aider needs to be able to reliably recognize when GPT wants to edit local files,
|
||||
determine which files it wants to modify and what changes to save.
|
||||
Such automated
|
||||
code editing hinges on using the system prompt
|
||||
to tell GPT how to structure code edits in its responses.
|
||||
|
||||
Aider currently asks GPT to use simple text based "edit formats", but
|
||||
[OpenAI's new function calling
|
||||
API](https://openai.com/blog/function-calling-and-other-api-updates)
|
||||
looks like a promising way to create more structured edit formats.
|
||||
After implementing a couple of function based edit formats,
|
||||
I wanted
|
||||
to measure the potential benefits
|
||||
of switching aider to use them by default.
|
||||
|
||||
With this in mind, I developed a
|
||||
benchmark based on the [Exercism
|
||||
python](https://github.com/exercism/python) coding exercises.
|
||||
This
|
||||
benchmark evaluates how effectively aider and GPT can translate a
|
||||
natural language coding request into executable code saved into
|
||||
files that pass unit tests.
|
||||
It provides an end-to-end evaluation of not just
|
||||
GPT's coding ability, but also its capacity to *edit existing code*
|
||||
and *format those code edits* so that aider can save the
|
||||
edits to the local source files.
|
||||
|
||||
I ran the benchmark
|
||||
on all the ChatGPT models (except `gpt-4-32k`), using a variety of edit formats.
|
||||
The results were interesting:
|
||||
|
||||
- **Plain text edit formats worked best.** Asking GPT to return an updated copy of the whole file in a standard markdown fenced code block proved to be the most reliable and effective edit format across all GPT-3.5 and GPT-4 models. The results for this `whole` edit format are shown in solid blue in the graph.
|
||||
- **Function calls performed worse.** Using the new functions API for edits performed worse than the above whole file method, for all the models. GPT-3.5 especially produced inferior code and frequently mangled this output format. This was surprising, as the functions API was introduced to enhance the reliability of structured outputs. The results for these `...-func` edit methods are shown as patterned bars in the graph (both green and blue).
|
||||
- **The new June GPT-3.5 models did a bit worse than the old June model.** The performance of the new June (`0613`) versions of GPT-3.5 appears to be a bit worse than the February (`0301`) version. This is visible if you look at the "first attempt" markers on the first three solid blue bars and also by comparing the first three solid green `diff` bars.
|
||||
- **GPT-4 does better than GPT-3.5,** as expected.
|
||||
|
||||
The quantitative benchmark results agree with my intuitions
|
||||
about prompting GPT for complex tasks like coding. It's beneficial to
|
||||
minimize the "cognitive overhead" of formatting the response, allowing
|
||||
GPT to concentrate on the coding task at hand.
|
||||
|
||||
As a thought experiment, imagine a slack conversation with a junior developer where
|
||||
you ask them to write the code to add some new feature to your app.
|
||||
They're going to type the response back to you by hand in the chat.
|
||||
Should they type out the
|
||||
code and wrap it in a normal markdown code block?
|
||||
Or should they type up a properly escaped and
|
||||
syntactically correct json data structure
|
||||
that contains the text of the new code?
|
||||
|
||||
Using more complex output formats with GPT seems to cause two issues:
|
||||
|
||||
- It makes GPT write worse code. Keeping the output format simple seems to allow GPT to devote more attention to the actual coding task.
|
||||
- It reduces GPT's adherence to the output format, making it more challenging for tools like aider to accurately identify and apply the edits GPT is attempting to make.
|
||||
|
||||
I was expecting to start using function call based edits in aider for both GPT-3.5 and GPT-4.
|
||||
But given these benchmark results, I won't be adopting the functions API
|
||||
at this time.
|
||||
I will certainly plan to benchmark functions again with future versions of the models.
|
||||
|
||||
More details on the benchmark, edit formats and results are discussed below.
|
||||
|
||||
|
||||
## The benchmark
|
||||
|
||||
The benchmark uses
|
||||
[133 practice exercises from the Exercism python repository](https://github.com/exercism/python/tree/main/exercises/practice).
|
||||
These
|
||||
exercises were designed to help individuals learn Python and hone
|
||||
their coding skills.
|
||||
|
||||
Each exercise includes:
|
||||
|
||||
- [Instructions](https://github.com/exercism/python/blob/main/exercises/practice/anagram/.docs/instructions.md), provided in markdown files.
|
||||
- [Stub python code](https://github.com/exercism/python/blob/main/exercises/practice/anagram/anagram.py) in an *implementation file*, specifying the functions or classes that need to be implemented.
|
||||
- [Unit tests](https://github.com/exercism/python/blob/main/exercises/practice/anagram/anagram_test.py) in a separate python file.
|
||||
|
||||
The goal is for GPT to read the instructions, implement the provided function/class skeletons
|
||||
and pass all the unit tests. The benchmark measures what percentage of
|
||||
the 133 exercises are completed successfully, causing all the associated unit tests to pass.
|
||||
|
||||
To start each exercise, aider sends GPT
|
||||
the initial contents of the implementation file,
|
||||
the Exercism instructions
|
||||
and a final instruction:
|
||||
|
||||
```
|
||||
Use the above instructions to modify the supplied files: <implementation file>
|
||||
Keep and implement the existing function or class stubs, they will be called from unit tests.
|
||||
Only use standard python libraries, don't suggest installing any packages.
|
||||
```
|
||||
|
||||
Aider updates the implementation file based on GPT's reply and runs
|
||||
the unit tests. If all tests pass, the exercise is considered
|
||||
complete. If some tests fail, aider sends GPT a second message with
|
||||
the test error output. It only sends the first 50 lines of test errors
|
||||
to try and avoid exceeding the context window of the smaller models. Aider
|
||||
also includes this final instruction:
|
||||
|
||||
```
|
||||
See the testing errors above.
|
||||
The tests are correct.
|
||||
Fix the code in <implementation file> to resolve the errors.
|
||||
```
|
||||
|
||||
Requiring GPT to fix its first implementation in response to test failures
|
||||
is another way in which this benchmark stresses code editing skill.
|
||||
This second chance is also important because it
|
||||
gives GPT the opportunity to adjust if the
|
||||
instructions were imprecise with respect to the
|
||||
specific requirements of the unit tests.
|
||||
Many of the exercises have multiple paragraphs of instructions,
|
||||
and most human coders would likely fail some tests on their
|
||||
first try.
|
||||
|
||||
The bars in the graph show the percent of exercises that were completed by
|
||||
each model and edit format combination. The full bar height represents
|
||||
the final outcome following both coding attempts.
|
||||
Each bar also has a horizontal mark that shows
|
||||
the intermediate performance after the first coding attempt,
|
||||
without the benefit of the second try that includes the test error output.
|
||||
|
||||
It's worth noting that GPT never gets to see the source code of the
|
||||
unit tests during the benchmark. It only sees the error output from
|
||||
failed tests. Of course, all of this code was probably part of its
|
||||
original training data!
|
||||
|
||||
In summary, passing an exercise means GPT was able to:
|
||||
|
||||
- Write the required code (possibly after reviewing test error output),
|
||||
- Correctly package all of the code edits into the edit format so that aider can process and save it to the implementation file.
|
||||
|
||||
Conversely, failing an exercise only requires a breakdown in one of
|
||||
those steps. In practice, GPT fails at different steps in different
|
||||
exercises. Sometimes it simply writes the wrong code. Other times, it
|
||||
fails to format the code edits in a way that conforms to the edit
|
||||
format, resulting in the code not being saved correctly.
|
||||
|
||||
It's worth keeping in mind that changing the edit format often affects
|
||||
both aspects of GPT's performance.
|
||||
Complex edit formats often lead GPT to write worse code *and* make it less
|
||||
successful at formatting the edits correctly.
|
||||
|
||||
|
||||
## Edit formats
|
||||
|
||||
I benchmarked 4 different edit formats, described below.
|
||||
Each description includes a sample response that GPT might provide to a user who
|
||||
requests:
|
||||
"Change the print from hello to goodbye."
|
||||
|
||||
### whole
|
||||
|
||||
The
|
||||
[whole](https://github.com/paul-gauthier/aider/blob/main/aider/coders/wholefile_prompts.py)
|
||||
format asks GPT to return an updated copy of the entire file, including any changes.
|
||||
The file should be
|
||||
formatted with normal markdown triple-backtick fences, inlined with the rest of its response text.
|
||||
|
||||
This format is very similar to how ChatGPT returns code snippets during normal chats, except with the addition of a filename right before the opening triple-backticks.
|
||||
|
||||
````
|
||||
Here is the updated copy of your file demo.py:
|
||||
|
||||
demo.py
|
||||
```python
|
||||
def main():
|
||||
print("goodbye")
|
||||
```
|
||||
````
|
||||
|
||||
### diff
|
||||
|
||||
The [diff](https://github.com/paul-gauthier/aider/blob/main/aider/coders/editblock_prompts.py)
|
||||
format also asks GPT to return edits as part of the normal response text,
|
||||
in a simple diff format.
|
||||
Each edit is a fenced code block that
|
||||
specifies the filename and a chunk of ORIGINAL and UPDATED code.
|
||||
GPT provides some original lines from the file and then a new updated set of lines.
|
||||
|
||||
````
|
||||
Here are the changes you requested to demo.py:
|
||||
|
||||
```python
|
||||
demo.py
|
||||
<<<<<<< ORIGINAL
|
||||
print("hello")
|
||||
=======
|
||||
print("goodbye")
|
||||
>>>>>>> UPDATED
|
||||
```
|
||||
````
|
||||
|
||||
### whole-func
|
||||
|
||||
The [whole-func](https://github.com/paul-gauthier/aider/blob/main/aider/coders/wholefile_func_coder.py)
|
||||
format requests updated copies of whole files to be returned using the function call API.
|
||||
|
||||
|
||||
```
|
||||
{
|
||||
"explanation": "Changed hello to goodbye.",
|
||||
"files": [
|
||||
{
|
||||
"path": "demo.py",
|
||||
"content": "def main():\n print(\"goodbye\")\n"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### diff-func
|
||||
|
||||
The
|
||||
[diff-func](https://github.com/paul-gauthier/aider/blob/main/aider/coders/editblock_func_coder.py)
|
||||
format requests a list of
|
||||
original/updated style edits to be returned using the function call API.
|
||||
|
||||
```
|
||||
{
|
||||
"explanation": "Changed hello to goodbye.",
|
||||
"edits": [
|
||||
{
|
||||
"path": "demo.py",
|
||||
"original_lines": [
|
||||
" print(\"hello\")"
|
||||
],
|
||||
"updated_lines": [
|
||||
" print(\"goodbye\")"
|
||||
],
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## GPT-3.5's performance
|
||||
|
||||
### The `0613` models seem worse?
|
||||
|
||||
The GPT-3.5 benchmark results have me fairly convinced that the new
|
||||
`gpt-3.5-turbo-0613` and `gpt-3.5-16k-0613` models
|
||||
are a bit worse at code editing than
|
||||
the older `gpt-3.5-turbo-0301` model.
|
||||
|
||||
This is visible in the "first attempt"
|
||||
portion of each result, before GPT gets a second chance to edit the code.
|
||||
Look at the horizontal white line in the middle of the first three blue bars.
|
||||
Performance with the `whole` edit format was 46% for the
|
||||
February model and only 39% for the June models.
|
||||
|
||||
But also note how much the solid green `diff` bars
|
||||
degrade between the February and June GPT-3.5 models.
|
||||
They drop from 30% down to about 19%.
|
||||
|
||||
I saw other signs of this degraded performance
|
||||
in earlier versions of the
|
||||
benchmark as well.
|
||||
|
||||
### Pathological use of `diff`
|
||||
|
||||
When GPT-3.5 is able to correctly generate the `diff` edit format,
|
||||
it often uses it in a pathological manner. It places the *entire*
|
||||
original source file in the ORIGINAL block and the entire updated file
|
||||
in the UPDATED block. This is strictly worse than just using the
|
||||
`whole` edit format, as GPT is sending two full copies of the file.
|
||||
|
||||
### Hallucinated function calls
|
||||
|
||||
When GPT-3.5 uses the functions API
|
||||
it is prone to ignoring the JSON Schema that specifies valid functions.
|
||||
It often returns a completely novel and semantically
|
||||
invalid `function_call` fragment with `"name": "python"`.
|
||||
|
||||
The `arguments` attribute is supposed to be a set of key/value pairs
|
||||
with the arguments to the function specified in the `name` field.
|
||||
Instead, GPT-3.5 frequently just stuffs an entire python
|
||||
file into that field.
|
||||
|
||||
```
|
||||
"function_call": {
|
||||
"name": "python",
|
||||
"arguments": "def main():\n print(\"hello\")\n"
|
||||
},
|
||||
```
|
||||
|
||||
It seems like it might be getting confused by fine-tuning that was
|
||||
done for the ChatGPT code interpreter plugin?
|
||||
|
||||
|
||||
|
||||
|
||||
## Randomness
|
||||
|
||||
The benchmark attempts to be deterministic, always sending identical
|
||||
requests for each exercise on repeated runs.
|
||||
As part of this effort,
|
||||
when sending test error output to GPT,
|
||||
it removes the wall-clock timing information that
|
||||
is normally included by the `unittest` module.
|
||||
|
||||
The benchmark harness also logs SHA hashes of
|
||||
all the OpenAI API requests and replies.
|
||||
This makes it possible to
|
||||
detect randomness or nondeterminism
|
||||
in the benchmarking process.
|
||||
|
||||
It turns out that the OpenAI chat APIs are not deterministic, even at
|
||||
`temperature=0`. The same identical request will produce multiple
|
||||
distinct responses, usually less than 5-10 variations. This suggests
|
||||
that OpenAI may be load balancing their API across a number of
|
||||
slightly different instances of the model?
|
||||
|
||||
For certain exercises, some of these variable responses pass the unit tests while
|
||||
other variants do not. Results for exercises like this, which are
|
||||
"on the bubble",
|
||||
are therefore a bit random, depending on which variant OpenAI returns.
|
||||
|
||||
Given that, it would be ideal to run all 133 exercises many times for each
|
||||
model/edit-format combination and report an average performance.
|
||||
This would average away the effect of the API variance.
|
||||
It would also significantly increase the cost of this sort of benchmarking.
|
||||
So I didn't do that.
|
||||
|
||||
Benchmarking against 133 exercises already provides some robustness, since
|
||||
we are measuring the performance across many exercises.
|
||||
|
||||
But to get a sense of how much the API variance impacts the benchmark outcomes,
|
||||
I ran all 133 exercises 10 times each
|
||||
against `gpt-3.5-turbo-0613` with the `whole` edit format.
|
||||
You'll see one set of error bars in the graph, which show
|
||||
the range of results from those 10 runs.
|
||||
|
||||
The OpenAI API randomness doesn't seem to
|
||||
cause a large variance in the overall benchmark results.
|
||||
|
||||
## Conclusions
|
||||
|
||||
Based on these benchmark results, aider will continue to use
|
||||
the `whole` edit format for GPT-3.5, and `diff` for GPT-4.
|
||||
|
||||
GPT-4 gets comparable results with the `whole` and `diff` edit formats,
|
||||
but using `whole` significantly increases costs and latency compared to `diff`.
|
||||
|
||||
The latency of streaming back the entire updated copy of each edited file
|
||||
is a real challenge with the `whole` format.
|
||||
The GPT-3.5 models are quite responsive, and can
|
||||
stream back entire files at reasonable speed.
|
||||
Aider displays a progress bar and
|
||||
live diffs of the files as they stream in,
|
||||
which helps pass the time.
|
||||
|
||||
The GPT-4 models are much slower, and waiting for even small files
|
||||
to be completely "retyped" on each request is probably unacceptable.
|
57
aider/website/docs/browser.md
Normal file
57
aider/website/docs/browser.md
Normal file
|
@ -0,0 +1,57 @@
|
|||
---
|
||||
title: Aider in your browser
|
||||
highlight_image: /assets/browser.jpg
|
||||
parent: Usage
|
||||
nav_order: 800
|
||||
description: Aider can run in your browser, not just on the command line.
|
||||
---
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
|
||||
{% endif %}
|
||||
|
||||
# Aider in your browser
|
||||
|
||||
<div class="video-container">
|
||||
<video controls loop poster="/assets/browser.jpg">
|
||||
<source src="/assets/aider-browser-social.mp4" type="video/mp4">
|
||||
<a href="/assets/aider-browser-social.mp4">Aider browser UI demo video</a>
|
||||
</video>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.video-container {
|
||||
position: relative;
|
||||
padding-bottom: 101.89%; /* 1080 / 1060 = 1.0189 */
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.video-container video {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
Use aider's new experimental browser UI to collaborate with LLMs
|
||||
to edit code in your local git repo.
|
||||
Aider will directly edit the code in your local source files,
|
||||
and [git commit the changes](https://aider.chat/docs/git.html)
|
||||
with sensible commit messages.
|
||||
You can start a new project or work with an existing git repo.
|
||||
Aider works well with GPT 3.5, GPT-4, GPT-4 Turbo with Vision,
|
||||
and Claude 3 Opus.
|
||||
It also supports [connecting to almost any LLM](https://aider.chat/docs/llms.html).
|
||||
|
||||
Use the `--browser` switch to launch the browser version of aider:
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export OPENAI_API_KEY=<key> # Mac/Linux
|
||||
setx OPENAI_API_KEY <key> # Windows
|
||||
|
||||
aider --browser
|
||||
```
|
79
aider/website/docs/commands.md
Normal file
79
aider/website/docs/commands.md
Normal file
|
@ -0,0 +1,79 @@
|
|||
---
|
||||
parent: Usage
|
||||
nav_order: 50
|
||||
description: Control aider with in-chat commands like /add, /model, etc.
|
||||
---
|
||||
# In-chat commands
|
||||
|
||||
Aider supports commands from within the chat, which all start with `/`.
|
||||
|
||||
<!--[[[cog
|
||||
from aider.commands import get_help_md
|
||||
cog.out(get_help_md())
|
||||
]]]-->
|
||||
- **/add** Add files to the chat so GPT can edit them or review them in detail
|
||||
- **/clear** Clear the chat history
|
||||
- **/commit** Commit edits to the repo made outside the chat (commit message optional)
|
||||
- **/diff** Display the diff of the last aider commit
|
||||
- **/drop** Remove files from the chat session to free up context space
|
||||
- **/exit** Exit the application
|
||||
- **/git** Run a git command
|
||||
- **/help** Show help about all commands
|
||||
- **/lint** Lint and fix provided files or in-chat files if none provided
|
||||
- **/ls** List all known files and indicate which are included in the chat session
|
||||
- **/model** Switch to a new LLM
|
||||
- **/models** Search the list of available models
|
||||
- **/quit** Exit the application
|
||||
- **/run** Run a shell command and optionally add the output to the chat (alias: !)
|
||||
- **/test** Run a shell command and add the output to the chat on non-zero exit code
|
||||
- **/tokens** Report on the number of tokens used by the current chat context
|
||||
- **/undo** Undo the last git commit if it was done by aider
|
||||
- **/voice** Record and transcribe voice input
|
||||
- **/web** Use headless selenium to scrape a webpage and add the content to the chat
|
||||
<!--[[[end]]]-->
|
||||
|
||||
# Entering multi-line chat messages
|
||||
|
||||
{% include multi-line.md %}
|
||||
|
||||
# Keybindings
|
||||
|
||||
The interactive prompt is built with [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) which provides emacs and vi keybindings.
|
||||
|
||||
## Emacs
|
||||
|
||||
- `Ctrl-A` : Move cursor to the start of the line.
|
||||
- `Ctrl-B` : Move cursor back one character.
|
||||
- `Ctrl-D` : Delete the character under the cursor.
|
||||
- `Ctrl-E` : Move cursor to the end of the line.
|
||||
- `Ctrl-F` : Move cursor forward one character.
|
||||
- `Ctrl-K` : Delete from the cursor to the end of the line.
|
||||
- `Ctrl-L` : Clear the screen.
|
||||
- `Ctrl-N` : Move down to the next history entry.
|
||||
- `Ctrl-P` : Move up to the previous history entry.
|
||||
- `Ctrl-R` : Reverse search in command history.
|
||||
|
||||
|
||||
## Vi
|
||||
|
||||
To use vi/vim keybindings, run aider with the `--vim` switch.
|
||||
|
||||
- `Esc` : Switch to command mode.
|
||||
- `i` : Switch to insert mode.
|
||||
- `a` : Move cursor one character to the right and switch to insert mode.
|
||||
- `A` : Move cursor to the end of the line and switch to insert mode.
|
||||
- `I` : Move cursor to the beginning of the line and switch to insert mode.
|
||||
- `h` : Move cursor one character to the left.
|
||||
- `j` : Move cursor down one line.
|
||||
- `k` : Move cursor up one line.
|
||||
- `l` : Move cursor one character to the right.
|
||||
- `w` : Move cursor forward one word.
|
||||
- `b` : Move cursor backward one word.
|
||||
- `0` : Move cursor to the beginning of the line.
|
||||
- `$` : Move cursor to the end of the line.
|
||||
- `x` : Delete the character under the cursor.
|
||||
- `dd` : Delete the current line.
|
||||
- `u` : Undo the last change.
|
||||
- `Ctrl-R` : Redo the last undone change.
|
||||
|
||||
|
41
aider/website/docs/config.md
Normal file
41
aider/website/docs/config.md
Normal file
|
@ -0,0 +1,41 @@
|
|||
---
|
||||
nav_order: 55
|
||||
has_children: true
|
||||
description: Information on all of aider's settings and how to use them.
|
||||
---
|
||||
|
||||
# Configuration
|
||||
|
||||
Aider has many options which can be set with
|
||||
command line switches.
|
||||
Most options can also be set in an `.aider.conf.yml` file
|
||||
which can be placed in your home directory or at the root of
|
||||
your git repo.
|
||||
Or by setting environment variables like `AIDER_xxx`
|
||||
either in your shell or a `.env` file.
|
||||
|
||||
Here are 4 equivalent ways of setting an option.
|
||||
|
||||
With a command line switch:
|
||||
|
||||
```
|
||||
$ aider --dark-mode
|
||||
```
|
||||
|
||||
Using a `.aider.conf.yml` file:
|
||||
|
||||
```yaml
|
||||
dark-mode: true
|
||||
```
|
||||
|
||||
By setting an environgment variable:
|
||||
|
||||
```
|
||||
export AIDER_DARK_MODE=true
|
||||
```
|
||||
|
||||
Using an `.env` file:
|
||||
|
||||
```
|
||||
AIDER_DARK_MODE=true
|
||||
```
|
86
aider/website/docs/config/adv-model-settings.md
Normal file
86
aider/website/docs/config/adv-model-settings.md
Normal file
|
@ -0,0 +1,86 @@
|
|||
---
|
||||
parent: Configuration
|
||||
nav_order: 950
|
||||
description: Configuring advanced settings for LLMs.
|
||||
---
|
||||
|
||||
# Advanced model settings
|
||||
|
||||
## Context window size and token costs
|
||||
|
||||
In most cases, you can safely ignore aider's warning about unknown context
|
||||
window size and model costs.
|
||||
|
||||
But, you can register context window limits and costs for models that aren't known
|
||||
to aider. Create a `.aider.model.metadata.json` file in one of these locations:
|
||||
|
||||
- Your home directory.
|
||||
- The root if your git repo.
|
||||
- The current directory where you launch aider.
|
||||
- Or specify a specific file with the `--model-metadata-file <filename>` switch.
|
||||
|
||||
|
||||
If the files above exist, they will be loaded in that order.
|
||||
Files loaded last will take priority.
|
||||
|
||||
The json file should be a dictionary with an entry for each model, as follows:
|
||||
|
||||
```
|
||||
{
|
||||
"deepseek-chat": {
|
||||
"max_tokens": 4096,
|
||||
"max_input_tokens": 32000,
|
||||
"max_output_tokens": 4096,
|
||||
"input_cost_per_token": 0.00000014,
|
||||
"output_cost_per_token": 0.00000028,
|
||||
"litellm_provider": "deepseek",
|
||||
"mode": "chat"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
See
|
||||
[litellm's model_prices_and_context_window.json file](https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json) for more examples.
|
||||
|
||||
## Model settings
|
||||
|
||||
Aider has a number of settings that control how it works with
|
||||
different models.
|
||||
These model settings are pre-configured for most popular models.
|
||||
But it can sometimes be helpful to override them or add settings for
|
||||
a model that aider doesn't know about.
|
||||
|
||||
To do that,
|
||||
create a `.aider.model.settings.yml` file in one of these locations:
|
||||
|
||||
- Your home directory.
|
||||
- The root if your git repo.
|
||||
- The current directory where you launch aider.
|
||||
- Or specify a specific file with the `--model-settings-file <filename>` switch.
|
||||
|
||||
If the files above exist, they will be loaded in that order.
|
||||
Files loaded last will take priority.
|
||||
|
||||
The yaml file should be a a list of dictionary objects for each model, as follows:
|
||||
|
||||
```
|
||||
- name: "gpt-3.5-turbo"
|
||||
edit_format: "whole"
|
||||
weak_model_name: "gpt-3.5-turbo"
|
||||
use_repo_map: false
|
||||
send_undo_reply: false
|
||||
accepts_images: false
|
||||
lazy: false
|
||||
reminder_as_sys_msg: true
|
||||
examples_as_sys_msg: false
|
||||
- name: "gpt-4-turbo-2024-04-09"
|
||||
edit_format: "udiff"
|
||||
weak_model_name: "gpt-3.5-turbo"
|
||||
use_repo_map: true
|
||||
send_undo_reply: true
|
||||
accepts_images: true
|
||||
lazy: true
|
||||
reminder_as_sys_msg: true
|
||||
examples_as_sys_msg: false
|
||||
```
|
||||
|
272
aider/website/docs/config/aider_conf.md
Normal file
272
aider/website/docs/config/aider_conf.md
Normal file
|
@ -0,0 +1,272 @@
|
|||
---
|
||||
parent: Configuration
|
||||
nav_order: 15
|
||||
description: How to configure aider with a yaml config file.
|
||||
---
|
||||
|
||||
# YAML config file
|
||||
|
||||
Most of aider's options can be set in an `.aider.conf.yml` file,
|
||||
which can be placed in your home directory or at the root of
|
||||
your git repo.
|
||||
|
||||
{% include special-keys.md %}
|
||||
|
||||
Below is a sample of the file, which you
|
||||
can also
|
||||
[download from GitHub](https://github.com/paul-gauthier/aider/blob/main/website/assets/sample.aider.conf.yml).
|
||||
|
||||
<!--[[[cog
|
||||
from aider.args import get_sample_yaml
|
||||
from pathlib import Path
|
||||
text=get_sample_yaml()
|
||||
Path("website/assets/sample.aider.conf.yml").write_text(text)
|
||||
cog.outl("```")
|
||||
cog.out(text)
|
||||
cog.outl("```")
|
||||
]]]-->
|
||||
```
|
||||
##########################################################
|
||||
# Sample .aider.conf.yaml
|
||||
# This file lists *all* the valid configuration entries.
|
||||
# Place in your home dir, or at the root of your git repo.
|
||||
##########################################################
|
||||
|
||||
##########
|
||||
# options:
|
||||
|
||||
## show this help message and exit
|
||||
#help:
|
||||
|
||||
#######
|
||||
# Main:
|
||||
|
||||
## Specify the OpenAI API key
|
||||
#openai-api-key:
|
||||
|
||||
## Specify the Anthropic API key
|
||||
#anthropic-api-key:
|
||||
|
||||
## Specify the model to use for the main chat
|
||||
#model:
|
||||
|
||||
## Use claude-3-opus-20240229 model for the main chat
|
||||
#opus: false
|
||||
|
||||
## Use claude-3-5-sonnet-20240620 model for the main chat
|
||||
#sonnet: false
|
||||
|
||||
## Use gpt-4-0613 model for the main chat
|
||||
#4: false
|
||||
|
||||
## Use gpt-4o model for the main chat
|
||||
#4o: false
|
||||
|
||||
## Use gpt-4-1106-preview model for the main chat
|
||||
#4-turbo: false
|
||||
|
||||
## Use gpt-3.5-turbo model for the main chat
|
||||
#35turbo: false
|
||||
|
||||
#################
|
||||
# Model Settings:
|
||||
|
||||
## List known models which match the (partial) MODEL name
|
||||
#models:
|
||||
|
||||
## Specify the api base url
|
||||
#openai-api-base:
|
||||
|
||||
## Specify the api_type
|
||||
#openai-api-type:
|
||||
|
||||
## Specify the api_version
|
||||
#openai-api-version:
|
||||
|
||||
## Specify the deployment_id
|
||||
#openai-api-deployment-id:
|
||||
|
||||
## Specify the OpenAI organization ID
|
||||
#openai-organization-id:
|
||||
|
||||
## Specify a file with aider model settings for unknown models
|
||||
#model-settings-file: .aider.model.settings.yml
|
||||
|
||||
## Specify a file with context window and costs for unknown models
|
||||
#model-metadata-file: .aider.model.metadata.json
|
||||
|
||||
## Verify the SSL cert when connecting to models (default: True)
|
||||
#verify-ssl: true
|
||||
|
||||
## Specify what edit format the LLM should use (default depends on model)
|
||||
#edit-format:
|
||||
|
||||
## Specify the model to use for commit messages and chat history summarization (default depends on --model)
|
||||
#weak-model:
|
||||
|
||||
## Only work with models that have meta-data available (default: True)
|
||||
#show-model-warnings: true
|
||||
|
||||
## Max number of tokens to use for repo map, use 0 to disable (default: 1024)
|
||||
#map-tokens: true
|
||||
|
||||
## Maximum number of tokens to use for chat history. If not specified, uses the model's max_chat_history_tokens.
|
||||
#max-chat-history-tokens:
|
||||
|
||||
## Specify the .env file to load (default: .env in git root)
|
||||
#env-file: .env
|
||||
|
||||
################
|
||||
# History Files:
|
||||
|
||||
## Specify the chat input history file (default: .aider.input.history)
|
||||
#input-history-file: .aider.input.history
|
||||
|
||||
## Specify the chat history file (default: .aider.chat.history.md)
|
||||
#chat-history-file: .aider.chat.history.md
|
||||
|
||||
## Restore the previous chat history messages (default: False)
|
||||
#restore-chat-history: false
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#llm-history-file:
|
||||
|
||||
##################
|
||||
# Output Settings:
|
||||
|
||||
## Use colors suitable for a dark terminal background (default: False)
|
||||
#dark-mode: false
|
||||
|
||||
## Use colors suitable for a light terminal background (default: False)
|
||||
#light-mode: false
|
||||
|
||||
## Enable/disable pretty, colorized output (default: True)
|
||||
#pretty: true
|
||||
|
||||
## Enable/disable streaming responses (default: True)
|
||||
#stream: true
|
||||
|
||||
## Set the color for user input (default: #00cc00)
|
||||
#user-input-color: #00cc00
|
||||
|
||||
## Set the color for tool output (default: None)
|
||||
#tool-output-color:
|
||||
|
||||
## Set the color for tool error messages (default: red)
|
||||
#tool-error-color: #FF2222
|
||||
|
||||
## Set the color for assistant output (default: #0088ff)
|
||||
#assistant-output-color: #0088ff
|
||||
|
||||
## Set the markdown code theme (default: default, other options include monokai, solarized-dark, solarized-light)
|
||||
#code-theme: default
|
||||
|
||||
## Show diffs when committing changes (default: False)
|
||||
#show-diffs: false
|
||||
|
||||
###############
|
||||
# Git Settings:
|
||||
|
||||
## Enable/disable looking for a git repo (default: True)
|
||||
#git: true
|
||||
|
||||
## Enable/disable adding .aider* to .gitignore (default: True)
|
||||
#gitignore: true
|
||||
|
||||
## Specify the aider ignore file (default: .aiderignore in git root)
|
||||
#aiderignore: .aiderignore
|
||||
|
||||
## Enable/disable auto commit of LLM changes (default: True)
|
||||
#auto-commits: true
|
||||
|
||||
## Enable/disable commits when repo is found dirty (default: True)
|
||||
#dirty-commits: true
|
||||
|
||||
## Attribute aider code changes in the git author name (default: True)
|
||||
#attribute-author: true
|
||||
|
||||
## Attribute aider commits in the git committer name (default: True)
|
||||
#attribute-committer: true
|
||||
|
||||
## Prefix commit messages with 'aider: ' (default: False)
|
||||
#attribute-commit-message: false
|
||||
|
||||
## Perform a dry run without modifying files (default: False)
|
||||
#dry-run: false
|
||||
|
||||
########################
|
||||
# Fixing and committing:
|
||||
|
||||
## Commit all pending changes with a suitable commit message, then exit
|
||||
#commit: false
|
||||
|
||||
## Lint and fix provided files, or dirty files if none provided
|
||||
#lint: false
|
||||
|
||||
## Specify lint commands to run for different languages, eg: "python: flake8 --select=..." (can be used multiple times)
|
||||
#lint-cmd:
|
||||
|
||||
## Enable/disable automatic linting after changes (default: True)
|
||||
#auto-lint: true
|
||||
|
||||
## Specify command to run tests
|
||||
#test-cmd:
|
||||
|
||||
## Enable/disable automatic testing after changes (default: False)
|
||||
#auto-test: false
|
||||
|
||||
## Run tests and fix problems found
|
||||
#test: false
|
||||
|
||||
#################
|
||||
# Other Settings:
|
||||
|
||||
## Use VI editing mode in the terminal (default: False)
|
||||
#vim: false
|
||||
|
||||
## Specify the language for voice using ISO 639-1 code (default: auto)
|
||||
#voice-language: en
|
||||
|
||||
## Show the version number and exit
|
||||
#version:
|
||||
|
||||
## Check for updates and return status in the exit code
|
||||
#check-update: false
|
||||
|
||||
## Skips checking for the update when the program runs
|
||||
#skip-check-update: false
|
||||
|
||||
## Apply the changes from the given file instead of running the chat (debug)
|
||||
#apply:
|
||||
|
||||
## Always say yes to every confirmation
|
||||
#yes: false
|
||||
|
||||
## Enable verbose output
|
||||
#verbose: false
|
||||
|
||||
## Print the repo map and exit (debug)
|
||||
#show-repo-map: false
|
||||
|
||||
## Print the system prompts and exit (debug)
|
||||
#show-prompts: false
|
||||
|
||||
## Do all startup activities then exit before accepting user input (debug)
|
||||
#exit: false
|
||||
|
||||
## Specify a single message to send the LLM, process reply then exit (disables chat mode)
|
||||
#message:
|
||||
|
||||
## Specify a file containing the message to send the LLM, process reply, then exit (disables chat mode)
|
||||
#message-file:
|
||||
|
||||
## Specify the encoding for input and output (default: utf-8)
|
||||
#encoding: utf-8
|
||||
|
||||
## Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory)
|
||||
#config:
|
||||
|
||||
## Run aider in your browser
|
||||
#gui: false
|
||||
```
|
||||
<!--[[[end]]]-->
|
281
aider/website/docs/config/dotenv.md
Normal file
281
aider/website/docs/config/dotenv.md
Normal file
|
@ -0,0 +1,281 @@
|
|||
---
|
||||
parent: Configuration
|
||||
nav_order: 900
|
||||
description: Using a .env file to store LLM API keys for aider.
|
||||
---
|
||||
|
||||
# Config with .env
|
||||
|
||||
You can use a `.env` file to store API keys and other settings for the
|
||||
models you use with aider.
|
||||
You can also set many general aider options
|
||||
in the `.env` file.
|
||||
|
||||
{% include special-keys.md %}
|
||||
|
||||
Aider will look for a `.env` file in the
|
||||
root of your git repo or in the current directory.
|
||||
You can give it an explicit file to load with the `--env-file <filename>` parameter.
|
||||
|
||||
Below is a sample `.env` file, which you
|
||||
can also
|
||||
[download from GitHub](https://github.com/paul-gauthier/aider/blob/main/website/assets/sample.env).
|
||||
|
||||
<!--[[[cog
|
||||
from aider.args import get_sample_dotenv
|
||||
from pathlib import Path
|
||||
text=get_sample_dotenv()
|
||||
Path("website/assets/sample.env").write_text(text)
|
||||
cog.outl("```")
|
||||
cog.out(text)
|
||||
cog.outl("```")
|
||||
]]]-->
|
||||
```
|
||||
##########################################################
|
||||
# Sample aider .env file.
|
||||
# Place at the root of your git repo.
|
||||
# Or use `aider --env <fname>` to specify.
|
||||
##########################################################
|
||||
|
||||
#################
|
||||
# LLM parameters:
|
||||
#
|
||||
# Include xxx_API_KEY parameters and other params needed for your LLMs.
|
||||
# See https://aider.chat/docs/llms.html for details.
|
||||
|
||||
## OpenAI
|
||||
#OPENAI_API_KEY=
|
||||
|
||||
## Anthropic
|
||||
#ANTHROPIC_API_KEY=
|
||||
|
||||
##...
|
||||
|
||||
#######
|
||||
# Main:
|
||||
|
||||
## Specify the OpenAI API key
|
||||
#OPENAI_API_KEY=
|
||||
|
||||
## Specify the Anthropic API key
|
||||
#ANTHROPIC_API_KEY=
|
||||
|
||||
## Specify the model to use for the main chat
|
||||
#AIDER_MODEL=
|
||||
|
||||
## Use claude-3-opus-20240229 model for the main chat
|
||||
#AIDER_OPUS=
|
||||
|
||||
## Use claude-3-5-sonnet-20240620 model for the main chat
|
||||
#AIDER_SONNET=
|
||||
|
||||
## Use gpt-4-0613 model for the main chat
|
||||
#AIDER_4=
|
||||
|
||||
## Use gpt-4o model for the main chat
|
||||
#AIDER_4O=
|
||||
|
||||
## Use gpt-4-1106-preview model for the main chat
|
||||
#AIDER_4_TURBO=
|
||||
|
||||
## Use gpt-3.5-turbo model for the main chat
|
||||
#AIDER_35TURBO=
|
||||
|
||||
#################
|
||||
# Model Settings:
|
||||
|
||||
## List known models which match the (partial) MODEL name
|
||||
#AIDER_MODELS=
|
||||
|
||||
## Specify the api base url
|
||||
#OPENAI_API_BASE=
|
||||
|
||||
## Specify the api_type
|
||||
#OPENAI_API_TYPE=
|
||||
|
||||
## Specify the api_version
|
||||
#OPENAI_API_VERSION=
|
||||
|
||||
## Specify the deployment_id
|
||||
#OPENAI_API_DEPLOYMENT_ID=
|
||||
|
||||
## Specify the OpenAI organization ID
|
||||
#OPENAI_ORGANIZATION_ID=
|
||||
|
||||
## Specify a file with aider model settings for unknown models
|
||||
#AIDER_MODEL_SETTINGS_FILE=.aider.model.settings.yml
|
||||
|
||||
## Specify a file with context window and costs for unknown models
|
||||
#AIDER_MODEL_METADATA_FILE=.aider.model.metadata.json
|
||||
|
||||
## Verify the SSL cert when connecting to models (default: True)
|
||||
#AIDER_VERIFY_SSL=true
|
||||
|
||||
## Specify what edit format the LLM should use (default depends on model)
|
||||
#AIDER_EDIT_FORMAT=
|
||||
|
||||
## Specify the model to use for commit messages and chat history summarization (default depends on --model)
|
||||
#AIDER_WEAK_MODEL=
|
||||
|
||||
## Only work with models that have meta-data available (default: True)
|
||||
#AIDER_SHOW_MODEL_WARNINGS=true
|
||||
|
||||
## Max number of tokens to use for repo map, use 0 to disable (default: 1024)
|
||||
#AIDER_MAP_TOKENS=true
|
||||
|
||||
## Maximum number of tokens to use for chat history. If not specified, uses the model's max_chat_history_tokens.
|
||||
#AIDER_MAX_CHAT_HISTORY_TOKENS=
|
||||
|
||||
## Specify the .env file to load (default: .env in git root)
|
||||
#AIDER_ENV_FILE=.env
|
||||
|
||||
################
|
||||
# History Files:
|
||||
|
||||
## Specify the chat input history file (default: .aider.input.history)
|
||||
#AIDER_INPUT_HISTORY_FILE=.aider.input.history
|
||||
|
||||
## Specify the chat history file (default: .aider.chat.history.md)
|
||||
#AIDER_CHAT_HISTORY_FILE=.aider.chat.history.md
|
||||
|
||||
## Restore the previous chat history messages (default: False)
|
||||
#AIDER_RESTORE_CHAT_HISTORY=false
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#AIDER_LLM_HISTORY_FILE=
|
||||
|
||||
##################
|
||||
# Output Settings:
|
||||
|
||||
## Use colors suitable for a dark terminal background (default: False)
|
||||
#AIDER_DARK_MODE=false
|
||||
|
||||
## Use colors suitable for a light terminal background (default: False)
|
||||
#AIDER_LIGHT_MODE=false
|
||||
|
||||
## Enable/disable pretty, colorized output (default: True)
|
||||
#AIDER_PRETTY=true
|
||||
|
||||
## Enable/disable streaming responses (default: True)
|
||||
#AIDER_STREAM=true
|
||||
|
||||
## Set the color for user input (default: #00cc00)
|
||||
#AIDER_USER_INPUT_COLOR=#00cc00
|
||||
|
||||
## Set the color for tool output (default: None)
|
||||
#AIDER_TOOL_OUTPUT_COLOR=
|
||||
|
||||
## Set the color for tool error messages (default: red)
|
||||
#AIDER_TOOL_ERROR_COLOR=#FF2222
|
||||
|
||||
## Set the color for assistant output (default: #0088ff)
|
||||
#AIDER_ASSISTANT_OUTPUT_COLOR=#0088ff
|
||||
|
||||
## Set the markdown code theme (default: default, other options include monokai, solarized-dark, solarized-light)
|
||||
#AIDER_CODE_THEME=default
|
||||
|
||||
## Show diffs when committing changes (default: False)
|
||||
#AIDER_SHOW_DIFFS=false
|
||||
|
||||
###############
|
||||
# Git Settings:
|
||||
|
||||
## Enable/disable looking for a git repo (default: True)
|
||||
#AIDER_GIT=true
|
||||
|
||||
## Enable/disable adding .aider* to .gitignore (default: True)
|
||||
#AIDER_GITIGNORE=true
|
||||
|
||||
## Specify the aider ignore file (default: .aiderignore in git root)
|
||||
#AIDER_AIDERIGNORE=.aiderignore
|
||||
|
||||
## Enable/disable auto commit of LLM changes (default: True)
|
||||
#AIDER_AUTO_COMMITS=true
|
||||
|
||||
## Enable/disable commits when repo is found dirty (default: True)
|
||||
#AIDER_DIRTY_COMMITS=true
|
||||
|
||||
## Attribute aider code changes in the git author name (default: True)
|
||||
#AIDER_ATTRIBUTE_AUTHOR=true
|
||||
|
||||
## Attribute aider commits in the git committer name (default: True)
|
||||
#AIDER_ATTRIBUTE_COMMITTER=true
|
||||
|
||||
## Prefix commit messages with 'aider: ' (default: False)
|
||||
#AIDER_ATTRIBUTE_COMMIT_MESSAGE=false
|
||||
|
||||
## Perform a dry run without modifying files (default: False)
|
||||
#AIDER_DRY_RUN=false
|
||||
|
||||
########################
|
||||
# Fixing and committing:
|
||||
|
||||
## Commit all pending changes with a suitable commit message, then exit
|
||||
#AIDER_COMMIT=false
|
||||
|
||||
## Lint and fix provided files, or dirty files if none provided
|
||||
#AIDER_LINT=false
|
||||
|
||||
## Specify lint commands to run for different languages, eg: "python: flake8 --select=..." (can be used multiple times)
|
||||
#AIDER_LINT_CMD=
|
||||
|
||||
## Enable/disable automatic linting after changes (default: True)
|
||||
#AIDER_AUTO_LINT=true
|
||||
|
||||
## Specify command to run tests
|
||||
#AIDER_TEST_CMD=
|
||||
|
||||
## Enable/disable automatic testing after changes (default: False)
|
||||
#AIDER_AUTO_TEST=false
|
||||
|
||||
## Run tests and fix problems found
|
||||
#AIDER_TEST=false
|
||||
|
||||
#################
|
||||
# Other Settings:
|
||||
|
||||
## Use VI editing mode in the terminal (default: False)
|
||||
#AIDER_VIM=false
|
||||
|
||||
## Specify the language for voice using ISO 639-1 code (default: auto)
|
||||
#AIDER_VOICE_LANGUAGE=en
|
||||
|
||||
## Check for updates and return status in the exit code
|
||||
#AIDER_CHECK_UPDATE=false
|
||||
|
||||
## Skips checking for the update when the program runs
|
||||
#AIDER_SKIP_CHECK_UPDATE=false
|
||||
|
||||
## Apply the changes from the given file instead of running the chat (debug)
|
||||
#AIDER_APPLY=
|
||||
|
||||
## Always say yes to every confirmation
|
||||
#AIDER_YES=
|
||||
|
||||
## Enable verbose output
|
||||
#AIDER_VERBOSE=false
|
||||
|
||||
## Print the repo map and exit (debug)
|
||||
#AIDER_SHOW_REPO_MAP=false
|
||||
|
||||
## Print the system prompts and exit (debug)
|
||||
#AIDER_SHOW_PROMPTS=false
|
||||
|
||||
## Do all startup activities then exit before accepting user input (debug)
|
||||
#AIDER_EXIT=false
|
||||
|
||||
## Specify a single message to send the LLM, process reply then exit (disables chat mode)
|
||||
#AIDER_MESSAGE=
|
||||
|
||||
## Specify a file containing the message to send the LLM, process reply, then exit (disables chat mode)
|
||||
#AIDER_MESSAGE_FILE=
|
||||
|
||||
## Specify the encoding for input and output (default: utf-8)
|
||||
#AIDER_ENCODING=utf-8
|
||||
|
||||
## Run aider in your browser
|
||||
#AIDER_GUI=false
|
||||
```
|
||||
<!--[[[end]]]-->
|
||||
|
||||
|
468
aider/website/docs/config/options.md
Normal file
468
aider/website/docs/config/options.md
Normal file
|
@ -0,0 +1,468 @@
|
|||
---
|
||||
parent: Configuration
|
||||
nav_order: 10
|
||||
description: Details about all of aider's settings.
|
||||
---
|
||||
|
||||
# Options reference
|
||||
{: .no_toc }
|
||||
|
||||
You can use `aider --help` to see all the available options,
|
||||
or review them below.
|
||||
|
||||
- TOC
|
||||
{:toc}
|
||||
|
||||
## Usage summary
|
||||
|
||||
<!--[[[cog
|
||||
from aider.args import get_md_help
|
||||
cog.out(get_md_help())
|
||||
]]]-->
|
||||
```
|
||||
usage: aider [-h] [--openai-api-key] [--anthropic-api-key] [--model]
|
||||
[--opus] [--sonnet] [--4] [--4o] [--4-turbo]
|
||||
[--35turbo] [--models] [--openai-api-base]
|
||||
[--openai-api-type] [--openai-api-version]
|
||||
[--openai-api-deployment-id] [--openai-organization-id]
|
||||
[--model-settings-file] [--model-metadata-file]
|
||||
[--verify-ssl | --no-verify-ssl] [--edit-format]
|
||||
[--weak-model]
|
||||
[--show-model-warnings | --no-show-model-warnings]
|
||||
[--map-tokens] [--max-chat-history-tokens] [--env-file]
|
||||
[--input-history-file] [--chat-history-file]
|
||||
[--restore-chat-history | --no-restore-chat-history]
|
||||
[--llm-history-file] [--dark-mode] [--light-mode]
|
||||
[--pretty | --no-pretty] [--stream | --no-stream]
|
||||
[--user-input-color] [--tool-output-color]
|
||||
[--tool-error-color] [--assistant-output-color]
|
||||
[--code-theme] [--show-diffs] [--git | --no-git]
|
||||
[--gitignore | --no-gitignore] [--aiderignore]
|
||||
[--auto-commits | --no-auto-commits]
|
||||
[--dirty-commits | --no-dirty-commits]
|
||||
[--attribute-author | --no-attribute-author]
|
||||
[--attribute-committer | --no-attribute-committer]
|
||||
[--attribute-commit-message | --no-attribute-commit-message]
|
||||
[--dry-run | --no-dry-run] [--commit] [--lint]
|
||||
[--lint-cmd] [--auto-lint | --no-auto-lint]
|
||||
[--test-cmd] [--auto-test | --no-auto-test] [--test]
|
||||
[--vim] [--voice-language] [--version] [--check-update]
|
||||
[--skip-check-update] [--apply] [--yes] [-v]
|
||||
[--show-repo-map] [--show-prompts] [--exit] [--message]
|
||||
[--message-file] [--encoding] [-c] [--gui]
|
||||
|
||||
```
|
||||
|
||||
## options:
|
||||
|
||||
### `--help`
|
||||
show this help message and exit
|
||||
Aliases:
|
||||
- `-h`
|
||||
- `--help`
|
||||
|
||||
## Main:
|
||||
|
||||
### `--openai-api-key OPENAI_API_KEY`
|
||||
Specify the OpenAI API key
|
||||
Environment variable: `OPENAI_API_KEY`
|
||||
|
||||
### `--anthropic-api-key ANTHROPIC_API_KEY`
|
||||
Specify the Anthropic API key
|
||||
Environment variable: `ANTHROPIC_API_KEY`
|
||||
|
||||
### `--model MODEL`
|
||||
Specify the model to use for the main chat
|
||||
Environment variable: `AIDER_MODEL`
|
||||
|
||||
### `--opus`
|
||||
Use claude-3-opus-20240229 model for the main chat
|
||||
Environment variable: `AIDER_OPUS`
|
||||
|
||||
### `--sonnet`
|
||||
Use claude-3-5-sonnet-20240620 model for the main chat
|
||||
Environment variable: `AIDER_SONNET`
|
||||
|
||||
### `--4`
|
||||
Use gpt-4-0613 model for the main chat
|
||||
Environment variable: `AIDER_4`
|
||||
Aliases:
|
||||
- `--4`
|
||||
- `-4`
|
||||
|
||||
### `--4o`
|
||||
Use gpt-4o model for the main chat
|
||||
Environment variable: `AIDER_4O`
|
||||
|
||||
### `--4-turbo`
|
||||
Use gpt-4-1106-preview model for the main chat
|
||||
Environment variable: `AIDER_4_TURBO`
|
||||
|
||||
### `--35turbo`
|
||||
Use gpt-3.5-turbo model for the main chat
|
||||
Environment variable: `AIDER_35TURBO`
|
||||
Aliases:
|
||||
- `--35turbo`
|
||||
- `--35-turbo`
|
||||
- `--3`
|
||||
- `-3`
|
||||
|
||||
## Model Settings:
|
||||
|
||||
### `--models MODEL`
|
||||
List known models which match the (partial) MODEL name
|
||||
Environment variable: `AIDER_MODELS`
|
||||
|
||||
### `--openai-api-base OPENAI_API_BASE`
|
||||
Specify the api base url
|
||||
Environment variable: `OPENAI_API_BASE`
|
||||
|
||||
### `--openai-api-type OPENAI_API_TYPE`
|
||||
Specify the api_type
|
||||
Environment variable: `OPENAI_API_TYPE`
|
||||
|
||||
### `--openai-api-version OPENAI_API_VERSION`
|
||||
Specify the api_version
|
||||
Environment variable: `OPENAI_API_VERSION`
|
||||
|
||||
### `--openai-api-deployment-id OPENAI_API_DEPLOYMENT_ID`
|
||||
Specify the deployment_id
|
||||
Environment variable: `OPENAI_API_DEPLOYMENT_ID`
|
||||
|
||||
### `--openai-organization-id OPENAI_ORGANIZATION_ID`
|
||||
Specify the OpenAI organization ID
|
||||
Environment variable: `OPENAI_ORGANIZATION_ID`
|
||||
|
||||
### `--model-settings-file MODEL_SETTINGS_FILE`
|
||||
Specify a file with aider model settings for unknown models
|
||||
Default: .aider.model.settings.yml
|
||||
Environment variable: `AIDER_MODEL_SETTINGS_FILE`
|
||||
|
||||
### `--model-metadata-file MODEL_METADATA_FILE`
|
||||
Specify a file with context window and costs for unknown models
|
||||
Default: .aider.model.metadata.json
|
||||
Environment variable: `AIDER_MODEL_METADATA_FILE`
|
||||
|
||||
### `--verify-ssl`
|
||||
Verify the SSL cert when connecting to models (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_VERIFY_SSL`
|
||||
Aliases:
|
||||
- `--verify-ssl`
|
||||
- `--no-verify-ssl`
|
||||
|
||||
### `--edit-format EDIT_FORMAT`
|
||||
Specify what edit format the LLM should use (default depends on model)
|
||||
Environment variable: `AIDER_EDIT_FORMAT`
|
||||
|
||||
### `--weak-model WEAK_MODEL`
|
||||
Specify the model to use for commit messages and chat history summarization (default depends on --model)
|
||||
Environment variable: `AIDER_WEAK_MODEL`
|
||||
|
||||
### `--show-model-warnings`
|
||||
Only work with models that have meta-data available (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_SHOW_MODEL_WARNINGS`
|
||||
Aliases:
|
||||
- `--show-model-warnings`
|
||||
- `--no-show-model-warnings`
|
||||
|
||||
### `--map-tokens VALUE`
|
||||
Max number of tokens to use for repo map, use 0 to disable (default: 1024)
|
||||
Default: 1024
|
||||
Environment variable: `AIDER_MAP_TOKENS`
|
||||
|
||||
### `--max-chat-history-tokens VALUE`
|
||||
Maximum number of tokens to use for chat history. If not specified, uses the model's max_chat_history_tokens.
|
||||
Environment variable: `AIDER_MAX_CHAT_HISTORY_TOKENS`
|
||||
|
||||
### `--env-file ENV_FILE`
|
||||
Specify the .env file to load (default: .env in git root)
|
||||
Default: .env
|
||||
Environment variable: `AIDER_ENV_FILE`
|
||||
|
||||
## History Files:
|
||||
|
||||
### `--input-history-file INPUT_HISTORY_FILE`
|
||||
Specify the chat input history file (default: .aider.input.history)
|
||||
Default: .aider.input.history
|
||||
Environment variable: `AIDER_INPUT_HISTORY_FILE`
|
||||
|
||||
### `--chat-history-file CHAT_HISTORY_FILE`
|
||||
Specify the chat history file (default: .aider.chat.history.md)
|
||||
Default: .aider.chat.history.md
|
||||
Environment variable: `AIDER_CHAT_HISTORY_FILE`
|
||||
|
||||
### `--restore-chat-history`
|
||||
Restore the previous chat history messages (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_RESTORE_CHAT_HISTORY`
|
||||
Aliases:
|
||||
- `--restore-chat-history`
|
||||
- `--no-restore-chat-history`
|
||||
|
||||
### `--llm-history-file LLM_HISTORY_FILE`
|
||||
Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
Environment variable: `AIDER_LLM_HISTORY_FILE`
|
||||
|
||||
## Output Settings:
|
||||
|
||||
### `--dark-mode`
|
||||
Use colors suitable for a dark terminal background (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_DARK_MODE`
|
||||
|
||||
### `--light-mode`
|
||||
Use colors suitable for a light terminal background (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_LIGHT_MODE`
|
||||
|
||||
### `--pretty`
|
||||
Enable/disable pretty, colorized output (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_PRETTY`
|
||||
Aliases:
|
||||
- `--pretty`
|
||||
- `--no-pretty`
|
||||
|
||||
### `--stream`
|
||||
Enable/disable streaming responses (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_STREAM`
|
||||
Aliases:
|
||||
- `--stream`
|
||||
- `--no-stream`
|
||||
|
||||
### `--user-input-color VALUE`
|
||||
Set the color for user input (default: #00cc00)
|
||||
Default: #00cc00
|
||||
Environment variable: `AIDER_USER_INPUT_COLOR`
|
||||
|
||||
### `--tool-output-color VALUE`
|
||||
Set the color for tool output (default: None)
|
||||
Environment variable: `AIDER_TOOL_OUTPUT_COLOR`
|
||||
|
||||
### `--tool-error-color VALUE`
|
||||
Set the color for tool error messages (default: red)
|
||||
Default: #FF2222
|
||||
Environment variable: `AIDER_TOOL_ERROR_COLOR`
|
||||
|
||||
### `--assistant-output-color VALUE`
|
||||
Set the color for assistant output (default: #0088ff)
|
||||
Default: #0088ff
|
||||
Environment variable: `AIDER_ASSISTANT_OUTPUT_COLOR`
|
||||
|
||||
### `--code-theme VALUE`
|
||||
Set the markdown code theme (default: default, other options include monokai, solarized-dark, solarized-light)
|
||||
Default: default
|
||||
Environment variable: `AIDER_CODE_THEME`
|
||||
|
||||
### `--show-diffs`
|
||||
Show diffs when committing changes (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_SHOW_DIFFS`
|
||||
|
||||
## Git Settings:
|
||||
|
||||
### `--git`
|
||||
Enable/disable looking for a git repo (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_GIT`
|
||||
Aliases:
|
||||
- `--git`
|
||||
- `--no-git`
|
||||
|
||||
### `--gitignore`
|
||||
Enable/disable adding .aider* to .gitignore (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_GITIGNORE`
|
||||
Aliases:
|
||||
- `--gitignore`
|
||||
- `--no-gitignore`
|
||||
|
||||
### `--aiderignore AIDERIGNORE`
|
||||
Specify the aider ignore file (default: .aiderignore in git root)
|
||||
Default: .aiderignore
|
||||
Environment variable: `AIDER_AIDERIGNORE`
|
||||
|
||||
### `--auto-commits`
|
||||
Enable/disable auto commit of LLM changes (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_AUTO_COMMITS`
|
||||
Aliases:
|
||||
- `--auto-commits`
|
||||
- `--no-auto-commits`
|
||||
|
||||
### `--dirty-commits`
|
||||
Enable/disable commits when repo is found dirty (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_DIRTY_COMMITS`
|
||||
Aliases:
|
||||
- `--dirty-commits`
|
||||
- `--no-dirty-commits`
|
||||
|
||||
### `--attribute-author`
|
||||
Attribute aider code changes in the git author name (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_ATTRIBUTE_AUTHOR`
|
||||
Aliases:
|
||||
- `--attribute-author`
|
||||
- `--no-attribute-author`
|
||||
|
||||
### `--attribute-committer`
|
||||
Attribute aider commits in the git committer name (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_ATTRIBUTE_COMMITTER`
|
||||
Aliases:
|
||||
- `--attribute-committer`
|
||||
- `--no-attribute-committer`
|
||||
|
||||
### `--attribute-commit-message`
|
||||
Prefix commit messages with 'aider: ' (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_ATTRIBUTE_COMMIT_MESSAGE`
|
||||
Aliases:
|
||||
- `--attribute-commit-message`
|
||||
- `--no-attribute-commit-message`
|
||||
|
||||
### `--dry-run`
|
||||
Perform a dry run without modifying files (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_DRY_RUN`
|
||||
Aliases:
|
||||
- `--dry-run`
|
||||
- `--no-dry-run`
|
||||
|
||||
## Fixing and committing:
|
||||
|
||||
### `--commit`
|
||||
Commit all pending changes with a suitable commit message, then exit
|
||||
Default: False
|
||||
Environment variable: `AIDER_COMMIT`
|
||||
|
||||
### `--lint`
|
||||
Lint and fix provided files, or dirty files if none provided
|
||||
Default: False
|
||||
Environment variable: `AIDER_LINT`
|
||||
|
||||
### `--lint-cmd`
|
||||
Specify lint commands to run for different languages, eg: "python: flake8 --select=..." (can be used multiple times)
|
||||
Default: []
|
||||
Environment variable: `AIDER_LINT_CMD`
|
||||
|
||||
### `--auto-lint`
|
||||
Enable/disable automatic linting after changes (default: True)
|
||||
Default: True
|
||||
Environment variable: `AIDER_AUTO_LINT`
|
||||
Aliases:
|
||||
- `--auto-lint`
|
||||
- `--no-auto-lint`
|
||||
|
||||
### `--test-cmd VALUE`
|
||||
Specify command to run tests
|
||||
Default: []
|
||||
Environment variable: `AIDER_TEST_CMD`
|
||||
|
||||
### `--auto-test`
|
||||
Enable/disable automatic testing after changes (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_AUTO_TEST`
|
||||
Aliases:
|
||||
- `--auto-test`
|
||||
- `--no-auto-test`
|
||||
|
||||
### `--test`
|
||||
Run tests and fix problems found
|
||||
Default: False
|
||||
Environment variable: `AIDER_TEST`
|
||||
|
||||
## Other Settings:
|
||||
|
||||
### `--vim`
|
||||
Use VI editing mode in the terminal (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_VIM`
|
||||
|
||||
### `--voice-language VOICE_LANGUAGE`
|
||||
Specify the language for voice using ISO 639-1 code (default: auto)
|
||||
Default: en
|
||||
Environment variable: `AIDER_VOICE_LANGUAGE`
|
||||
|
||||
### `--version`
|
||||
Show the version number and exit
|
||||
|
||||
### `--check-update`
|
||||
Check for updates and return status in the exit code
|
||||
Default: False
|
||||
Environment variable: `AIDER_CHECK_UPDATE`
|
||||
|
||||
### `--skip-check-update`
|
||||
Skips checking for the update when the program runs
|
||||
Default: False
|
||||
Environment variable: `AIDER_SKIP_CHECK_UPDATE`
|
||||
|
||||
### `--apply FILE`
|
||||
Apply the changes from the given file instead of running the chat (debug)
|
||||
Environment variable: `AIDER_APPLY`
|
||||
|
||||
### `--yes`
|
||||
Always say yes to every confirmation
|
||||
Environment variable: `AIDER_YES`
|
||||
|
||||
### `--verbose`
|
||||
Enable verbose output
|
||||
Default: False
|
||||
Environment variable: `AIDER_VERBOSE`
|
||||
Aliases:
|
||||
- `-v`
|
||||
- `--verbose`
|
||||
|
||||
### `--show-repo-map`
|
||||
Print the repo map and exit (debug)
|
||||
Default: False
|
||||
Environment variable: `AIDER_SHOW_REPO_MAP`
|
||||
|
||||
### `--show-prompts`
|
||||
Print the system prompts and exit (debug)
|
||||
Default: False
|
||||
Environment variable: `AIDER_SHOW_PROMPTS`
|
||||
|
||||
### `--exit`
|
||||
Do all startup activities then exit before accepting user input (debug)
|
||||
Default: False
|
||||
Environment variable: `AIDER_EXIT`
|
||||
|
||||
### `--message COMMAND`
|
||||
Specify a single message to send the LLM, process reply then exit (disables chat mode)
|
||||
Environment variable: `AIDER_MESSAGE`
|
||||
Aliases:
|
||||
- `--message COMMAND`
|
||||
- `--msg COMMAND`
|
||||
- `-m COMMAND`
|
||||
|
||||
### `--message-file MESSAGE_FILE`
|
||||
Specify a file containing the message to send the LLM, process reply, then exit (disables chat mode)
|
||||
Environment variable: `AIDER_MESSAGE_FILE`
|
||||
Aliases:
|
||||
- `--message-file MESSAGE_FILE`
|
||||
- `-f MESSAGE_FILE`
|
||||
|
||||
### `--encoding VALUE`
|
||||
Specify the encoding for input and output (default: utf-8)
|
||||
Default: utf-8
|
||||
Environment variable: `AIDER_ENCODING`
|
||||
|
||||
### `--config CONFIG_FILE`
|
||||
Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory)
|
||||
Aliases:
|
||||
- `-c CONFIG_FILE`
|
||||
- `--config CONFIG_FILE`
|
||||
|
||||
### `--gui`
|
||||
Run aider in your browser
|
||||
Default: False
|
||||
Environment variable: `AIDER_GUI`
|
||||
Aliases:
|
||||
- `--gui`
|
||||
- `--browser`
|
||||
<!--[[[end]]]-->
|
87
aider/website/docs/conventions.md
Normal file
87
aider/website/docs/conventions.md
Normal file
|
@ -0,0 +1,87 @@
|
|||
---
|
||||
parent: Usage
|
||||
nav_order: 800
|
||||
description: Tell aider to follow your coding conventions when it works on your code.
|
||||
---
|
||||
# Specifying coding conventions
|
||||
|
||||
Sometimes you want GPT to be aware of certain coding guidelines,
|
||||
like whether to provide type hints, which libraries or packages
|
||||
to prefer, etc.
|
||||
|
||||
The easiest way to do that with aider is to simply create
|
||||
a small markdown file and include it in the chat.
|
||||
|
||||
For example, say we want our python code to:
|
||||
|
||||
```
|
||||
- Prefer httpx over requests for making http requests.
|
||||
- Use types everywhere possible.
|
||||
```
|
||||
|
||||
We would simply create a file like `CONVENTIONS.md` with those lines
|
||||
and then we can add it to the aider chat, along with the file(s)
|
||||
that we want to edit:
|
||||
|
||||
<div class="chat-transcript" markdown="1">
|
||||
> $ aider CONVENTIONS.md useragent.py
|
||||
>
|
||||
> Aider v0.24.2-dev
|
||||
> Added CONVENTIONS.md to the chat.
|
||||
> Added useragent.py to the chat.
|
||||
|
||||
#### write a function that uses httpbin to check the user agent on the request. return the ua.
|
||||
|
||||
To fulfill your request, I will:
|
||||
|
||||
1. Add an import for `httpx`.
|
||||
2. Write a function named `check_user_agent` that makes a GET request to `httpbin.org/user-agent` and returns the user agent string.
|
||||
|
||||
Here is the diff for the `useragent.py` file:
|
||||
|
||||
```diff
|
||||
--- useragent.py
|
||||
+++ useragent.py
|
||||
@@ ... @@
|
||||
+import httpx
|
||||
+
|
||||
+def check_user_agent() -> str:
|
||||
+ response = httpx.get('https://httpbin.org/user-agent')
|
||||
+ return response.json()['user-agent']
|
||||
```
|
||||
|
||||
This function uses `httpx` to make a GET request to `httpbin.org/user-agent`, which returns a JSON response containing the user agent of the HTTP client. The function then extracts the user agent string from the JSON response and returns it.
|
||||
|
||||
> Applied edit to useragent.py
|
||||
</div>
|
||||
|
||||
GPT correctly used `httpx` and provided type hints.
|
||||
See below for the transcript of this same
|
||||
coding task conducted *without*
|
||||
using `CONVENTIONS.md`.
|
||||
In this case, GPT used `requests` and skipped types,
|
||||
which is perhaps more typical in small python scripts.
|
||||
|
||||
<div class="chat-transcript" markdown="1">
|
||||
> $ aider useragent.py
|
||||
>
|
||||
> Aider v0.24.2-dev
|
||||
> Added useragent.py to the chat.
|
||||
|
||||
|
||||
#### write a function that uses httpbin to check the user agent on the request. return the ua.
|
||||
|
||||
```diff
|
||||
--- /dev/null
|
||||
+++ useragent.py
|
||||
@@ ... @@
|
||||
+import requests
|
||||
+
|
||||
+def check_user_agent():
|
||||
+ response = requests.get('https://httpbin.org/user-agent')
|
||||
+ user_agent = response.json().get('user-agent')
|
||||
+ return user_agent
|
||||
```
|
||||
|
||||
> Applied edit to useragent.py
|
||||
</div>
|
250
aider/website/docs/ctags.md
Normal file
250
aider/website/docs/ctags.md
Normal file
|
@ -0,0 +1,250 @@
|
|||
---
|
||||
title: Improving GPT-4's codebase understanding with ctags
|
||||
excerpt: Using ctags to build a "repository map" to increase GPT-4's ability to understand a large code base.
|
||||
highlight_image: /assets/robot-flowchart.png
|
||||
nav_exclude: true
|
||||
---
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
|
||||
{% endif %}
|
||||
|
||||
# Improving GPT-4's codebase understanding with ctags
|
||||
|
||||

|
||||
|
||||
## Updated
|
||||
|
||||
Aider no longer uses ctags to build a repo map.
|
||||
Please see the newer article about
|
||||
[using tree-sitter to build a better repo map](https://aider.chat/docs/repomap.html).
|
||||
|
||||
-------
|
||||
|
||||
GPT-4 is extremely useful for "self-contained" coding tasks,
|
||||
like generating brand new code or modifying a pure function
|
||||
that has no dependencies.
|
||||
|
||||
But it's difficult to use GPT-4 to modify or extend
|
||||
a large, complex pre-existing codebase.
|
||||
To modify such code, GPT needs to understand the dependencies and APIs
|
||||
which interconnect its subsystems.
|
||||
Somehow we need to provide this "code context" to GPT
|
||||
when we ask it to accomplish a coding task. Specifically, we need to:
|
||||
|
||||
- Help GPT understand the overall codebase, so that it
|
||||
can decifer the meaning of code with complex dependencies and generate
|
||||
new code that respects and utilizes existing abstractions.
|
||||
- Convey all of this "code context" to GPT in an
|
||||
efficient manner that fits within the 8k-token context window.
|
||||
|
||||
To address these issues, `aider` now
|
||||
sends GPT a **concise map of your whole git repository**
|
||||
that includes
|
||||
all declared variables and functions with call signatures.
|
||||
This *repo map* is built automatically using `ctags`, which
|
||||
extracts symbol definitions from source files. Historically,
|
||||
ctags were generated and indexed by IDEs and editors to
|
||||
help humans search and navigate large codebases.
|
||||
Instead, we're going to use ctags to help GPT better comprehend, navigate
|
||||
and edit code in larger repos.
|
||||
|
||||
To get a sense of how effective this can be, this
|
||||
[chat transcript](https://aider.chat/examples/add-test.html)
|
||||
shows GPT-4 creating a black box test case, **without being given
|
||||
access to the source code of the function being tested or any of the
|
||||
other code in the repo.**
|
||||
Using only the meta-data in the repo map, GPT is able to figure out how to
|
||||
call the method to be tested, as well as how to instantiate multiple
|
||||
class objects that are required to prepare for the test.
|
||||
|
||||
To code with GPT-4 using the techniques discussed here:
|
||||
|
||||
|
||||
- Install [aider](https://aider.chat/docs/install.html).
|
||||
- Install universal ctags.
|
||||
- Run `aider` inside your repo, and it should say "Repo-map: universal-ctags using 1024 tokens".
|
||||
|
||||
## The problem: code context
|
||||
|
||||
GPT-4 is great at "self contained" coding tasks, like writing or
|
||||
modifying a pure function with no external dependencies.
|
||||
GPT can easily handle requests like "write a
|
||||
Fibonacci function" or "rewrite the loop using list
|
||||
comprehensions", because they require no context beyond the code
|
||||
being discussed.
|
||||
|
||||
Most real code is not pure and self-contained, it is intertwined with
|
||||
and depends on code from many different files in a repo.
|
||||
If you ask GPT to "switch all the print statements in class Foo to
|
||||
use the BarLog logging system", it needs to see the code in the Foo class
|
||||
with the prints, and it also needs to understand the project's BarLog
|
||||
subsystem.
|
||||
|
||||
A simple solution is to **send the entire codebase** to GPT along with
|
||||
each change request. Now GPT has all the context! But this won't work
|
||||
for even moderately
|
||||
sized repos, because they won't fit into the 8k-token context window.
|
||||
|
||||
A better approach is to be selective,
|
||||
and **hand pick which files to send**.
|
||||
For the example above, you could send the file that
|
||||
contains the Foo class
|
||||
and the file that contains the BarLog logging subsystem.
|
||||
This works pretty well, and is supported by `aider` -- you
|
||||
can manually specify which files to "add to the chat" you are having with GPT.
|
||||
|
||||
But it's not ideal to have to manually identify the right
|
||||
set of files to add to the chat.
|
||||
And sending whole files is a bulky way to send code context,
|
||||
wasting the precious 8k context window.
|
||||
GPT doesn't need to see the entire implementation of BarLog,
|
||||
it just needs to understand it well enough to use it.
|
||||
You may quickly run out of context window if you
|
||||
send many files worth of code just to convey context.
|
||||
|
||||
## Using a repo map to provide context
|
||||
|
||||
The latest version of `aider` sends a **repo map** to GPT along with
|
||||
each change request. The map contains a list of all the files in the
|
||||
repo, along with the symbols which are defined in each file. Callables
|
||||
like functions and methods also include their signatures.
|
||||
|
||||
Here's a
|
||||
sample of the map of the aider repo, just showing the maps of
|
||||
[main.py](https://github.com/paul-gauthier/aider/blob/main/aider/main.py)
|
||||
and
|
||||
[io.py](https://github.com/paul-gauthier/aider/blob/main/aider/io.py)
|
||||
:
|
||||
|
||||
```
|
||||
aider/
|
||||
...
|
||||
main.py:
|
||||
function
|
||||
main (args=None, input=None, output=None)
|
||||
variable
|
||||
status
|
||||
...
|
||||
io.py:
|
||||
class
|
||||
FileContentCompleter
|
||||
InputOutput
|
||||
FileContentCompleter
|
||||
member
|
||||
__init__ (self, fnames, commands)
|
||||
get_completions (self, document, complete_event)
|
||||
InputOutput
|
||||
member
|
||||
__init__ (self, pretty, yes, input_history_file=None, chat_history_file=None, input=None, output=None)
|
||||
ai_output (self, content)
|
||||
append_chat_history (self, text, linebreak=False, blockquote=False)
|
||||
confirm_ask (self, question, default="y")
|
||||
get_input (self, fnames, commands)
|
||||
prompt_ask (self, question, default=None)
|
||||
tool (self, *messages, log_only=False)
|
||||
tool_error (self, message)
|
||||
...
|
||||
```
|
||||
|
||||
Mapping out the repo like this provides some benefits:
|
||||
|
||||
- GPT can see variables, classes, methods and function signatures from everywhere in the repo. This alone may give it enough context to solve many tasks. For example, it can probably figure out how to use the API exported from a module just based on the details shown in the map.
|
||||
- If it needs to see more code, GPT can use the map to figure out by itself which files it needs to look at. GPT will then ask to see these specific files, and `aider` will automatically add them to the chat context (with user approval).
|
||||
|
||||
Of course, for large repositories even just the map might be too large
|
||||
for the context window. However, this mapping approach opens up the
|
||||
ability to collaborate with GPT-4 on larger codebases than previous
|
||||
methods. It also reduces the need to manually curate which files to
|
||||
add to the chat context, empowering GPT to autonomously identify
|
||||
relevant files for the task at hand.
|
||||
|
||||
## Using ctags to make the map
|
||||
|
||||
Under the hood, `aider` uses
|
||||
[universal ctags](https://github.com/universal-ctags/ctags)
|
||||
to build the
|
||||
map. Universal ctags can scan source code written in many
|
||||
languages, and extract data about all the symbols defined in each
|
||||
file.
|
||||
|
||||
Historically, ctags were generated and indexed by IDEs or code editors
|
||||
to make it easier for a human to search and navigate a
|
||||
codebase, find the implementation of functions, etc.
|
||||
Instead, we're going to use ctags to help GPT navigate and understand the codebase.
|
||||
|
||||
Here is the type of output you get when you run ctags on source code. Specifically,
|
||||
this is the
|
||||
`ctags --fields=+S --output-format=json` output for the `main.py` file mapped above:
|
||||
|
||||
```json
|
||||
{
|
||||
"_type": "tag",
|
||||
"name": "main",
|
||||
"path": "aider/main.py",
|
||||
"pattern": "/^def main(args=None, input=None, output=None):$/",
|
||||
"kind": "function",
|
||||
"signature": "(args=None, input=None, output=None)"
|
||||
}
|
||||
{
|
||||
"_type": "tag",
|
||||
"name": "status",
|
||||
"path": "aider/main.py",
|
||||
"pattern": "/^ status = main()$/",
|
||||
"kind": "variable"
|
||||
}
|
||||
```
|
||||
|
||||
The repo map is built using this type of `ctags` data,
|
||||
but formatted into the space
|
||||
efficient hierarchical tree format shown earlier.
|
||||
This is a format that GPT can easily understand
|
||||
and which conveys the map data using a
|
||||
minimal number of tokens.
|
||||
|
||||
## Example chat transcript
|
||||
|
||||
This
|
||||
[chat transcript](https://aider.chat/examples/add-test.html)
|
||||
shows GPT-4 creating a black box test case, **without being given
|
||||
access to the source code of the function being tested or any of the
|
||||
other code in the repo.** Instead, GPT is operating solely off
|
||||
the repo map.
|
||||
|
||||
Using only the meta-data in the map, GPT is able to figure out how to call the method to be tested, as well as how to instantiate multiple class objects that are required to prepare for the test.
|
||||
|
||||
GPT makes one reasonable mistake writing the first version of the test, but is
|
||||
able to quickly fix the issue after being shown the `pytest` error output.
|
||||
|
||||
## Future work
|
||||
|
||||
Just as "send the whole codebase to GPT with every request"
|
||||
is not an efficient solution to this problem,
|
||||
there are probably better approaches than
|
||||
"send the whole repo map with every request".
|
||||
Sending an appropriate subset of the repo map would help `aider` work
|
||||
better with even larger repositories which have large maps.
|
||||
|
||||
Some possible approaches to reducing the amount of map data are:
|
||||
|
||||
- Distill the global map, to prioritize important symbols and discard "internal" or otherwise less globally relevant identifiers. Possibly enlist `gpt-3.5-turbo` to perform this distillation in a flexible and language agnostic way.
|
||||
- Provide a mechanism for GPT to start with a distilled subset of the global map, and let it ask to see more detail about subtrees or keywords that it feels are relevant to the current coding task.
|
||||
- Attempt to analyize the natural language coding task given by the user and predict which subset of the repo map is relevant. Possibly by analysis of prior coding chats within the specific repo. Work on certain files or types of features may require certain somewhat predictable context from elsewhere in the repo. Vector and keyword search against the chat history, repo map or codebase may help here.
|
||||
|
||||
One key goal is to prefer solutions which are language agnostic or
|
||||
which can be easily deployed against most popular code languages.
|
||||
The `ctags` solution has this benefit, since it comes pre-built
|
||||
with support for most popular languages.
|
||||
I suspect that Language Server Protocol might be an even
|
||||
better tool than `ctags` for this problem.
|
||||
But it is more cumbersome to deploy for a broad
|
||||
array of languages.
|
||||
Users would need to stand up an LSP server for their
|
||||
specific language(s) of interest.
|
||||
|
||||
## Try it out
|
||||
|
||||
To use this experimental repo map feature:
|
||||
|
||||
- Install [aider](https://aider.chat/docs/install.html).
|
||||
- Install ctags.
|
||||
- Run `aider` inside your repo, and it should say "Repo-map: universal-ctags using 1024 tokens".
|
104
aider/website/docs/faq.md
Normal file
104
aider/website/docs/faq.md
Normal file
|
@ -0,0 +1,104 @@
|
|||
---
|
||||
nav_order: 90
|
||||
description: Frequently asked questions about aider.
|
||||
---
|
||||
|
||||
# FAQ
|
||||
{: .no_toc }
|
||||
|
||||
- TOC
|
||||
{:toc}
|
||||
|
||||
## How can I add ALL the files to the chat?
|
||||
|
||||
People regularly ask about how to add **many or all of their repo's files** to the chat.
|
||||
This is probably not a good idea and will likely do more harm than good.
|
||||
|
||||
The best approach is think about which files need to be changed to accomplish
|
||||
the task you are working on. Just add those files to the chat.
|
||||
|
||||
Usually when people want to add "all the files" it's because they think it
|
||||
will give the LLM helpful context about the overall code base.
|
||||
Aider will automatically give the LLM a bunch of additional context about
|
||||
the rest of your git repo.
|
||||
It does this by analyzing your entire codebase in light of the
|
||||
current chat to build a compact
|
||||
[repository map](https://aider.chat/2023/10/22/repomap.html).
|
||||
|
||||
Adding a bunch of files that are mostly irrelevant to the
|
||||
task at hand will often distract or confuse the LLM.
|
||||
The LLM will give worse coding results, and sometimese even fail to correctly edit files.
|
||||
Addings extra files will also increase the token costs on your OpenAI invoice.
|
||||
|
||||
Again, it's usually best to just add the files to the chat that will need to be modified.
|
||||
If you still wish to add lots of files to the chat, you can:
|
||||
|
||||
- Use a wildcard when you launch aider: `aider src/*.py`
|
||||
- Use a wildcard with the in-chat `/add` command: `/add src/*.py`
|
||||
- Give the `/add` command a directory name and it will recurisvely add every file under that dir: `/add src`
|
||||
|
||||
## How can I run aider locally from source code?
|
||||
|
||||
To run the project locally, follow these steps:
|
||||
|
||||
```
|
||||
# Clone the repository:
|
||||
git clone git@github.com:paul-gauthier/aider.git
|
||||
|
||||
# Navigate to the project directory:
|
||||
cd aider
|
||||
|
||||
# Install the dependencies listed in the `requirements.txt` file:
|
||||
pip install -r requirements.txt
|
||||
|
||||
# Run the local version of Aider:
|
||||
python -m aider.main
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Can I run aider in Google Colab?
|
||||
|
||||
User [imabutahersiddik](https://github.com/imabutahersiddik)
|
||||
has provided this
|
||||
[Colab notebook](https://colab.research.google.com/drive/1J9XynhrCqekPL5PR6olHP6eE--rnnjS9?usp=sharing).
|
||||
|
||||
|
||||
## Can I change the system prompts that aider uses?
|
||||
|
||||
Aider is set up to support different system prompts and edit formats
|
||||
in a modular way. If you look in the `aider/coders` subdirectory, you'll
|
||||
see there's a base coder with base prompts, and then there are
|
||||
a number of
|
||||
different specific coder implementations.
|
||||
|
||||
If you're thinking about experimenting with system prompts
|
||||
this document about
|
||||
[benchmarking GPT-3.5 and GPT-4 on code editing](https://aider.chat/docs/benchmarks.html)
|
||||
might be useful background.
|
||||
|
||||
While it's not well documented how to add new coder subsystems, you may be able
|
||||
to modify an existing implementation or use it as a template to add another.
|
||||
|
||||
To get started, try looking at and modifying these files.
|
||||
|
||||
The wholefile coder is currently used by GPT-3.5 by default. You can manually select it with `--edit-format whole`.
|
||||
|
||||
- wholefile_coder.py
|
||||
- wholefile_prompts.py
|
||||
|
||||
The editblock coder is currently used by GPT-4o by default. You can manually select it with `--edit-format diff`.
|
||||
|
||||
- editblock_coder.py
|
||||
- editblock_prompts.py
|
||||
|
||||
The universal diff coder is currently used by GPT-4 Turbo by default. You can manually select it with `--edit-format udiff`.
|
||||
|
||||
- udiff_coder.py
|
||||
- udiff_prompts.py
|
||||
|
||||
When experimenting with coder backends, it helps to run aider with `--verbose --no-pretty` so you can see
|
||||
all the raw information being sent to/from the LLM in the conversation.
|
||||
|
||||
You can also refer to the
|
||||
[instructions for installing a development version of aider](https://aider.chat/docs/install/optional.html#install-the-development-version-of-aider).
|
49
aider/website/docs/git.md
Normal file
49
aider/website/docs/git.md
Normal file
|
@ -0,0 +1,49 @@
|
|||
---
|
||||
parent: More info
|
||||
nav_order: 800
|
||||
description: Aider is tightly integrated with git.
|
||||
---
|
||||
|
||||
# Git integration
|
||||
|
||||
Aider works best with code that is part of a git repo.
|
||||
Aider is tightly integrated with git, which makes it easy to:
|
||||
|
||||
- Use git to undo any aider changes that you don't like
|
||||
- Go back in the git history to review the changes that aider made to your code
|
||||
- Manage a series of aider's changes on a git branch
|
||||
|
||||
Aider specifically uses git in these ways:
|
||||
|
||||
- It asks to create a git repo if you launch it in a directory without one.
|
||||
- Whenever aider edits a file, it commits those changes with a descriptive commit message. This makes it easy to undo or review aider's changes.
|
||||
- Aider takes special care before editing files that already have uncommitted changes (dirty files). Aider will first commit any preexisting changes with a descriptive commit message.
|
||||
This keeps your edits separate from aider's edits, and makes sure you never lose your work if aider makes an inappropriate change.
|
||||
|
||||
## In-chat commands
|
||||
|
||||
Aider also allows you to use in-chat commands to `/diff` or `/undo` the last change.
|
||||
To do more complex management of your git history, you cat use raw `git` commands,
|
||||
either by using `/git` within the chat, or with standard git tools outside of aider.
|
||||
|
||||
## Disabling git integration
|
||||
|
||||
While it is not recommended, you can disable aider's use of git in a few ways:
|
||||
|
||||
- `--no-auto-commits` will stop aider from git committing each of its changes.
|
||||
- `--no-dirty-commits` will stop aider from committing dirty files before applying its edits.
|
||||
- `--no-git` will completely stop aider from using git on your files. You should ensure you are keeping sensible backups of the files you are working with.
|
||||
|
||||
|
||||
## Commit attribution
|
||||
|
||||
Aider marks commits that it either authored or committed.
|
||||
|
||||
- If aider authored the changes in a commit, they will have "(aider)" appended to the git author and git committer name metadata.
|
||||
- If aider simply committed changes (found in dirty files), the commit will have "(aider)" appended to the git committer name metadata.
|
||||
|
||||
You can use `--no-attribute-author` and `--no-attribute-committer` to disable
|
||||
modification of the git author and committer name fields.
|
||||
|
||||
Additionally, you can use `--attribute-commit-message` to prefix commit messages with 'aider: '.
|
||||
This option is disabled by default, but can be useful for easily identifying commits made by aider.
|
42
aider/website/docs/images-urls.md
Normal file
42
aider/website/docs/images-urls.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
---
|
||||
parent: Usage
|
||||
nav_order: 700
|
||||
description: Add images and URLs to the aider coding chat.
|
||||
---
|
||||
|
||||
# Images & URLs
|
||||
|
||||
You can add images and URLs to the aider chat.
|
||||
|
||||
## Images
|
||||
|
||||
Aider supports working with image files for many vision-capable models
|
||||
like GPT-4o and Claude 3.5 Sonnet.
|
||||
Adding images to a chat can be helpful in many situations:
|
||||
|
||||
- Add screenshots of web pages or UIs that you want aider to build or modify.
|
||||
- Show aider a mockup of a UI you want to build.
|
||||
- Screenshot an error message that is otherwise hard to copy & paste as text.
|
||||
- Etc.
|
||||
|
||||
You can add images to the chat just like you would
|
||||
add any other file:
|
||||
|
||||
- Use `/add <image-filename>` from within the chat
|
||||
- Launch aider with image filenames on the command line: `aider <image-filename>` along with any other command line arguments you need.
|
||||
|
||||
## URLs
|
||||
|
||||
Aider can scrape the text from URLs and add it to the chat.
|
||||
This can be helpful to:
|
||||
|
||||
- Include documentation pages for less popular APIs.
|
||||
- Include the latest docs for libraries or packages that are newer than the model's training cutoff date.
|
||||
- Etc.
|
||||
|
||||
To add URLs to the chat:
|
||||
|
||||
- Use `/web <url>`
|
||||
- Just paste the URL into the chat and aider will ask if you want to add it.
|
||||
|
||||
|
43
aider/website/docs/install.md
Normal file
43
aider/website/docs/install.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
title: Installation
|
||||
has_children: true
|
||||
nav_order: 20
|
||||
description: How to install and get started pair programming with aider.
|
||||
---
|
||||
|
||||
# Quick start
|
||||
|
||||
{% include get-started.md %}
|
||||
|
||||
Or see the
|
||||
[full installation instructions](/docs/install/install.html)
|
||||
for more details,
|
||||
or the
|
||||
[usage instructions](https://aider.chat/docs/usage.html) to start coding with aider.
|
||||
|
||||
<div class="video-container">
|
||||
<video controls poster="/assets/install.jpg">
|
||||
<source src="/assets/install.mp4" type="video/mp4">
|
||||
<a href="/assets/install.mp4">Installing aider</a>
|
||||
</video>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.video-container {
|
||||
position: relative;
|
||||
padding-bottom: 76.2711864407%;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.video-container video {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
|
39
aider/website/docs/install/codespaces.md
Normal file
39
aider/website/docs/install/codespaces.md
Normal file
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
title: GitHub Codespaces
|
||||
parent: Installation
|
||||
nav_order: 900
|
||||
---
|
||||
|
||||
# GitHub Codespaces
|
||||
|
||||
You can use aider in GitHub Codespaces via the built-in Terminal pane.
|
||||
See below for an example,
|
||||
but you can see the
|
||||
[main install instructions](/docs/install.html)
|
||||
for all the details.
|
||||
|
||||
|
||||
<div class="video-container">
|
||||
<video controls poster="/assets/codespaces.jpg">
|
||||
<source src="/assets/codespaces.mp4" type="video/mp4">
|
||||
<a href="/assets/codespaces.mp4">Install aider in GitHub Codespaces</a>
|
||||
</video>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.video-container {
|
||||
position: relative;
|
||||
padding-bottom: 101.89%; /* 1080 / 1060 = 1.0189 */
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.video-container video {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
|
36
aider/website/docs/install/docker.md
Normal file
36
aider/website/docs/install/docker.md
Normal file
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
parent: Installation
|
||||
nav_order: 100
|
||||
---
|
||||
|
||||
# Aider with docker
|
||||
|
||||
You can run aider via docker without doing any local installation, like this:
|
||||
|
||||
```
|
||||
docker pull paulgauthier/aider
|
||||
docker run -it --volume $(pwd):/app paulgauthier/aider --openai-api-key $OPENAI_API_KEY [...other aider args...]
|
||||
```
|
||||
|
||||
You should run the above commands from the root of your git repo,
|
||||
since the `--volume` arg maps your current directory into the
|
||||
docker container.
|
||||
Given that, you need to be in the root of your git repo for aider to be able to
|
||||
see the repo and all its files.
|
||||
|
||||
You should be sure your that
|
||||
git repo config contains your user name and email, since the
|
||||
docker container won't have your global git config.
|
||||
Run these commands while in your git repo, before
|
||||
you do the `docker run` command:
|
||||
|
||||
```
|
||||
git config user.email "you@example.com"
|
||||
git config user.name "Your Name"
|
||||
```
|
||||
|
||||
|
||||
## Limitations
|
||||
|
||||
- When you use the in-chat `/run` command, it will be running shell commands *inside the docker container*. So those commands won't be running in your local environment, which may make it tricky to `/run` tests, etc for your project.
|
||||
- The `/voice` command won't work unless you can figure out how to give the docker container access to your host audio device. The container has libportaudio2 installed, so it should work if you can do that.
|
69
aider/website/docs/install/install.md
Normal file
69
aider/website/docs/install/install.md
Normal file
|
@ -0,0 +1,69 @@
|
|||
---
|
||||
parent: Installation
|
||||
nav_order: 10
|
||||
---
|
||||
|
||||
# Installing aider
|
||||
{: .no_toc }
|
||||
|
||||
- TOC
|
||||
{:toc}
|
||||
|
||||
## Install git
|
||||
|
||||
Make sure you have git installed.
|
||||
Here are
|
||||
[instructions for installing git in various environments](https://github.com/git-guides/install-git).
|
||||
|
||||
## Get your API key
|
||||
|
||||
To work with OpenAI's GPT 3.5 or GPT-4 models you need a paid
|
||||
[OpenAI API key](https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key).
|
||||
Note that this is different than being a "ChatGPT Plus" subscriber.
|
||||
|
||||
To work with Anthropic's models like Claude 3 Opus you need a paid
|
||||
[Anthropic API key](https://docs.anthropic.com/claude/reference/getting-started-with-the-api).
|
||||
|
||||
## Manage your python environment
|
||||
|
||||
Using a Python
|
||||
[virtual environment](https://docs.python.org/3/library/venv.html)
|
||||
is recommended.
|
||||
Or, you could consider
|
||||
[installing aider using pipx](/docs/install/pipx.html).
|
||||
|
||||
## Windows install
|
||||
|
||||
```
|
||||
# Install aider
|
||||
py -m pip install aider-chat
|
||||
|
||||
# To work with GPT-4o:
|
||||
$ aider --openai-api-key sk-xxx...
|
||||
|
||||
# To work with Claude 3 Opus:
|
||||
$ aider --anthropic-api-key sk-xxx... --opus
|
||||
```
|
||||
|
||||
## Mac/Linux install
|
||||
|
||||
```
|
||||
# Install aider
|
||||
python -m pip install aider-chat
|
||||
|
||||
# To work with GPT-4o:
|
||||
$ aider --openai-api-key sk-xxx...
|
||||
|
||||
# To work with Claude 3 Opus:
|
||||
$ aider --anthropic-api-key sk-xxx... --opus
|
||||
```
|
||||
|
||||
## Working with other LLMs
|
||||
|
||||
Aider works well with GPT-4o, Claude 3 Opus, GPT-3.5 and supports [connecting to almost any LLM](https://aider.chat/docs/llms.html).
|
||||
|
||||
## You are done!
|
||||
|
||||
There are some [optional install steps](/docs/install/optional.html) you could consider.
|
||||
See the [usage instructions](https://aider.chat/docs/usage.html) to start coding with aider.
|
||||
|
101
aider/website/docs/install/optional.md
Normal file
101
aider/website/docs/install/optional.md
Normal file
|
@ -0,0 +1,101 @@
|
|||
---
|
||||
parent: Installation
|
||||
nav_order: 20
|
||||
---
|
||||
|
||||
# Optional steps
|
||||
{: .no_toc }
|
||||
|
||||
The steps below are completely optional.
|
||||
|
||||
- TOC
|
||||
{:toc}
|
||||
|
||||
|
||||
## Store your api keys
|
||||
|
||||
You can place your [api keys in a `.env` file](/docs/config/dotenv.html)
|
||||
and they will be loaded automatically whenever you run aider.
|
||||
|
||||
## Enable Playwright
|
||||
|
||||
Aider supports adding web pages to the chat with the `/web <url>` command.
|
||||
When you add a url to the chat, aider fetches the page and scrapes its
|
||||
content.
|
||||
|
||||
By default, aider uses the `httpx` library to scrape web pages, but this only
|
||||
works on a subset of web pages.
|
||||
Some sites explicitly block requests from tools like httpx.
|
||||
Others rely heavily on javascript to render the page content,
|
||||
which isn't possible using only httpx.
|
||||
|
||||
Aider works best with all web pages if you install
|
||||
Playwright's chromium browser and its dependencies:
|
||||
|
||||
```
|
||||
playwright install --with-deps chromium
|
||||
```
|
||||
|
||||
See the
|
||||
[Playwright for Python documentation](https://playwright.dev/python/docs/browsers#install-system-dependencies)
|
||||
for additional information.
|
||||
|
||||
|
||||
## Enable voice coding
|
||||
|
||||
Aider supports [coding with your voice](https://aider.chat/docs/voice.html)
|
||||
using the in-chat `/voice` command.
|
||||
Aider uses the [PortAudio](http://www.portaudio.com) library to
|
||||
capture audio.
|
||||
Installing PortAudio is completely optional, but can usually be accomplished like this:
|
||||
|
||||
- For Windows, there is no need to install PortAudio.
|
||||
- For Mac, do `brew install portaudio`
|
||||
- For Linux, do `sudo apt-get install libportaudio2`
|
||||
|
||||
## Add aider to your editor
|
||||
|
||||
Other projects have integrated aider into some IDE/editors.
|
||||
It's not clear if they are tracking the latest
|
||||
versions of aider,
|
||||
so it may be best to just run the latest
|
||||
aider in a terminal alongside your editor.
|
||||
|
||||
### NeoVim
|
||||
|
||||
[joshuavial](https://github.com/joshuavial) provided a NeoVim plugin for aider:
|
||||
|
||||
[https://github.com/joshuavial/aider.nvim](https://github.com/joshuavial/aider.nvim)
|
||||
|
||||
### VS Code
|
||||
|
||||
joshuavial also confirmed that aider works inside a VS Code terminal window.
|
||||
Aider detects if it is running inside VSCode and turns off pretty/color output,
|
||||
since the VSCode terminal doesn't seem to support it well.
|
||||
|
||||
[MattFlower](https://github.com/MattFlower) provided a VSCode plugin for aider:
|
||||
|
||||
[https://marketplace.visualstudio.com/items?itemName=MattFlower.aider](https://marketplace.visualstudio.com/items?itemName=MattFlower.aider)
|
||||
|
||||
### Other editors
|
||||
|
||||
If you are interested in creating an aider plugin for your favorite editor,
|
||||
please let me know by opening a
|
||||
[GitHub issue](https://github.com/paul-gauthier/aider/issues).
|
||||
|
||||
|
||||
## Install the development version of aider
|
||||
|
||||
If you want the very latest development version of aider
|
||||
you can install directly from GitHub:
|
||||
|
||||
```
|
||||
python -m pip install --upgrade git+https://github.com/paul-gauthier/aider.git
|
||||
```
|
||||
|
||||
If you've git cloned the aider repository already, you can install "live" from your local copy. This is mostly useful if you are developing aider and want your current modifications to take effect immediately.
|
||||
|
||||
```
|
||||
python -m pip install -e .
|
||||
```
|
||||
|
27
aider/website/docs/install/pipx.md
Normal file
27
aider/website/docs/install/pipx.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
parent: Installation
|
||||
nav_order: 100
|
||||
---
|
||||
|
||||
# Install with pipx
|
||||
|
||||
If you are using aider to work on a python project, sometimes your project will require
|
||||
specific versions of python packages which conflict with the versions that aider
|
||||
requires.
|
||||
If this happens, the `pip install` command may return errors like these:
|
||||
|
||||
```
|
||||
aider-chat 0.23.0 requires somepackage==X.Y.Z, but you have somepackage U.W.V which is incompatible.
|
||||
```
|
||||
|
||||
You can avoid this problem by installing aider using `pipx`,
|
||||
which will install it globally on your system
|
||||
within its own python environment.
|
||||
This way you can use aider to work on any python project,
|
||||
even if that project has conflicting dependencies.
|
||||
|
||||
Install [pipx](https://pipx.pypa.io/stable/) then just do:
|
||||
|
||||
```
|
||||
pipx install aider-chat
|
||||
```
|
142
aider/website/docs/languages.md
Normal file
142
aider/website/docs/languages.md
Normal file
|
@ -0,0 +1,142 @@
|
|||
---
|
||||
parent: More info
|
||||
nav_order: 900
|
||||
description: Aider supports pretty much all popular coding languages.
|
||||
---
|
||||
# Supported languages
|
||||
|
||||
Aider supports pretty much all the popular coding languages.
|
||||
This is partly because top LLMs are fluent in most mainstream languages,
|
||||
and familiar with popular libraries, packages and frameworks.
|
||||
|
||||
In fact, coding with aider is sometimes the most magical
|
||||
when you're working in a language that you
|
||||
are less familiar with.
|
||||
the LLM often knows the language better than you,
|
||||
and can generate all the boilerplate to get to the heart of your
|
||||
problem.
|
||||
The LLM will often solve your problem in an elegant way
|
||||
using a library or package that you weren't even aware of.
|
||||
|
||||
Aider uses tree-sitter to do code analysis and help
|
||||
the LLM navigate larger code bases by producing
|
||||
a [repository map](https://aider.chat/docs/repomap.html).
|
||||
|
||||
Aider can currently produce repository maps for most mainstream languages, listed below.
|
||||
But aider should work quite well for other languages, even without repo map support.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
Language
|
||||
</th>
|
||||
<th>
|
||||
File extension
|
||||
</th>
|
||||
</tr>
|
||||
<!--[[[cog
|
||||
from aider.repomap import get_supported_languages_md
|
||||
cog.out(get_supported_languages_md())
|
||||
]]]-->
|
||||
<tr><td style="text-align: center;">bash </td>
|
||||
<td style="text-align: center;">.bash </td>
|
||||
</tr><tr><td style="text-align: center;">c </td>
|
||||
<td style="text-align: center;">.c </td>
|
||||
</tr><tr><td style="text-align: center;">c_sharp </td>
|
||||
<td style="text-align: center;">.cs </td>
|
||||
</tr><tr><td style="text-align: center;">commonlisp </td>
|
||||
<td style="text-align: center;">.cl </td>
|
||||
</tr><tr><td style="text-align: center;">cpp </td>
|
||||
<td style="text-align: center;">.cc </td>
|
||||
</tr><tr><td style="text-align: center;">cpp </td>
|
||||
<td style="text-align: center;">.cpp </td>
|
||||
</tr><tr><td style="text-align: center;">css </td>
|
||||
<td style="text-align: center;">.css </td>
|
||||
</tr><tr><td style="text-align: center;">dockerfile </td>
|
||||
<td style="text-align: center;">.dockerfile </td>
|
||||
</tr><tr><td style="text-align: center;">dot </td>
|
||||
<td style="text-align: center;">.dot </td>
|
||||
</tr><tr><td style="text-align: center;">elisp </td>
|
||||
<td style="text-align: center;">.el </td>
|
||||
</tr><tr><td style="text-align: center;">elixir </td>
|
||||
<td style="text-align: center;">.ex </td>
|
||||
</tr><tr><td style="text-align: center;">elm </td>
|
||||
<td style="text-align: center;">.elm </td>
|
||||
</tr><tr><td style="text-align: center;">embedded_template </td>
|
||||
<td style="text-align: center;">.et </td>
|
||||
</tr><tr><td style="text-align: center;">erlang </td>
|
||||
<td style="text-align: center;">.erl </td>
|
||||
</tr><tr><td style="text-align: center;">go </td>
|
||||
<td style="text-align: center;">.go </td>
|
||||
</tr><tr><td style="text-align: center;">gomod </td>
|
||||
<td style="text-align: center;">.gomod </td>
|
||||
</tr><tr><td style="text-align: center;">hack </td>
|
||||
<td style="text-align: center;">.hack </td>
|
||||
</tr><tr><td style="text-align: center;">haskell </td>
|
||||
<td style="text-align: center;">.hs </td>
|
||||
</tr><tr><td style="text-align: center;">hcl </td>
|
||||
<td style="text-align: center;">.hcl </td>
|
||||
</tr><tr><td style="text-align: center;">html </td>
|
||||
<td style="text-align: center;">.html </td>
|
||||
</tr><tr><td style="text-align: center;">java </td>
|
||||
<td style="text-align: center;">.java </td>
|
||||
</tr><tr><td style="text-align: center;">javascript </td>
|
||||
<td style="text-align: center;">.js </td>
|
||||
</tr><tr><td style="text-align: center;">javascript </td>
|
||||
<td style="text-align: center;">.mjs </td>
|
||||
</tr><tr><td style="text-align: center;">jsdoc </td>
|
||||
<td style="text-align: center;">.jsdoc </td>
|
||||
</tr><tr><td style="text-align: center;">json </td>
|
||||
<td style="text-align: center;">.json </td>
|
||||
</tr><tr><td style="text-align: center;">julia </td>
|
||||
<td style="text-align: center;">.jl </td>
|
||||
</tr><tr><td style="text-align: center;">kotlin </td>
|
||||
<td style="text-align: center;">.kt </td>
|
||||
</tr><tr><td style="text-align: center;">lua </td>
|
||||
<td style="text-align: center;">.lua </td>
|
||||
</tr><tr><td style="text-align: center;">make </td>
|
||||
<td style="text-align: center;">.mk </td>
|
||||
</tr><tr><td style="text-align: center;">objc </td>
|
||||
<td style="text-align: center;">.m </td>
|
||||
</tr><tr><td style="text-align: center;">ocaml </td>
|
||||
<td style="text-align: center;">.ml </td>
|
||||
</tr><tr><td style="text-align: center;">perl </td>
|
||||
<td style="text-align: center;">.pl </td>
|
||||
</tr><tr><td style="text-align: center;">php </td>
|
||||
<td style="text-align: center;">.php </td>
|
||||
</tr><tr><td style="text-align: center;">python </td>
|
||||
<td style="text-align: center;">.py </td>
|
||||
</tr><tr><td style="text-align: center;">ql </td>
|
||||
<td style="text-align: center;">.ql </td>
|
||||
</tr><tr><td style="text-align: center;">r </td>
|
||||
<td style="text-align: center;">.R </td>
|
||||
</tr><tr><td style="text-align: center;">r </td>
|
||||
<td style="text-align: center;">.r </td>
|
||||
</tr><tr><td style="text-align: center;">regex </td>
|
||||
<td style="text-align: center;">.regex </td>
|
||||
</tr><tr><td style="text-align: center;">rst </td>
|
||||
<td style="text-align: center;">.rst </td>
|
||||
</tr><tr><td style="text-align: center;">ruby </td>
|
||||
<td style="text-align: center;">.rb </td>
|
||||
</tr><tr><td style="text-align: center;">rust </td>
|
||||
<td style="text-align: center;">.rs </td>
|
||||
</tr><tr><td style="text-align: center;">scala </td>
|
||||
<td style="text-align: center;">.scala </td>
|
||||
</tr><tr><td style="text-align: center;">sql </td>
|
||||
<td style="text-align: center;">.sql </td>
|
||||
</tr><tr><td style="text-align: center;">sqlite </td>
|
||||
<td style="text-align: center;">.sqlite </td>
|
||||
</tr><tr><td style="text-align: center;">toml </td>
|
||||
<td style="text-align: center;">.toml </td>
|
||||
</tr><tr><td style="text-align: center;">tsq </td>
|
||||
<td style="text-align: center;">.tsq </td>
|
||||
</tr><tr><td style="text-align: center;">typescript </td>
|
||||
<td style="text-align: center;">.ts </td>
|
||||
</tr><tr><td style="text-align: center;">typescript </td>
|
||||
<td style="text-align: center;">.tsx </td>
|
||||
</tr><tr><td style="text-align: center;">yaml </td>
|
||||
<td style="text-align: center;">.yaml </td>
|
||||
</tr>
|
||||
<!--[[[end]]]-->
|
||||
|
||||
</table>
|
211
aider/website/docs/leaderboards/index.md
Normal file
211
aider/website/docs/leaderboards/index.md
Normal file
|
@ -0,0 +1,211 @@
|
|||
---
|
||||
highlight_image: /assets/leaderboard.jpg
|
||||
nav_order: 950
|
||||
---
|
||||
|
||||
# Aider LLM Leaderboards
|
||||
|
||||
Aider works best with LLMs which are good at *editing* code, not just good at writing
|
||||
code.
|
||||
To evaluate an LLM's editing skill, aider uses a pair of benchmarks that
|
||||
assess a model's ability to consistently follow the system prompt
|
||||
to successfully edit code.
|
||||
|
||||
The leaderboards below report the results from a number of popular LLMs.
|
||||
While [aider can connect to almost any LLM](/docs/llms.html),
|
||||
it works best with models that score well on the benchmarks.
|
||||
|
||||
|
||||
## Code editing leaderboard
|
||||
|
||||
[Aider's code editing benchmark](/docs/benchmarks.html#the-benchmark) asks the LLM to edit python source files to complete 133 small coding exercises. This benchmark measures the LLM's coding ability, but also whether it can consistently emit code edits in the format specified in the system prompt.
|
||||
|
||||
<table style="width: 100%; max-width: 800px; margin: auto; border-collapse: collapse; box-shadow: 0 2px 4px rgba(0,0,0,0.1); font-size: 14px;">
|
||||
<thead style="background-color: #f2f2f2;">
|
||||
<tr>
|
||||
<th style="padding: 8px; text-align: left;">Model</th>
|
||||
<th style="padding: 8px; text-align: center;">Percent completed correctly</th>
|
||||
<th style="padding: 8px; text-align: center;">Percent using correct edit format</th>
|
||||
<th style="padding: 8px; text-align: left;">Command</th>
|
||||
<th style="padding: 8px; text-align: center;">Edit format</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% assign edit_sorted = site.data.edit_leaderboard | sort: 'pass_rate_2' | reverse %}
|
||||
{% for row in edit_sorted %}
|
||||
<tr style="border-bottom: 1px solid #ddd;">
|
||||
<td style="padding: 8px;">{{ row.model }}</td>
|
||||
<td style="padding: 8px; text-align: center;">{{ row.pass_rate_2 }}%</td>
|
||||
<td style="padding: 8px; text-align: center;">{{ row.percent_cases_well_formed }}%</td>
|
||||
<td style="padding: 8px;"><code>{{ row.command }}</code></td>
|
||||
<td style="padding: 8px; text-align: center;">{{ row.edit_format }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<canvas id="editChart" width="800" height="450" style="margin-top: 20px"></canvas>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var ctx = document.getElementById('editChart').getContext('2d');
|
||||
var leaderboardData = {
|
||||
labels: [],
|
||||
datasets: [{
|
||||
label: 'Percent completed correctly',
|
||||
data: [],
|
||||
backgroundColor: 'rgba(54, 162, 235, 0.2)',
|
||||
borderColor: 'rgba(54, 162, 235, 1)',
|
||||
borderWidth: 1
|
||||
},
|
||||
{
|
||||
label: 'Percent using correct edit format',
|
||||
data: [],
|
||||
backgroundColor: 'rgba(255, 99, 132, 0.2)',
|
||||
borderColor: 'rgba(255, 99, 132, 1)',
|
||||
borderWidth: 1
|
||||
}]
|
||||
};
|
||||
|
||||
{% for row in edit_sorted %}
|
||||
leaderboardData.labels.push('{{ row.model }}');
|
||||
leaderboardData.datasets[0].data.push({{ row.pass_rate_2 }});
|
||||
leaderboardData.datasets[1].data.push({{ row.percent_cases_well_formed }});
|
||||
{% endfor %}
|
||||
|
||||
var leaderboardChart = new Chart(ctx, {
|
||||
type: 'bar',
|
||||
data: leaderboardData,
|
||||
options: {
|
||||
scales: {
|
||||
yAxes: [{
|
||||
scaleLabel: {
|
||||
display: true,
|
||||
},
|
||||
ticks: {
|
||||
beginAtZero: true
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
## Code refactoring leaderboard
|
||||
|
||||
[Aider's refactoring benchmark](https://github.com/paul-gauthier/refactor-benchmark) asks the LLM to refactor 89 large methods from large python classes. This is a more challenging benchmark, which tests the model's ability to output long chunks of code without skipping sections or making mistakes. It was developed to provoke and measure [GPT-4 Turbo's "lazy coding" habit](/2023/12/21/unified-diffs.html).
|
||||
|
||||
The refactoring benchmark requires a large context window to
|
||||
work with large source files.
|
||||
Therefore, results are available for fewer models.
|
||||
|
||||
<table style="width: 100%; max-width: 800px; margin: auto; border-collapse: collapse; box-shadow: 0 2px 4px rgba(0,0,0,0.1); font-size: 14px;">
|
||||
<thead style="background-color: #f2f2f2;">
|
||||
<tr>
|
||||
<th style="padding: 8px; text-align: left;">Model</th>
|
||||
<th style="padding: 8px; text-align: center;">Percent completed correctly</th>
|
||||
<th style="padding: 8px; text-align: center;">Percent using correct edit format</th>
|
||||
<th style="padding: 8px; text-align: left;">Command</th>
|
||||
<th style="padding: 8px; text-align: center;">Edit format</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% assign refac_sorted = site.data.refactor_leaderboard | sort: 'pass_rate_1' | reverse %}
|
||||
{% for row in refac_sorted %}
|
||||
<tr style="border-bottom: 1px solid #ddd;">
|
||||
<td style="padding: 8px;">{{ row.model }}</td>
|
||||
<td style="padding: 8px; text-align: center;">{{ row.pass_rate_1 }}%</td>
|
||||
<td style="padding: 8px; text-align: center;">{{ row.percent_cases_well_formed }}%</td>
|
||||
<td style="padding: 8px;"><code>{{ row.command }}</code></td>
|
||||
<td style="padding: 8px; text-align: center;">{{ row.edit_format }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<canvas id="refacChart" width="800" height="450" style="margin-top: 20px"></canvas>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var ctx = document.getElementById('refacChart').getContext('2d');
|
||||
var leaderboardData = {
|
||||
labels: [],
|
||||
datasets: [{
|
||||
label: 'Percent completed correctly',
|
||||
data: [],
|
||||
backgroundColor: 'rgba(54, 162, 235, 0.2)',
|
||||
borderColor: 'rgba(54, 162, 235, 1)',
|
||||
borderWidth: 1
|
||||
},
|
||||
{
|
||||
label: 'Percent using correct edit format',
|
||||
data: [],
|
||||
backgroundColor: 'rgba(255, 99, 132, 0.2)',
|
||||
borderColor: 'rgba(255, 99, 132, 1)',
|
||||
borderWidth: 1
|
||||
}]
|
||||
};
|
||||
|
||||
{% for row in refac_sorted %}
|
||||
leaderboardData.labels.push('{{ row.model }}');
|
||||
leaderboardData.datasets[0].data.push({{ row.pass_rate_1 }});
|
||||
leaderboardData.datasets[1].data.push({{ row.percent_cases_well_formed }});
|
||||
{% endfor %}
|
||||
|
||||
var leaderboardChart = new Chart(ctx, {
|
||||
type: 'bar',
|
||||
data: leaderboardData,
|
||||
options: {
|
||||
scales: {
|
||||
yAxes: [{
|
||||
scaleLabel: {
|
||||
display: true,
|
||||
},
|
||||
ticks: {
|
||||
beginAtZero: true
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
## LLM code editing skill by model release date
|
||||
|
||||
[](https://aider.chat/assets/models-over-time.svg)
|
||||
|
||||
|
||||
## Notes on benchmarking results
|
||||
|
||||
The key benchmarking results are:
|
||||
|
||||
- **Percent completed correctly** - Measures what percentage of the coding tasks that the LLM completed successfully. To complete a task, the LLM must solve the programming assignment *and* edit the code to implement that solution.
|
||||
- **Percent using correct edit format** - Measures the percent of coding tasks where the LLM complied with the edit format specified in the system prompt. If the LLM makes edit mistakes, aider will give it feedback and ask for a fixed copy of the edit. The best models can reliably conform to the edit format, without making errors.
|
||||
|
||||
|
||||
## Notes on the edit format
|
||||
|
||||
Aider uses different "edit formats" to collect code edits from different LLMs.
|
||||
The "whole" format is the easiest for an LLM to use, but it uses a lot of tokens
|
||||
and may limit how large a file can be edited.
|
||||
Models which can use one of the diff formats are much more efficient,
|
||||
using far fewer tokens.
|
||||
Models that use a diff-like format are able to
|
||||
edit larger files with less cost and without hitting token limits.
|
||||
|
||||
Aider is configured to use the best edit format for the popular OpenAI and Anthropic models
|
||||
and the [other models recommended on the LLM page](/docs/llms.html).
|
||||
For lesser known models aider will default to using the "whole" editing format
|
||||
since it is the easiest format for an LLM to use.
|
||||
|
||||
## Contributing benchmark results
|
||||
|
||||
Contributions of benchmark results are welcome!
|
||||
See the
|
||||
[benchmark README](https://github.com/paul-gauthier/aider/blob/main/benchmark/README.md)
|
||||
for information on running aider's code editing benchmarks.
|
||||
Submit results by opening a PR with edits to the
|
||||
[benchmark results data files](https://github.com/paul-gauthier/aider/blob/main/website/_data/).
|
56
aider/website/docs/llms.md
Normal file
56
aider/website/docs/llms.md
Normal file
|
@ -0,0 +1,56 @@
|
|||
---
|
||||
title: Connecting to LLMs
|
||||
nav_order: 40
|
||||
has_children: true
|
||||
description: Aider can connect to most LLMs for AI pair programming.
|
||||
---
|
||||
|
||||
# Aider can connect to most LLMs
|
||||
{: .no_toc }
|
||||
|
||||
[](https://aider.chat/assets/llms.jpg)
|
||||
|
||||
|
||||
## Best models
|
||||
{: .no_toc }
|
||||
|
||||
Aider works best with these models, which are skilled at editing code:
|
||||
|
||||
- [GPT-4o](/docs/llms/openai.html)
|
||||
- [Claude 3.5 Sonnet](/docs/llms/anthropic.html)
|
||||
- [Claude 3 Opus](/docs/llms/anthropic.html)
|
||||
- [DeepSeek Coder V2](/docs/llms/deepseek.html)
|
||||
|
||||
|
||||
## Free models
|
||||
{: .no_toc }
|
||||
|
||||
Aider works with a number of **free** API providers:
|
||||
|
||||
- Google's [Gemini 1.5 Pro](/docs/llms/gemini.html) works with aider, with
|
||||
code editing capabilities similar to GPT-3.5.
|
||||
- You can use [Llama 3 70B on Groq](/docs/llms/groq.html) which is comparable to GPT-3.5 in code editing performance.
|
||||
- Cohere also offers free API access to their [Command-R+ model](/docs/llms/cohere.html), which works with aider as a *very basic* coding assistant.
|
||||
|
||||
## Local models
|
||||
{: .no_toc }
|
||||
|
||||
Aider can work also with local models, for example using [Ollama](/docs/llms/ollama.html).
|
||||
It can also access
|
||||
local models that provide an
|
||||
[Open AI compatible API](/docs/llms/openai-compat.html).
|
||||
|
||||
## Use a capable model
|
||||
{: .no_toc }
|
||||
|
||||
Check
|
||||
[Aider's LLM leaderboards](https://aider.chat/docs/leaderboards/)
|
||||
to see which models work best with aider.
|
||||
|
||||
Be aware that aider may not work well with less capable models.
|
||||
If you see the model returning code, but aider isn't able to edit your files
|
||||
and commit the changes...
|
||||
this is usually because the model isn't capable of properly
|
||||
returning "code edits".
|
||||
Models weaker than GPT 3.5 may have problems working well with aider.
|
||||
|
34
aider/website/docs/llms/anthropic.md
Normal file
34
aider/website/docs/llms/anthropic.md
Normal file
|
@ -0,0 +1,34 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 200
|
||||
---
|
||||
|
||||
# Anthropic
|
||||
|
||||
To work with Anthropic's models, you need to provide your
|
||||
[Anthropic API key](https://docs.anthropic.com/claude/reference/getting-started-with-the-api)
|
||||
either in the `ANTHROPIC_API_KEY` environment variable or
|
||||
via the `--anthropic-api-key` command line switch.
|
||||
|
||||
Aider has some built in shortcuts for the most popular Anthropic models and
|
||||
has been tested and benchmarked to work well with them:
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export ANTHROPIC_API_KEY=<key> # Mac/Linux
|
||||
setx ANTHROPIC_API_KEY <key> # Windows
|
||||
|
||||
# Aider uses Claude 3.5 Sonnet by default (or use --sonnet)
|
||||
aider
|
||||
|
||||
# Claude 3 Opus
|
||||
aider --opus
|
||||
|
||||
# List models available from Anthropic
|
||||
aider --models anthropic/
|
||||
```
|
||||
|
||||
You can use `aider --model <model-name>` to use any other Anthropic model.
|
||||
For example, if you want to use a specific version of Opus
|
||||
you could do `aider --model claude-3-opus-20240229`.
|
30
aider/website/docs/llms/azure.md
Normal file
30
aider/website/docs/llms/azure.md
Normal file
|
@ -0,0 +1,30 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 500
|
||||
---
|
||||
|
||||
# Azure
|
||||
|
||||
Aider can connect to the OpenAI models on Azure.
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
# Mac/Linux:
|
||||
export AZURE_API_KEY=<key>
|
||||
export AZURE_API_VERSION=2023-05-15
|
||||
export AZURE_API_BASE=https://myendpt.openai.azure.com
|
||||
|
||||
# Windows:
|
||||
setx AZURE_API_KEY <key>
|
||||
setx AZURE_API_VERSION 2023-05-15
|
||||
setx AZURE_API_BASE https://myendpt.openai.azure.com
|
||||
|
||||
aider --model azure/<your_deployment_name>
|
||||
|
||||
# List models available from Azure
|
||||
aider --models azure/
|
||||
```
|
||||
|
||||
Note that aider will also use environment variables
|
||||
like `AZURE_OPENAI_API_xxx`.
|
25
aider/website/docs/llms/cohere.md
Normal file
25
aider/website/docs/llms/cohere.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 500
|
||||
---
|
||||
|
||||
# Cohere
|
||||
|
||||
Cohere offers *free* API access to their models.
|
||||
Their Command-R+ model works well with aider
|
||||
as a *very basic* coding assistant.
|
||||
You'll need a [Cohere API key](https://dashboard.cohere.com/welcome/login).
|
||||
|
||||
To use **Command-R+**:
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export COHERE_API_KEY=<key> # Mac/Linux
|
||||
setx COHERE_API_KEY <key> # Windows
|
||||
|
||||
aider --model command-r-plus
|
||||
|
||||
# List models available from Cohere
|
||||
aider --models cohere_chat/
|
||||
```
|
24
aider/website/docs/llms/deepseek.md
Normal file
24
aider/website/docs/llms/deepseek.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 500
|
||||
---
|
||||
|
||||
# DeepSeek
|
||||
|
||||
Aider can connect to the DeepSeek.com API.
|
||||
The DeepSeek Coder V2 model gets the top score on aider's code editing benchmark.
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export DEEPSEEK_API_KEY=<key> # Mac/Linux
|
||||
setx DEEPSEEK_API_KEY <key> # Windows
|
||||
|
||||
# Use DeepSeek Coder V2
|
||||
aider --model deepseek/deepseek-coder
|
||||
```
|
||||
|
||||
See the [model warnings](warnings.html)
|
||||
section for information on warnings which will occur
|
||||
when working with models that aider is not familiar with.
|
||||
|
22
aider/website/docs/llms/editing-format.md
Normal file
22
aider/website/docs/llms/editing-format.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 850
|
||||
---
|
||||
|
||||
# Editing format
|
||||
|
||||
Aider uses different "edit formats" to collect code edits from different LLMs.
|
||||
The "whole" format is the easiest for an LLM to use, but it uses a lot of tokens
|
||||
and may limit how large a file can be edited.
|
||||
Models which can use one of the diff formats are much more efficient,
|
||||
using far fewer tokens.
|
||||
Models that use a diff-like format are able to
|
||||
edit larger files with less cost and without hitting token limits.
|
||||
|
||||
Aider is configured to use the best edit format for the popular OpenAI and Anthropic models
|
||||
and the [other models recommended on the LLM page](https://aider.chat/docs/llms.html).
|
||||
For lesser known models aider will default to using the "whole" editing format
|
||||
since it is the easiest format for an LLM to use.
|
||||
|
||||
If you would like to experiment with the more advanced formats, you can
|
||||
use these switches: `--edit-format diff` or `--edit-format udiff`.
|
25
aider/website/docs/llms/gemini.md
Normal file
25
aider/website/docs/llms/gemini.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 300
|
||||
---
|
||||
|
||||
# Gemini
|
||||
|
||||
Google currently offers
|
||||
[*free* API access to the Gemini 1.5 Pro model](https://ai.google.dev/pricing).
|
||||
This is the most capable free model to use with aider,
|
||||
with code editing capability that's comparable to GPT-3.5.
|
||||
You'll need a [Gemini API key](https://aistudio.google.com/app/u/2/apikey).
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export GEMINI_API_KEY=<key> # Mac/Linux
|
||||
setx GEMINI_API_KEY <key> # Windows
|
||||
|
||||
aider --model gemini/gemini-1.5-pro-latest
|
||||
|
||||
# List models available from Gemini
|
||||
aider --models gemini/
|
||||
```
|
||||
|
27
aider/website/docs/llms/groq.md
Normal file
27
aider/website/docs/llms/groq.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 400
|
||||
---
|
||||
|
||||
# GROQ
|
||||
|
||||
Groq currently offers *free* API access to the models they host.
|
||||
The Llama 3 70B model works
|
||||
well with aider and is comparable to GPT-3.5 in code editing performance.
|
||||
You'll need a [Groq API key](https://console.groq.com/keys).
|
||||
|
||||
To use **Llama3 70B**:
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export GROQ_API_KEY=<key> # Mac/Linux
|
||||
setx GROQ_API_KEY <key> # Windows
|
||||
|
||||
aider --model groq/llama3-70b-8192
|
||||
|
||||
# List models available from Groq
|
||||
aider --models groq/
|
||||
```
|
||||
|
||||
|
43
aider/website/docs/llms/ollama.md
Normal file
43
aider/website/docs/llms/ollama.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 500
|
||||
---
|
||||
|
||||
# Ollama
|
||||
|
||||
Aider can connect to local Ollama models.
|
||||
|
||||
```
|
||||
# Pull the model
|
||||
ollama pull <model>
|
||||
|
||||
# Start your ollama server
|
||||
ollama serve
|
||||
|
||||
# In another terminal window...
|
||||
pip install aider-chat
|
||||
|
||||
export OLLAMA_API_BASE=http://127.0.0.1:11434 # Mac/Linux
|
||||
setx OLLAMA_API_BASE http://127.0.0.1:11434 # Windows
|
||||
|
||||
aider --model ollama/<model>
|
||||
```
|
||||
|
||||
In particular, `llama3:70b` works well with aider:
|
||||
|
||||
|
||||
```
|
||||
ollama pull llama3:70b
|
||||
ollama serve
|
||||
|
||||
# In another terminal window...
|
||||
export OLLAMA_API_BASE=http://127.0.0.1:11434 # Mac/Linux
|
||||
setx OLLAMA_API_BASE http://127.0.0.1:11434 # Windows
|
||||
|
||||
aider --model ollama/llama3:70b
|
||||
```
|
||||
|
||||
See the [model warnings](warnings.html)
|
||||
section for information on warnings which will occur
|
||||
when working with models that aider is not familiar with.
|
||||
|
27
aider/website/docs/llms/openai-compat.md
Normal file
27
aider/website/docs/llms/openai-compat.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 500
|
||||
---
|
||||
|
||||
# OpenAI compatible APIs
|
||||
|
||||
Aider can connect to any LLM which is accessible via an OpenAI compatible API endpoint.
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
# Mac/Linux:
|
||||
export OPENAI_API_BASE=<endpoint>
|
||||
export OPENAI_API_KEY=<key>
|
||||
|
||||
# Windows:
|
||||
setx OPENAI_API_BASE <endpoint>
|
||||
setx OPENAI_API_KEY <key>
|
||||
|
||||
# Prefix the model name with openai/
|
||||
aider --model openai/<model-name>
|
||||
```
|
||||
|
||||
See the [model warnings](warnings.html)
|
||||
section for information on warnings which will occur
|
||||
when working with models that aider is not familiar with.
|
37
aider/website/docs/llms/openai.md
Normal file
37
aider/website/docs/llms/openai.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 100
|
||||
---
|
||||
|
||||
# OpenAI
|
||||
|
||||
To work with OpenAI's models, you need to provide your
|
||||
[OpenAI API key](https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key)
|
||||
either in the `OPENAI_API_KEY` environment variable or
|
||||
via the `--openai-api-key` command line switch.
|
||||
|
||||
Aider has some built in shortcuts for the most popular OpenAI models and
|
||||
has been tested and benchmarked to work well with them:
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export OPENAI_API_KEY=<key> # Mac/Linux
|
||||
setx OPENAI_API_KEY <key> # Windows
|
||||
|
||||
# Aider uses gpt-4o by default (or use --4o)
|
||||
aider
|
||||
|
||||
# GPT-4 Turbo (1106)
|
||||
aider --4-turbo
|
||||
|
||||
# GPT-3.5 Turbo
|
||||
aider --35-turbo
|
||||
|
||||
# List models available from OpenAI
|
||||
aider --models openai/
|
||||
```
|
||||
|
||||
You can use `aider --model <model-name>` to use any other OpenAI model.
|
||||
For example, if you want to use a specific version of GPT-4 Turbo
|
||||
you could do `aider --model gpt-4-0125-preview`.
|
35
aider/website/docs/llms/openrouter.md
Normal file
35
aider/website/docs/llms/openrouter.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 500
|
||||
---
|
||||
|
||||
# OpenRouter
|
||||
|
||||
Aider can connect to [models provided by OpenRouter](https://openrouter.ai/models?o=top-weekly):
|
||||
You'll need an [OpenRouter API key](https://openrouter.ai/keys).
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export OPENROUTER_API_KEY=<key> # Mac/Linux
|
||||
setx OPENROUTER_API_KEY <key> # Windows
|
||||
|
||||
# Or any other open router model
|
||||
aider --model openrouter/<provider>/<model>
|
||||
|
||||
# List models available from OpenRouter
|
||||
aider --models openrouter/
|
||||
```
|
||||
|
||||
In particular, Llama3 70B works well with aider, at low cost:
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
||||
export OPENROUTER_API_KEY=<key> # Mac/Linux
|
||||
setx OPENROUTER_API_KEY <key> # Windows
|
||||
|
||||
aider --model openrouter/meta-llama/llama-3-70b-instruct
|
||||
```
|
||||
|
||||
|
39
aider/website/docs/llms/other.md
Normal file
39
aider/website/docs/llms/other.md
Normal file
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 800
|
||||
---
|
||||
|
||||
# Other LLMs
|
||||
|
||||
Aider uses the [litellm](https://docs.litellm.ai/docs/providers) package
|
||||
to connect to hundreds of other models.
|
||||
You can use `aider --model <model-name>` to use any supported model.
|
||||
|
||||
To explore the list of supported models you can run `aider --models <model-name>`
|
||||
with a partial model name.
|
||||
If the supplied name is not an exact match for a known model, aider will
|
||||
return a list of possible matching models.
|
||||
For example:
|
||||
|
||||
```
|
||||
$ aider --models turbo
|
||||
|
||||
Aider v0.29.3-dev
|
||||
Models which match "turbo":
|
||||
- gpt-4-turbo-preview (openai/gpt-4-turbo-preview)
|
||||
- gpt-4-turbo (openai/gpt-4-turbo)
|
||||
- gpt-4-turbo-2024-04-09 (openai/gpt-4-turbo-2024-04-09)
|
||||
- gpt-3.5-turbo (openai/gpt-3.5-turbo)
|
||||
- ...
|
||||
```
|
||||
|
||||
See the [model warnings](warnings.html)
|
||||
section for information on warnings which will occur
|
||||
when working with models that aider is not familiar with.
|
||||
|
||||
## LiteLLM
|
||||
|
||||
Aider uses the LiteLLM package to connect to LLM providers.
|
||||
The [LiteLLM provider docs](https://docs.litellm.ai/docs/providers)
|
||||
contain more detail on all the supported providers,
|
||||
their models and any required environment variables.
|
10
aider/website/docs/llms/warnings.md
Normal file
10
aider/website/docs/llms/warnings.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
parent: Connecting to LLMs
|
||||
nav_order: 900
|
||||
---
|
||||
|
||||
# Model warnings
|
||||
|
||||
{% include model-warnings.md %}
|
||||
|
||||
|
8
aider/website/docs/more-info.md
Normal file
8
aider/website/docs/more-info.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
has_children: true
|
||||
nav_order: 85
|
||||
---
|
||||
|
||||
# More info
|
||||
|
||||
See below for more info about aider, including some advanced topics.
|
110
aider/website/docs/repomap.md
Normal file
110
aider/website/docs/repomap.md
Normal file
|
@ -0,0 +1,110 @@
|
|||
---
|
||||
parent: More info
|
||||
highlight_image: /assets/robot-ast.png
|
||||
nav_order: 900
|
||||
description: Aider uses a map of your git repository to provide code context to LLMs.
|
||||
---
|
||||
|
||||
# Repository map
|
||||
|
||||

|
||||
|
||||
Aider
|
||||
uses a **concise map of your whole git repository**
|
||||
that includes
|
||||
the most important classes and functions along with their types and call signatures.
|
||||
This helps aider understand the code it's editing
|
||||
and how it relates to the other parts of the codebase.
|
||||
The repo map also helps aider write new code
|
||||
that respects and utilizes existing libraries, modules and abstractions
|
||||
found elsewhere in the codebase.
|
||||
|
||||
## Using a repo map to provide context
|
||||
|
||||
Aider sends a **repo map** to the LLM along with
|
||||
each change request from the user.
|
||||
The repo map contains a list of the files in the
|
||||
repo, along with the key symbols which are defined in each file.
|
||||
It shows how each of these symbols are defined, by including the critical lines of code for each definition.
|
||||
|
||||
Here's a part of
|
||||
the repo map of aider's repo, for
|
||||
[base_coder.py](https://github.com/paul-gauthier/aider/blob/main/aider/coders/base_coder.py)
|
||||
and
|
||||
[commands.py](https://github.com/paul-gauthier/aider/blob/main/aider/commands.py)
|
||||
:
|
||||
|
||||
```
|
||||
aider/coders/base_coder.py:
|
||||
⋮...
|
||||
│class Coder:
|
||||
│ abs_fnames = None
|
||||
⋮...
|
||||
│ @classmethod
|
||||
│ def create(
|
||||
│ self,
|
||||
│ main_model,
|
||||
│ edit_format,
|
||||
│ io,
|
||||
│ skip_model_availabily_check=False,
|
||||
│ **kwargs,
|
||||
⋮...
|
||||
│ def abs_root_path(self, path):
|
||||
⋮...
|
||||
│ def run(self, with_message=None):
|
||||
⋮...
|
||||
|
||||
aider/commands.py:
|
||||
⋮...
|
||||
│class Commands:
|
||||
│ voice = None
|
||||
│
|
||||
⋮...
|
||||
│ def get_commands(self):
|
||||
⋮...
|
||||
│ def get_command_completions(self, cmd_name, partial):
|
||||
⋮...
|
||||
│ def run(self, inp):
|
||||
⋮...
|
||||
```
|
||||
|
||||
Mapping out the repo like this provides some key benefits:
|
||||
|
||||
- The LLM can see classes, methods and function signatures from everywhere in the repo. This alone may give it enough context to solve many tasks. For example, it can probably figure out how to use the API exported from a module just based on the details shown in the map.
|
||||
- If it needs to see more code, the LLM can use the map to figure out which files it needs to look at. The LLM can ask to see these specific files, and aider will offer to add them to the chat context.
|
||||
|
||||
## Optimizing the map
|
||||
|
||||
Of course, for large repositories even just the repo map might be too large
|
||||
for the LLM's context window.
|
||||
Aider solves this problem by sending just the **most relevant**
|
||||
portions of the repo map.
|
||||
It does this by analyzing the full repo map using
|
||||
a graph ranking algorithm, computed on a graph
|
||||
where each source file is a node and edges connect
|
||||
files which have dependencies.
|
||||
Aider optimizes the repo map by
|
||||
selecting the most important parts of the codebase
|
||||
which will
|
||||
fit into the active token budget.
|
||||
|
||||
The token budget is
|
||||
influenced by the `--map-tokens` switch, which defaults to 1k tokens.
|
||||
Aider adjusts the size of the repo map dynamically based on the state of the chat. It will usually stay within that setting's value. But it does expand the repo map
|
||||
significantly at times, especially when no files have been added to the chat and aider needs to understand the entire repo as best as possible.
|
||||
|
||||
|
||||
The sample map shown above doesn't contain *every* class, method and function from those
|
||||
files.
|
||||
It only includes the most important identifiers,
|
||||
the ones which are most often referenced by other portions of the code.
|
||||
These are the key pieces of context that the LLM needs to know to understand
|
||||
the overall codebase.
|
||||
|
||||
|
||||
## More info
|
||||
|
||||
Please check the
|
||||
[repo map article on aider's blog](https://aider.chat/2023/10/22/repomap.html)
|
||||
for more information on aider's repository map
|
||||
and how it is constructed.
|
91
aider/website/docs/scripting.md
Normal file
91
aider/website/docs/scripting.md
Normal file
|
@ -0,0 +1,91 @@
|
|||
---
|
||||
parent: More info
|
||||
nav_order: 900
|
||||
description: You can script aider via the command line or python.
|
||||
---
|
||||
|
||||
# Scripting aider
|
||||
|
||||
You can script aider via the command line or python.
|
||||
|
||||
## Command line
|
||||
|
||||
Aider takes a `--message` argument, where you can give it a natural language instruction.
|
||||
It will do that one thing, apply the edits to the files and then exit.
|
||||
So you could do:
|
||||
|
||||
```bash
|
||||
aider --message "make a script that prints hello" hello.js
|
||||
```
|
||||
|
||||
Or you can write simple shell scripts to apply the same instruction to many files:
|
||||
|
||||
```bash
|
||||
for FILE in *.py ; do
|
||||
aider --message "add descriptive docstrings to all the functions" $FILE
|
||||
done
|
||||
```
|
||||
|
||||
User `aider --help` to see all the command line options, but these are useful for scripting:
|
||||
|
||||
```
|
||||
--stream, --no-stream
|
||||
Enable/disable streaming responses (default: True) [env var:
|
||||
AIDER_STREAM]
|
||||
--message COMMAND, --msg COMMAND, -m COMMAND
|
||||
Specify a single message to send GPT, process reply then exit
|
||||
(disables chat mode) [env var: AIDER_MESSAGE]
|
||||
--message-file MESSAGE_FILE, -f MESSAGE_FILE
|
||||
Specify a file containing the message to send GPT, process reply,
|
||||
then exit (disables chat mode) [env var: AIDER_MESSAGE_FILE]
|
||||
--yes Always say yes to every confirmation [env var: AIDER_YES]
|
||||
--auto-commits, --no-auto-commits
|
||||
Enable/disable auto commit of GPT changes (default: True) [env var:
|
||||
AIDER_AUTO_COMMITS]
|
||||
--dirty-commits, --no-dirty-commits
|
||||
Enable/disable commits when repo is found dirty (default: True) [env
|
||||
var: AIDER_DIRTY_COMMITS]
|
||||
--dry-run, --no-dry-run
|
||||
Perform a dry run without modifying files (default: False) [env var:
|
||||
AIDER_DRY_RUN]
|
||||
--commit Commit all pending changes with a suitable commit message, then exit
|
||||
[env var: AIDER_COMMIT]
|
||||
```
|
||||
|
||||
|
||||
## Python
|
||||
|
||||
You can also script aider from python:
|
||||
|
||||
```python
|
||||
from aider.coders import Coder
|
||||
from aider.models import Model
|
||||
|
||||
# This is a list of files to add to the chat
|
||||
fnames = ["greeting.py"]
|
||||
|
||||
model = Model("gpt-4-turbo")
|
||||
|
||||
# Create a coder object
|
||||
coder = Coder.create(main_model=model, fnames=fnames)
|
||||
|
||||
# This will execute one instruction on those files and then return
|
||||
coder.run("make a script that prints hello world")
|
||||
|
||||
# Send another instruction
|
||||
coder.run("make it say goodbye")
|
||||
```
|
||||
|
||||
See the
|
||||
[Coder.create() and Coder.__init__() methods](https://github.com/paul-gauthier/aider/blob/main/aider/coders/base_coder.py)
|
||||
for all the supported arguments.
|
||||
|
||||
It can also be helpful to set the equivalent of `--yes` by doing this:
|
||||
|
||||
```
|
||||
from aider.io import InputOutput
|
||||
io = InputOutput(yes=True)
|
||||
# ...
|
||||
coder = Coder.create(model=model, fnames=fnames, io=io)
|
||||
```
|
||||
|
26
aider/website/docs/tips.md
Normal file
26
aider/website/docs/tips.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
parent: Usage
|
||||
nav_order: 25
|
||||
description: Tips for AI pair programming with aider.
|
||||
---
|
||||
|
||||
# Tips
|
||||
|
||||
- Think about which files need to be edited to make your change and add them to the chat.
|
||||
Aider can help the LLM figure out which files to edit all by itself, but the most efficient approach is to add the needed files to the chat yourself.
|
||||
- Don't add *everything* to the chat, just the files you think need to be edited.
|
||||
Aider also sends the LLM a [map of your entire git repo](https://aider.chat/docs/repomap.html).
|
||||
So the LLM can see all the other relevant parts of your code base.
|
||||
- Large changes are best performed as a sequence of thoughtful bite sized steps, where you plan out the approach and overall design. Walk the LLM through changes like you might with a junior dev. Ask for a refactor to prepare, then ask for the actual change. Spend the time to ask for code quality/structure improvements.
|
||||
- Use Control-C to safely interrupt the LLM if it isn't providing a useful response. The partial response remains in the conversation, so you can refer to it when you reply to the LLM with more information or direction.
|
||||
- If your code is throwing an error,
|
||||
use the `/run` [in-chat command](/docs/commands.html)
|
||||
to share the error output with the aider.
|
||||
Or just paste the errors into the chat. Let the aider figure out and fix the bug.
|
||||
- If test are failing, use the `/test` [in-chat command](/docs/commands.html)
|
||||
to run tests and
|
||||
share the error output with the aider.
|
||||
- {% include multi-line.md %}
|
||||
- LLMs know about a lot of standard tools and libraries, but may get some of the fine details wrong about API versions and function arguments.
|
||||
You can paste doc snippets into the chat to resolve these issues.
|
||||
|
11
aider/website/docs/troubleshooting.md
Normal file
11
aider/website/docs/troubleshooting.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
nav_order: 60
|
||||
has_children: true
|
||||
description: How to troubleshoot problems with aider and get help.
|
||||
---
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
Below are some approaches for troubleshooting problems with aider.
|
||||
|
||||
{% include help.md %}
|
46
aider/website/docs/troubleshooting/edit-errors.md
Normal file
46
aider/website/docs/troubleshooting/edit-errors.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
---
|
||||
parent: Troubleshooting
|
||||
nav_order: 10
|
||||
---
|
||||
|
||||
# File editing problems
|
||||
|
||||
Sometimes the LLM will reply with some code changes
|
||||
that don't get applied to your local files.
|
||||
In these cases, aider might say something like "Failed to apply edit to *filename*"
|
||||
or other error messages.
|
||||
|
||||
This usually happens because the LLM is disobeying the system prompts
|
||||
and trying to make edits in a format that aider doesn't expect.
|
||||
Aider makes every effort to get the LLM
|
||||
to conform, and works hard to deal with
|
||||
LLMM edits that are "almost" correctly formatted.
|
||||
|
||||
But sometimes the LLM just won't cooperate.
|
||||
In these cases, here are some things you might try.
|
||||
|
||||
## Use a capable model
|
||||
|
||||
If possible try using GPT-4o, Claude 3.5 Sonnet or Claude 3 Opus,
|
||||
as they are the strongest and most capable models.
|
||||
|
||||
Weaker models
|
||||
are more prone to
|
||||
disobeying the system prompt instructions.
|
||||
Most local models are just barely capable of working with aider,
|
||||
so editing errors are probably unavoidable.
|
||||
|
||||
## Reduce distractions
|
||||
|
||||
Many LLM now have very large context windows,
|
||||
but filling them with irrelevant code or conversation
|
||||
can cofuse the model.
|
||||
|
||||
- Don't add too many files to the chat, *just* add the files you think need to be edited.
|
||||
Aider also sends the LLM a [map of your entire git repo](https://aider.chat/docs/repomap.html), so other relevant code will be included automatically.
|
||||
- Use `/drop` to remove files from the chat session which aren't needed for the task at hand. This will reduce distractions and may help GPT produce properly formatted edits.
|
||||
- Use `/clear` to remove the conversation history, again to help GPT focus.
|
||||
|
||||
## More help
|
||||
|
||||
{% include help.md %}
|
8
aider/website/docs/troubleshooting/support.md
Normal file
8
aider/website/docs/troubleshooting/support.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
parent: Troubleshooting
|
||||
nav_order: 30
|
||||
---
|
||||
|
||||
# Getting help
|
||||
|
||||
{% include help.md %}
|
86
aider/website/docs/troubleshooting/token-limits.md
Normal file
86
aider/website/docs/troubleshooting/token-limits.md
Normal file
|
@ -0,0 +1,86 @@
|
|||
---
|
||||
parent: Troubleshooting
|
||||
nav_order: 25
|
||||
---
|
||||
|
||||
# Token limits
|
||||
|
||||
Every LLM has limits on how many tokens it can process for each request:
|
||||
|
||||
- The model's **context window** limits how many total tokens of
|
||||
*input and output* it can process.
|
||||
- Each model has limit on how many **output tokens** it can
|
||||
produce.
|
||||
|
||||
Aider will report an error if a model responds indicating that
|
||||
it has exceeded a token limit.
|
||||
The error will include suggested actions to try and
|
||||
avoid hitting token limits.
|
||||
Here's an example error:
|
||||
|
||||
```
|
||||
Model gpt-3.5-turbo has hit a token limit!
|
||||
|
||||
Input tokens: 768 of 16385
|
||||
Output tokens: 4096 of 4096 -- exceeded output limit!
|
||||
Total tokens: 4864 of 16385
|
||||
|
||||
To reduce output tokens:
|
||||
- Ask for smaller changes in each request.
|
||||
- Break your code into smaller source files.
|
||||
- Try using a stronger model like gpt-4o or opus that can return diffs.
|
||||
|
||||
For more info: https://aider.chat/docs/token-limits.html
|
||||
```
|
||||
|
||||
## Input tokens & context window size
|
||||
|
||||
The most common problem is trying to send too much data to a
|
||||
model,
|
||||
overflowing its context window.
|
||||
Technically you can exhaust the context window if the input is
|
||||
too large or if the input plus output are too large.
|
||||
|
||||
Strong models like GPT-4o and Opus have quite
|
||||
large context windows, so this sort of error is
|
||||
typically only an issue when working with weaker models.
|
||||
|
||||
The easiest solution is to try and reduce the input tokens
|
||||
by removing files from the chat.
|
||||
It's best to only add the files that aider will need to *edit*
|
||||
to complete your request.
|
||||
|
||||
- Use `/tokens` to see token usage.
|
||||
- Use `/drop` to remove unneeded files from the chat session.
|
||||
- Use `/clear` to clear the chat history.
|
||||
- Break your code into smaller source files.
|
||||
|
||||
## Output token limits
|
||||
|
||||
Most models have quite small output limits, often as low
|
||||
as 4k tokens.
|
||||
If you ask aider to make a large change that affects a lot
|
||||
of code, the LLM may hit output token limits
|
||||
as it tries to send back all the changes.
|
||||
|
||||
To avoid hitting output token limits:
|
||||
|
||||
- Ask for smaller changes in each request.
|
||||
- Break your code into smaller source files.
|
||||
- Use a strong model like gpt-4o, sonnet or opus that can return diffs.
|
||||
|
||||
|
||||
## Other causes
|
||||
|
||||
Sometimes token limit errors are caused by
|
||||
non-compliant API proxy servers
|
||||
or bugs in the API server you are using to host a local model.
|
||||
Aider has been well tested when directly connecting to
|
||||
major
|
||||
[LLM provider cloud APIs](https://aider.chat/docs/llms.html).
|
||||
For serving local models,
|
||||
[Ollama](https://aider.chat/docs/llms/ollama.html) is known to work well with aider.
|
||||
|
||||
Try using aider without an API proxy server
|
||||
or directly with one of the recommended cloud APIs
|
||||
and see if your token limit problems resolve.
|
12
aider/website/docs/troubleshooting/warnings.md
Normal file
12
aider/website/docs/troubleshooting/warnings.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
parent: Troubleshooting
|
||||
nav_order: 20
|
||||
---
|
||||
|
||||
# Model warnings
|
||||
|
||||
{% include model-warnings.md %}
|
||||
|
||||
## More help
|
||||
|
||||
{% include help.md %}
|
17
aider/website/docs/tutorials.md
Normal file
17
aider/website/docs/tutorials.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
parent: Usage
|
||||
nav_order: 75
|
||||
description: Intro and tutorial videos made by aider users.
|
||||
---
|
||||
|
||||
# Tutorial videos
|
||||
|
||||
Here are a few tutorial videos made by aider users:
|
||||
|
||||
- [Aider tips and Example use](https://www.youtube.com/watch?v=OsChkvGGDgw) -- techfren
|
||||
- [Generate application with just one prompt using Aider](https://www.youtube.com/watch?v=Y-_0VkMUiPc&t=78s) -- AICodeKing
|
||||
- [Aider : the production ready AI coding assistant you've been waiting for](https://www.youtube.com/watch?v=zddJofosJuM) -- Learn Code With JV
|
||||
- [Holy Grail: FREE Coding Assistant That Can Build From EXISTING CODE BASE](https://www.youtube.com/watch?v=df8afeb1FY8) -- Matthew Berman
|
||||
- [Aider: This AI Coder Can Create AND Update Git Codebases](https://www.youtube.com/watch?v=EqLyFT78Sig) -- Ian Wootten
|
||||
|
||||
|
386
aider/website/docs/unified-diffs.md
Normal file
386
aider/website/docs/unified-diffs.md
Normal file
|
@ -0,0 +1,386 @@
|
|||
---
|
||||
title: Unified diffs make GPT-4 Turbo 3X less lazy
|
||||
excerpt: GPT-4 Turbo has a problem with lazy coding, which can be signiciantly improved by asking for code changes formatted as unified diffs.
|
||||
highlight_image: /assets/benchmarks-udiff.jpg
|
||||
nav_exclude: true
|
||||
---
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}, by Paul Gauthier
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
# Unified diffs make GPT-4 Turbo 3X less lazy
|
||||
|
||||

|
||||
|
||||
Aider now asks GPT-4 Turbo to use
|
||||
[unified diffs](#choose-a-familiar-editing-format)
|
||||
to edit your code.
|
||||
This dramatically improves GPT-4 Turbo's performance on a
|
||||
challenging
|
||||
new benchmark
|
||||
and significantly reduces its bad habit of "lazy" coding,
|
||||
where it writes
|
||||
code with comments
|
||||
like "...add logic here...".
|
||||
|
||||
Aider's new "laziness" benchmark suite
|
||||
is designed to both provoke and quantify lazy coding.
|
||||
It consists of
|
||||
89 python refactoring tasks
|
||||
which tend to make GPT-4 Turbo write lazy comments like
|
||||
"...include original method body...".
|
||||
|
||||
This new laziness benchmark produced the following results with `gpt-4-1106-preview`:
|
||||
|
||||
- **GPT-4 Turbo only scored 20% as a baseline** using aider's existing "SEARCH/REPLACE block" edit format. It outputs "lazy comments" on 12 of the tasks.
|
||||
- **Aider's new unified diff edit format raised the score to 61%**. Using this format reduced laziness by 3X, with GPT-4 Turbo only using lazy comments on 4 of the tasks.
|
||||
- **It's worse to add a prompt that says the user is blind, has no hands, will tip $2000 and fears truncated code trauma.** Widely circulated "emotional appeal" folk remedies
|
||||
produced worse benchmark scores
|
||||
for both the baseline SEARCH/REPLACE and new unified diff editing formats.
|
||||
|
||||
The older `gpt-4-0613` also did better on the laziness benchmark using unified diffs:
|
||||
|
||||
- **The June GPT-4's baseline was 26%** using aider's existing "SEARCH/REPLACE block" edit format.
|
||||
- **Aider's new unified diff edit format raised June GPT-4's score to 59%**.
|
||||
- The benchmark was designed to use large files, and
|
||||
28% of them are too large to fit in June GPT-4's 8k context window.
|
||||
This puts a hard ceiling of 72% on how well the June model could possibly score.
|
||||
|
||||
With unified diffs, GPT acts more like it's writing textual data intended to be read by a program,
|
||||
not talking to a person.
|
||||
Diffs are
|
||||
usually
|
||||
consumed by the
|
||||
[patch](https://www.gnu.org/software/diffutils/manual/html_node/Merging-with-patch.html)
|
||||
program, which is fairly rigid.
|
||||
This seems to encourage rigor, making
|
||||
GPT less likely to
|
||||
leave informal editing instructions in comments
|
||||
or be lazy about writing all the needed code.
|
||||
|
||||
Aider's new unified diff editing format
|
||||
outperforms other solutions I evaluated by a wide margin.
|
||||
I explored many other approaches including:
|
||||
prompts about being tireless and diligent,
|
||||
OpenAI's function/tool calling capabilities,
|
||||
numerous variations on aider's existing editing formats,
|
||||
line number based formats
|
||||
and other diff-like formats.
|
||||
The results shared here reflect
|
||||
an extensive investigation and benchmark evaluations of many approaches.
|
||||
|
||||
The rest of this article will describe
|
||||
aider's new editing format and refactoring benchmark.
|
||||
It will highlight some key design decisions,
|
||||
and evaluate their significance using ablation experiments.
|
||||
|
||||
|
||||
## Unified diff editing format
|
||||
|
||||
The design and implementation of aider's new unified diff editing format
|
||||
helped clarify some general principles
|
||||
for GPT-4 code editing:
|
||||
|
||||
- FAMILIAR - Choose an edit format that GPT is already familiar with.
|
||||
- SIMPLE - Choose a simple format that avoids escaping, syntactic overhead and brittle specifiers like line numbers or line counts.
|
||||
- HIGH LEVEL - Encourage GPT to structure edits as new versions of substantive code blocks (functions, methods, etc), not as a series of surgical/minimal changes to individual lines of code.
|
||||
- FLEXIBLE - Strive to be maximally flexible when interpreting GPT's edit instructions.
|
||||
|
||||
A helpful shortcut here is to have empathy for GPT, and imagine you
|
||||
are the one being asked to specify code edits.
|
||||
Would you want to hand type a properly escaped json data structure
|
||||
to invoke surgical insert, delete, replace operations on specific code line numbers?
|
||||
Do you want to use a brittle format, where any mistake
|
||||
causes an error that discards all your work?
|
||||
|
||||
GPT is quantitatively better at code editing when you reduce the
|
||||
burden of formatting edits by using a familiar, simple, high level
|
||||
and flexible editing format.
|
||||
|
||||
### Choose a familiar editing format
|
||||
|
||||
Unified diffs are perhaps the most common way to show
|
||||
code edits, because it's the
|
||||
default output format of `git diff`:
|
||||
|
||||
```diff
|
||||
--- a/greeting.py
|
||||
+++ b/greeting.py
|
||||
@@ -1,5 +1,5 @@
|
||||
def main(args):
|
||||
# show a greeting
|
||||
- print("Hello!")
|
||||
+ print("Goodbye!")
|
||||
return
|
||||
```
|
||||
|
||||
Choosing such a popular format means that GPT has
|
||||
seen *many* examples in its training data.
|
||||
It's been trained to generate
|
||||
text that conforms to the unified diff syntax.
|
||||
|
||||
### Use a simple editing format
|
||||
|
||||
Aider's [previous benchmark results](https://aider.chat/docs/benchmarks.html) made
|
||||
it clear that simple editing formats
|
||||
work best.
|
||||
Even though OpenAI provides extensive support for
|
||||
structured formats like json and function calls,
|
||||
GPT is worse at editing code if you use them.
|
||||
I repeated these and other similar benchmarks against GPT-4 Turbo,
|
||||
and again reached these same conclusions.
|
||||
|
||||
Informally, this is probably because stuffing *source code* into JSON is complicated
|
||||
and error prone.
|
||||
Wrapping the python code
|
||||
`print("On Windows use \"C:\\\"")`
|
||||
as valid json is pretty painful and error prone.
|
||||
Due to escaping issues GPT's code is often syntactically incorrect when it's
|
||||
unpacked from JSON,
|
||||
or the JSON decode just fails entirely.
|
||||
|
||||
On the other hand, the core of the unified diff format is very simple.
|
||||
You include a hunk of the file that needs to be changed,
|
||||
with every line prefixed by a character
|
||||
to indicate unchanged, new or deleted lines.
|
||||
A unified diff looks pretty much like the code it is modifying.
|
||||
|
||||
The one complicated piece is the line numbers found at the start
|
||||
of each hunk. They look something like this: `@@ -2,4 +3,5 @@`.
|
||||
GPT is terrible at working with source code line numbers.
|
||||
This is a general observation about *any* use of line
|
||||
numbers in editing formats,
|
||||
backed up by many quantitative benchmark experiments.
|
||||
|
||||
You've probably ignored the line numbers in every diff you've seen,
|
||||
because the diffs usually still make sense without them.
|
||||
Aider tells GPT not to include line numbers,
|
||||
and just interprets each hunk from the unified diffs
|
||||
as a search and replace operation:
|
||||
|
||||
This diff:
|
||||
|
||||
```diff
|
||||
@@ ... @@
|
||||
def main(args):
|
||||
# show a greeting
|
||||
- print("Hello!")
|
||||
+ print("Goodbye!")
|
||||
return
|
||||
```
|
||||
|
||||
Means we need to search the file for the
|
||||
*space* and *minus* `-` lines:
|
||||
|
||||
```python
|
||||
def main(args):
|
||||
# show a greeting
|
||||
print("Hello!")
|
||||
return
|
||||
```
|
||||
|
||||
And replace them with the *space* and *plus* `+` lines:
|
||||
|
||||
```python
|
||||
def main(args):
|
||||
# show a greeting
|
||||
print("Goodbye!")
|
||||
return
|
||||
```
|
||||
|
||||
Simple, right?
|
||||
|
||||
### Encourage high level edits
|
||||
|
||||
The example unified diffs we've seen so far have all been single line changes,
|
||||
which makes them pretty easy to read and understand.
|
||||
Consider this slightly more complex change, which renames the variable `n` to
|
||||
`number`:
|
||||
|
||||
```diff
|
||||
@@ ... @@
|
||||
-def factorial(n):
|
||||
+def factorial(number):
|
||||
- if n == 0:
|
||||
+ if number == 0:
|
||||
return 1
|
||||
else:
|
||||
- return n * factorial(n-1)
|
||||
+ return number * factorial(number-1)
|
||||
```
|
||||
|
||||
The following "high level diff" of the same
|
||||
change is not as succinct as the minimal diff above,
|
||||
but it is much easier to see two different coherent versions of the
|
||||
`factorial()` function.
|
||||
|
||||
```diff
|
||||
@@ ... @@
|
||||
-def factorial(n):
|
||||
- if n == 0:
|
||||
- return 1
|
||||
- else:
|
||||
- return n * factorial(n-1)
|
||||
+def factorial(number):
|
||||
+ if number == 0:
|
||||
+ return 1
|
||||
+ else:
|
||||
+ return number * factorial(number-1)
|
||||
```
|
||||
|
||||
Aider's system prompt encourages
|
||||
GPT to produce these high level diffs.
|
||||
This makes GPT better at producing correct diffs, which can be successfully
|
||||
applied to the original file.
|
||||
|
||||
**Experiments without "high level diff" prompting
|
||||
produce a 30-50% increase in editing errors,**
|
||||
where diffs fail to apply or apply incorrectly and
|
||||
produce invalid code.
|
||||
When a patch fails, aider needs to ask GPT for a corrected version of the diff.
|
||||
This takes time, costs tokens and sometimes fails to produce a successful edit
|
||||
even after multiple retries.
|
||||
|
||||
There are probably a couple of reasons why high level diffs
|
||||
help:
|
||||
|
||||
- It's easier to produce diffs that both correctly match the original code and correctly produce the intended new code. There is less risk of GPT getting confused, compared to generating a series of surgical edits that interleave lines of old and new code.
|
||||
- High level hunks often contain more lines than a surgical hunk, so they are less likely to accidentally match unrelated parts of the code. This is helpful because GPT can't reliably give us line numbers to specify exactly where in the file to make changes.
|
||||
|
||||
### Be flexible when applying edits
|
||||
|
||||
GPT frequently makes imperfect diffs that won't apply cleanly.
|
||||
They exhibit a variety of problems:
|
||||
|
||||
- GPT forgets things like comments, docstrings, blank lines, etc. Or it skips over some code that it doesn't intend to change.
|
||||
- GPT forgets the leading *plus* `+` character to mark novel lines that it wants to add to the file. It incorrectly includes them with a leading *space* as if they were already there.
|
||||
- GPT outdents all of the code, removing all the leading white space which is shared across the lines. So a chunk of deeply indented code is shown in a diff with only the leading white space that changes between the lines in the chunk.
|
||||
- GPT jumps ahead to show edits to a different part of the file without starting a new hunk with a `@@ ... @@` divider.
|
||||
|
||||
As an example of the first issue, consider this source code:
|
||||
|
||||
```python
|
||||
import sys
|
||||
|
||||
def main(args):
|
||||
# show a greeting
|
||||
print("Hello!")
|
||||
return
|
||||
|
||||
main(sys.argv[1:])
|
||||
```
|
||||
|
||||
**The diff below is missing the "show a greeting" comment line**,
|
||||
and represents a common type of mistake GPT might make.
|
||||
When we search for the *minus* `-` lines, we won't find them
|
||||
in the original file
|
||||
because of the missing comment.
|
||||
|
||||
|
||||
```diff
|
||||
@@ ... @@
|
||||
-def main(args):
|
||||
- print("Hello!")
|
||||
- return
|
||||
+def main(args):
|
||||
+ print("Goodbye!")
|
||||
+ return
|
||||
```
|
||||
|
||||
|
||||
Aider tries to be very flexible when applying diffs,
|
||||
in order to handle defects.
|
||||
If a hunk doesn't apply cleanly, aider uses a number of strategies:
|
||||
|
||||
- Normalize the hunk, by taking the *minus* `-` and *space* lines as one version of the hunk and the *space* and *plus* `+` lines as a second version and doing an actual unified diff on them.
|
||||
- Try and discover new lines that GPT is trying to add but which it forgot to mark with *plus* `+` markers. This is done by diffing the *minus* `-` and *space* lines back against the original file.
|
||||
- Try and apply the hunk using "relative leading white space", so we can match and patch correctly even if the hunk has been uniformly indented or outdented.
|
||||
- Break a large hunk apart into an overlapping sequence of smaller hunks, which each contain only one contiguous run of *plus* `+` and *minus* `-` lines. Try and apply each of these sub-hunks independently.
|
||||
- Vary the size and offset of the "context window" of *space* lines from the hunk that are used to localize the edit to a specific part of the file.
|
||||
- Combine the above mechanisms to progressively become more permissive about how to apply the hunk.
|
||||
|
||||
These flexible patching strategies are critical, and
|
||||
removing them
|
||||
radically increases the number of hunks which fail to apply.
|
||||
**Experiments where flexible patching is disabled show a 9X increase in editing errors** on aider's original Exercism benchmark.
|
||||
|
||||
## Refactoring benchmark
|
||||
|
||||
Aider has long used a
|
||||
[benchmark suite based on 133 Exercism python exercises](https://aider.chat/2023/07/02/benchmarks.html).
|
||||
But these are mostly small coding problems,
|
||||
usually requiring only a few dozen lines of code.
|
||||
GPT-4 Turbo is typically only lazy on 2-3 of these exercises:
|
||||
the ones with the most code and which involve refactoring.
|
||||
|
||||
Based on this observation, I set out to build a benchmark based on refactoring
|
||||
a non-trivial amount of code found in fairly large files.
|
||||
To do this, I used python's `ast` module to analyze
|
||||
[9 popular open source python repositories](https://github.com/paul-gauthier/refactor-benchmark)
|
||||
to identify challenging refactoring tasks.
|
||||
The goal was to find:
|
||||
|
||||
- Source files that contain classes with non-trivial methods, having 100-250+ AST nodes in their implementation.
|
||||
- Focus on methods that are part of a larger class, which has at least twice as much code as the method itself.
|
||||
- Select methods that don't use their `self` parameter, so they can be trivially refactored out of the class.
|
||||
|
||||
We can then turn each of these source files into a task for the benchmark,
|
||||
where we ask GPT to do something like:
|
||||
|
||||
> Refactor the `_set_csrf_cookie` method in the `CsrfViewMiddleware` class to be a stand alone, top level function.
|
||||
> Name the new function `_set_csrf_cookie`, exactly the same name as the existing method.
|
||||
> Update any existing `self._set_csrf_cookie` calls to work with the new `_set_csrf_cookie` function.
|
||||
|
||||
A [simple python AST scanning script](https://github.com/paul-gauthier/aider/blob/main/benchmark/refactor_tools.py)
|
||||
found 89 suitable files
|
||||
and packaged them up as benchmark tasks.
|
||||
Each task has a test
|
||||
that checks if the refactor
|
||||
was performed roughly correctly:
|
||||
|
||||
- The updated source file must parse as valid python, to detect misapplied edits which produce invalid code.
|
||||
- The target method must now exist as a top-level function in the file.
|
||||
- This new top-level function must contain approximately the same number of AST nodes as the original class method. This ensures that GPT didn't elide code and replace it with comments.
|
||||
- The original class must still be present in the file, and it must be smaller by about the number of AST nodes in the method which was removed. This helps confirm that the method was removed from the class, without other significant modifications.
|
||||
|
||||
To be clear, this is not a rigorous test that the refactor was performed correctly.
|
||||
But it does serve as a basic sanity check that the refactor was essentially done as a cut & paste, without eliding any code as comments.
|
||||
And it correlates well with other laziness metrics
|
||||
gathered during benchmarking like the
|
||||
introduction of new comments that contain "...".
|
||||
|
||||
The result is a pragmatic
|
||||
[benchmark suite that provokes, detects and quantifies GPT coding laziness](https://github.com/paul-gauthier/refactor-benchmark).
|
||||
|
||||
|
||||
|
||||
## Conclusions and future work
|
||||
|
||||
Based on the refactor benchmark results,
|
||||
aider's new unified diff format seems
|
||||
to dramatically increase GPT-4 Turbo's skill at more complex coding tasks.
|
||||
It also seems very effective at reducing the lazy coding
|
||||
which has been widely noted as a problem with GPT-4 Turbo.
|
||||
|
||||
Unified diffs was one of the very first edit formats I tried
|
||||
when originally building aider.
|
||||
I think a lot of other AI coding assistant projects have also
|
||||
tried going down this path.
|
||||
It seems like any naive or direct use of structured diff formats
|
||||
is pretty much doomed to failure.
|
||||
But the techniques described here and
|
||||
incorporated into aider provide
|
||||
a highly effective way to harness GPT's knowledge of unified diffs.
|
||||
|
||||
There could be significant benefits to
|
||||
fine tuning models on
|
||||
aider's simple, high level style of unified diffs.
|
||||
Dropping line numbers from the hunk headers and focusing on diffs of
|
||||
semantically coherent chunks of code
|
||||
seems to be an important part of successful GPT code editing
|
||||
(besides the relentless focus on flexibly applying edits).
|
||||
Most LLMs will have already seen plenty of unified diffs
|
||||
in their normal training data, and so should be
|
||||
amenable to fining tuning towards this
|
||||
particular diff style.
|
80
aider/website/docs/usage.md
Normal file
80
aider/website/docs/usage.md
Normal file
|
@ -0,0 +1,80 @@
|
|||
---
|
||||
nav_order: 30
|
||||
has_children: true
|
||||
description: How to use aider to pair program with AI and edit code in your local git repo.
|
||||
---
|
||||
|
||||
# Usage
|
||||
|
||||
Run `aider` with the source code files you want to edit.
|
||||
These files will be "added to the chat session", so that
|
||||
aider can see their
|
||||
contents and edit them for you.
|
||||
They can be existing files or the name of files you want
|
||||
aider to create for you.
|
||||
|
||||
```
|
||||
aider <file1> <file2> ...
|
||||
```
|
||||
|
||||
At the aider `>` prompt, ask for code changes and aider
|
||||
will edit those files to accomplish your request.
|
||||
|
||||
|
||||
```
|
||||
$ aider factorial.py
|
||||
|
||||
Aider v0.37.1-dev
|
||||
Models: gpt-4o with diff edit format, weak model gpt-3.5-turbo
|
||||
Git repo: .git with 258 files
|
||||
Repo-map: using 1024 tokens
|
||||
Use /help to see in-chat commands, run with --help to see cmd line args
|
||||
───────────────────────────────────────────────────────────────────────
|
||||
>`Make a program that asks for a number and prints its factorial
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
## Adding files
|
||||
|
||||
Add the files that the aider will need to *edit*.
|
||||
|
||||
Don't add a bunch of extra files.
|
||||
If you add too many files, the LLM can get overwhelmed
|
||||
and confused (and it costs more tokens).
|
||||
Aider will automatically
|
||||
pull in content from related files so that it can
|
||||
[understand the rest of your code base](https://aider.chat/docs/repomap.html).
|
||||
|
||||
You add files to the chat by naming them on the aider command line.
|
||||
Or, you can use the in-chat
|
||||
`/add` command to add files.
|
||||
|
||||
You can use aider without adding any files,
|
||||
and it will try to figure out which files need to be edited based
|
||||
on your requests.
|
||||
But you'll get the best results if you add the files that need
|
||||
to edited.
|
||||
|
||||
## LLMs
|
||||
|
||||
Aider uses GPT-4o by default, but you can
|
||||
[connect to many different LLMs](/docs/llms.html).
|
||||
Claude 3.5 Sonnet also works very well with aider,
|
||||
which you can use by running `aider --sonnet`.
|
||||
|
||||
You can run `aider --model XXX` to launch aider with
|
||||
a specific model.
|
||||
Or, during your chat you can switch models with the in-chat
|
||||
`/model` command.
|
||||
|
||||
## Making changes
|
||||
|
||||
Ask aider to make changes to your code.
|
||||
It will show you some diffs of the changes it is making to
|
||||
complete you request.
|
||||
[Aider will git commit all of its changes](/docs/git.html),
|
||||
so they are easy to track and undo.
|
||||
|
||||
You can always use the `/undo` command to undo AI changes that you don't
|
||||
like.
|
121
aider/website/docs/voice.md
Normal file
121
aider/website/docs/voice.md
Normal file
|
@ -0,0 +1,121 @@
|
|||
---
|
||||
parent: Usage
|
||||
nav_order: 100
|
||||
description: Speak with aider about your code!
|
||||
---
|
||||
|
||||
# Voice-to-code with aider
|
||||
|
||||
Speak with aider about your code! Request new features, test cases or bug fixes using your voice and let aider do the work of editing the files in your local git repo. As with all of aider's capabilities, you can use voice-to-code with an existing repo or to start a new project.
|
||||
|
||||
Voice support fits quite naturally into aider's AI pair programming
|
||||
chat interface. Now you can fluidly switch between voice and text chat
|
||||
when you ask aider to edit your code.
|
||||
|
||||
## How to use voice-to-code
|
||||
|
||||
Use the in-chat `/voice` command to start recording,
|
||||
and press `ENTER` when you're done speaking.
|
||||
Your voice coding instructions will be transcribed,
|
||||
as if you had typed them into
|
||||
the aider chat session.
|
||||
|
||||
See the [installation instructions](https://aider.chat/docs/install/optional.html#enable-voice-coding) for
|
||||
information on how to enable the `/voice` command.
|
||||
|
||||
<br/>
|
||||
<div class="chat-transcript" markdown="1">
|
||||
|
||||
> Aider v0.11.2-dev
|
||||
> Added app.py to the chat.
|
||||
|
||||
#### /voice
|
||||
|
||||
<blockquote>
|
||||
<div class="recording-line">
|
||||
<p style="display: inline;">Recording, press ENTER when done... <span id="timer">3.5</span>sec</p>
|
||||
<div id="progress-bar">
|
||||
<div id="progress"></div>
|
||||
</div>
|
||||
</div>
|
||||
</blockquote>
|
||||
|
||||
<style>
|
||||
.recording-line > * {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
#progress-bar {
|
||||
width: 100px;
|
||||
height: 20px;
|
||||
background-color: #333;
|
||||
margin-left: 10px;
|
||||
}
|
||||
#progress {
|
||||
height: 100%;
|
||||
background-color: #f0f0f0;
|
||||
animation: progress 3s infinite;
|
||||
}
|
||||
@keyframes progress {
|
||||
0% { width: 10%; }
|
||||
20% { width: 90%; }
|
||||
50% { width: 30%; }
|
||||
60% { width: 90%; }
|
||||
80% { width: 20%; }
|
||||
100% { width: 10%; }
|
||||
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
window.onload = function() {
|
||||
var counter = 0;
|
||||
var timer = document.getElementById('timer');
|
||||
setInterval(function() {
|
||||
counter = (counter + 0.1) % 9;
|
||||
timer.textContent = counter.toFixed(1);
|
||||
}, 100);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div style="display: inline-block; position: relative; width: 200px; background-color: #f0f0f0; border-radius: 10px; padding: 10px; color: #333; font-family: 'Comic Sans MS', 'Comic Sans', 'Marker Felt', sans-serif;">
|
||||
<span style="position: absolute; top: 0; left: 50%; transform: translate(-50%, -100%); width: 0; height: 0; border-left: 10px solid transparent; border-right: 10px solid transparent; border-bottom: 10px solid #f0f0f0;"></span>
|
||||
“ add a factorial endpoint that uses math factorial ”
|
||||
</div>
|
||||
|
||||
#### Add a factorial endpoint that uses math.factorial.
|
||||
|
||||
To add a factorial endpoint to the Flask application, we need to modify the `app.py` file.
|
||||
|
||||
Here are the steps:
|
||||
|
||||
1. Add a new route `/fact/<int:x>` to the Flask application.
|
||||
2. In the function for this route, call `math.factorial(x)` and return the result as a string.
|
||||
|
||||
Here is the *edit block* for these changes:
|
||||
|
||||
```python
|
||||
app.py
|
||||
<<<<<<< HEAD
|
||||
if __name__ == '__main__':
|
||||
print("Starting...")
|
||||
app.run()
|
||||
=======
|
||||
@app.route('/fact/<int:x>')
|
||||
def factorial(x):
|
||||
result = math.factorial(x)
|
||||
return str(result)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Starting...")
|
||||
app.run()
|
||||
>>>>>>> updated
|
||||
```
|
||||
|
||||
> Applied edit to app.py
|
||||
> Commit ef9e3e7 aider: Add a factorial endpoint that uses math.factorial.
|
||||
|
||||
</div>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
Loading…
Add table
Add a link
Reference in a new issue