From db30e5da2b67404a58993469beadcff891b4a0bb Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:03:11 -0700 Subject: [PATCH 01/53] Added draft post --- _posts/2024-05-22-swe-bench-lite.md | 364 ++++++++++++++++++++++++++++ 1 file changed, 364 insertions(+) create mode 100644 _posts/2024-05-22-swe-bench-lite.md diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md new file mode 100644 index 000000000..4021415f4 --- /dev/null +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -0,0 +1,364 @@ +--- +title: Aider scores SOTA 26.3% on SWE Bench Lite +excerpt: Aider scored 26.3% on SWE Bench Lite, achieving a state of the art result. +draft: true +--- + +# Aider scores SOTA 26.3% on SWE Bench Lite + +[Aider scored 26.3%]() +on the +[SWE Bench Lite benchmark](https://www.swebench.com), achieving a state of the art result. +The current top leaderboard entry is 20.33% +from Amazon Q Developer Agent. +The best result reported elsewhere online seems to be +[22.3% from AutoCodeRover](https://github.com/nus-apr/auto-code-rover). + +Aider achieved this result mainly through its focus on static code analysis, +reliable LLM code editing +and pragmatic workflows for interactive pair programming with AI. +Aider intentionally has quite limited and narrow "agentic behavior": +it doesn't require a highly detailed upfront "spec" from the user, +use RAG or vector search, farm out sub-problems to an army of LLMs, +allow the LLM to use tools +or perform web searches, +etc. + +Aider is first and foremost a tool for engineers to get real work done in +real code bases through a pair programming chat style interface. +In normal use, the user is in full interactive control. +This lets them quickly steer misunderstandings back on course and +avoid wasted time, code reviews and token costs. +When a user asks aider for a change, they see the edits performed in real-time. +Aider may also then offer additional +help like fixing lint or test errors. + +For the benchmark, +aider was launched in each problem's git repository +with the problem statement +submitted as the opening chat message from "the user". +After that aider runs as normal, with the following modifications: + +- Aider's suggestions were always accepted. +When chatting, aider will suggest which files in the repo may need to be edited based on +the conversation. +It will offer to lint code that has been edited, +and to fix any issues uncovered. +Aider has workflows to run the repo's test suite and resolve failing tests. +Normally the user is asked to approved such suggestions, but +they were always accepted during the benchmark. +- A simple harness was used to retry the SWE Bench problem if aider produced code which wasn't *plausibly correct*. +Plausible means that aider successfully edited the repo without breaking anything. +As mentioned, aider has integrated support for linting and testing, +so the harness just looks at aider's completion status to see if those +operations finished clean. +Note that *aider only had access to the pre-existing tests in the repo*, +not the held out "acceptance tests" that are used later to see if the +SWE Bench problem was correctly resolved. +- If the solution isn't plausible, the harness launches aider to try again from scratch. +The harness alternates between running aider with GPT-4o and Opus up to three times each, +until it finds a plausible solution. +- If no plausible solution is found, the harness picks the solution +with the least amount of edit/lint/test problems. + +This is all roughly equivalent to a user: + +- Launching aider in their repo with the something like command below, which +tells aider to say yes to every suggestion and use pytest to run tests. + - `aider --yes --test-cmd pytest` +- Pasting the text of a GitHub issue into the chat, or adding it via URL with a command in the chat like: + - `/web https://github.com/django/django/issues/XXX` +- If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again. Maybe with a different LLM this time. +[Aider is tightly integrated with git](https://aider.chat/docs/faq.html#how-does-aider-use-git), +so it's always easy to undo/revert AI changes that don't pan out. + +Of course, outside a benchmark setting it's probably +unwise to let *any* AI agent run unsupervised on your code base. +Aider is intended to be used as an interactive pair-programming chat, +where the user participates to direct aider's work and approve suggestions. +This way the user can offer immediate feedback or corrections if their initial +instructions turn out to be ambiguous, +or if the AI starts going down a wrong path. + +## Aider with GPT-4o alone was SOTA + +Running the entire SWE Bench Lite benchmark using aider with just GPT-4o +achieved a score of 25%. +This was itself a state of the art result, before being surpassed by the main +result being reported here +that uses aider with both GPT-4o & Opus. + +## GPT-4o vs Opus + +The benchmark harness alternated between running aider with GPT-4o and Opus. +The harness proceeded in a fixed order, always starting with GPT-4o and +then alternating with Opus until a plausible solution was found. + +The table below breaks down the 79 solutions which were ultimately +verified as correctly resolving their task. +Some noteworthy observations: + +- Aider with GPT-4o immediately found 77% of the valid solutions on the first attempt. +- ~90% of valid solutions were found after one attempt from aider with GPT-4o and Opus. +- A long tail of solutions continued to be found by both models including on the final, 6th attempt. + + +| Attempt | Model | Number
resolved | Percent
of resolved | Cumulative
percent of
resolved | +|:--------:|------------|---------:|---------:|----:| +| 1 | GPT-4o | 61 | 77.2 | 77.2 +| 2 | Opus | 10 | 12.7 | 89.9 +| 3 | GPT-4o | 3 | 3.8 | 93.7 +| 4 | Opus | 2 | 2.5 | 96.2 +| 5 | GPT-4o | 2 | 2.5 | 98.7 +| 6 | Opus | 1 | 1.3 | 100.0 +|**Total**| | **79** | **100%** | **100%** | + +If we just look at which models produced correct solutions, +we can see that GPT-4o dominates. +This isn't a fair comparison, because GPT-4o always took the first +attempt at solving. +But anecdotal evidence from early runs of the benchmark +supports the observation that GPT-4o is significantly stronger than Opus +for this endeavor. + +| Model | Number resolved | Percent of resolved | +|------------|---------:|---------:| +| GPT-4o | 66 | 83.5 | +| Opus | 13 | 16.5 | +|**Total**| **79** | **100%** | + + +## Repository map, not RAG + +The crucial first step in solving a SWE Bench problem is figuring out +which parts of the repo are relevant and which files need to be edited. +Most coding agents use some combination of RAG, vector search +and arming the LLM with +tools to interactively explore the code base. + +Aider instead uses a +[repository map](https://aider.chat/2023/10/22/repomap.html) +to help the LLM understand the +layout, code structure and content of a git repo. +The repo map is created from the code's AST and call graph +to provide a compact and powerful summary of the entire code base. +The map is constantly +tailored to show +repo context that is relevant to the current state of the chat conversation. + +by performing a graph optimization on the code's call graph. + +When the user asks for a change to their code, the LLM uses the repo map +to decide which files to edit. +The LLM simply returns a normal text response explaining which files +it needs to edit and why. +Aider notices when the LLM mentions filenames from the repo, +and asks the user if they should be added to the chat. +Adding a file to the chat allows the LLM to see the full contents +of the file and edit it. + +
+ +#### Please add a new /factorial/N endpoint. + +To add a new /factorial/N endpoint, the most likely file that needs to be edited is app.py. +Please add app.py to the chat so I can proceed with the changes. + +> app.py +> Add these files to the chat? yes + +
+ +This is a convenient and natural workflow for interactive chat, +and it worked well for the SWE Bench tasks. +Each task comes with a “gold” patch, which was created by a human developer +to solve the issue. +Aider successfully identified and added the file from the gold patch +in 70.3% of the benchmark tasks. + +Of course aider is not able to see or use the gold patch +or the files it names in any way. +They were only used to compute this statistic after the benchmarking was completed. + + +## Reliable code editing + +Once files have been selected for editing, +the next step is of course to edit the source code to fix the problem. + +Aider has always had a deep focus on ensuring that LLMs can not just write code, +but reliably *edit* code. +Aider a collection of prompting strategies and code editing backends which have +been honed through +[extensive benchmarking](https://aider.chat/docs/leaderboards/). +These foundational capabilities help ensure that the LLM can not only code up a solution but +also properly integrate it into the existing code base and source files. + +The repository map helps here too, making sure that the LLM +can see relevant classes, functions and variables from the entire repo. +This helps ensure that the project's existing APIs and conventions are +respected when new code is added. + +## Linting and fixing + +[Aider lints code]() +after every LLM edit, and offers to automatically fix +any linting errors. +Aider includes basic linters built with tree-sitter that support +[most popular programming languages](https://github.com/paul-gauthier/grep-ast/blob/main/grep_ast/parsers.py). +These built in linters will detect syntax errors and other fatal problems with the code. + +Users can also configure aider to use their preferred linters. +This allows aider to check for a larger class of problems, keep the code style +aligned with the rest of the repo, etc. +But for the benchmark, aider simply used its built-in linters. + +Aider shows linting errors to the LLM in a novel format, +using the abstract syntax tree (AST) to display relevant code context for each +error. +This context increases the ability of the LLM to understand the problem and +make the correct changes to resolve it. + +
+ +> app.py:23:36: F821 undefined name 'num' +> app.py:41:16: F541 f-string is missing placeholders +> +> app.py: +> ...⋮... +> 6│class LongNum: +> 7│ def __init__(self, num): +> 8│ """ +> 9│ Initialize the number. +> 10│ """ +> ...⋮... +> 19│ def __str__(self): +> 20│ """ +> 21│ Render the number as a string. +> 22│ """ +> 23█ return str(num) +> 24│ +> 25│ +> 26│@app.route('/subtract//') +> ...⋮... +> 38│@app.route('/divide//') +> 39│def divide(x, y): +> 40│ if y == 0: +> 41█ return f"Error: Cannot divide by zero" +> 42│ else: +> 43│ result = x / y +> 44│ return str(result) +> 45│ +> ...⋮... +> +> Attempt to fix lint errors? yes + +
+ + +## Testing and fixing + +Aider can be configured with the command needed to run tests for a repo. +A user working on a python project might do that by launching +aider like this: + +``` +aider --test-cmd pytest +``` + +The repositories that are used in the SWE Bench problems are large open +source projects with extensive existing test suites. +A repo's test suite can be run in three ways: + +1. Run tests as they existed before trying to solve the problem, without any changes. +2. Run tests after aider has modified the repo. +So the pre-existing test cases are still present, but may have been modified by aider. +Aider may have also added new tests. +3. Run the final "acceptance tests" to judge if the coding agent has +successfully resolved the problem. +SWE Bench verifies both pre-existing tests and a set of held out acceptance tests +(from the so called `test_patch`) +to check that the issue is properly resolved. During this final acceptance testing, +any aider edits to tests are discard to ensure a faithful test of whether the +issue was resolved. + +For the benchmark, aider is configured with a test command that will run the tests +as described in (2) above. +So testing will fail if aider has broken any pre-existing tests or if any new +tests that it created aren't passing. +When aider runs a test command, it checks for a non-zero exit status. +In this case, +aider will automatically +share the test output with the LLM and ask it to +try and resolve the test failures. + +To be clear, *aider can not run or even see the "acceptance tests"* from the `test_patch` +as described in (3). +Those tests are only run outside of aider and the benchmark harness, +to compute the final benchmark score. + + + +## Finding a plausible solution + +As aider executes, it notes the outcome of the editing, linting and testing +steps. +When aider completes, it returns their final status as either: +succeeded with no errors remaining, +or ended without resolving all errors. + +The benchmark harness uses these outcomes to determine if it has a plausible +solution to the current SWE Bench task. +A plausible solution is one where aider +returns saying that it +edited the repo with no outstanding +edit, lint or test errors. +In this case, aider's changes are taken as the proposed solution and recorded +as the SWE Bench `model_patch` to be evaluated later with the +`test_patch` "acceptance tests". + +If the solution is not plausible, another +instance of aider is launched again from scratch on the same problem. +The harness alternates asking GPT-4o and Opus to solve the problem, +and gives each model three attempts -- for a total of six attempts. +As soon as a plausible solution is found, it is accepted and the +harness moves on to the next SWE Bench instance. + +It's worth noting that repositories may have lint or test errors present before aider even starts to edit them. Whether errors are caused by aider or were pre-existing, there will be instances where, after six tries, no plausible solution is obtained. + +If all six attempts fail to produce a plausible solution, +then the "best" solution available is selected as a the +`model_patch`. +Which of the non-plausible solutions to use is determined +by ignoring the testing outcome +and prioritizing solutions in the following order: + + - Pick a solution where editing and linting were completed successfully. + - Pick a solution where editing was at least partially successful and linting succeeded. + - Pick a solution where editing was successful. + - Pick a solution where editing was at least partially successful. + +## Computing the benchmark score + +The benchmark harness produces one "best" solution for each of the 300 +SWE Bench Lite instances, and saves it as a `model_patch`. +A separate evaluation script uses the SWE Bench support code to +test each of these results with the acceptance tests. + +These `test_patch` acceptance tests are only ever run outside of aider +and the benchmark harness, and only to compute the number of +correctly resolved instances. +They are never run, used or even visible during the attempts to solve the problems. + +Aider correctly resolved 79 out of 300 SWE Bench Lite instances, or 26.3%. + +## Acknowledgments + +Much thanks to the team behind the +[SWE Bench](https://www.swebench.com) +family of AI coding benchmarks. +Also thanks to Albert Örwall who has +[dockerized the SWE Bench evaluation scripts](SWE-bench-docker) +making it faster, easier and more reliable to run the acceptance tests. + + From 61019093a26b787a9c1f0e4d3e047e8e751952ab Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:11:22 -0700 Subject: [PATCH 02/53] aider: Added code to plot a vertical bar graph of data from tmp.txt in swe_bench_lite.py. # Aider chat conversation: USER: plot a vertical bar graph of the data in tmp.txt. use similar fonts, colors and graph style to the one in over_time.py. put the new graph code in swe_bench_lite.py ASSISTANT: Here is the code to plot a vertical bar graph of the data in `tmp.txt` using similar fonts, colors, and graph style to the one in `over_time.py`. This code will be placed in `swe_bench_lite.py`. benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH ======= import matplotlib.pyplot as plt from matplotlib import rc def plot_swe_bench_lite(data_file): with open(data_file, "r") as file: lines = file.readlines() models = [] pass_rates = [] for line in lines: if line.strip(): pass_rate, model = line.split("%") models.append(model.strip()) pass_rates.append(float(pass_rate.strip())) plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) fig, ax = plt.subplots(figsize=(10, 5)) ax.grid(axis="y", zorder=0, lw=0.2) for spine in ax.spines.values(): spine.set_edgecolor("#DDDDDD") spine.set_linewidth(0.5) colors = [ "red" if "Aider" in model else "green" if "AutoCodeRover" in model else "blue" for model in models ] bars = ax.bar(models, pass_rates, color=colors, alpha=0.5, zorder=3) for bar in bars: yval = bar.get_height() ax.text(bar.get_x() + bar.get_width()/2, yval + 0.5, f'{yval}%', ha='center', va='bottom', fontsize=12, alpha=0.75) ax.set_xlabel("Models", fontsize=18) ax.set_ylabel("Pass Rate (%)", fontsize=18) ax.set_title("SWE Benchmark Pass Rates by Model", fontsize=20) plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.savefig("swe_bench_lite.png") plt.savefig("swe_bench_lite.svg") plt.show() # Example usage plot_swe_bench_lite("benchmark/tmp.txt") >>>>>>> REPLACE ``` --- benchmark/swe_bench_lite.py | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 benchmark/swe_bench_lite.py diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py new file mode 100644 index 000000000..36fea56fe --- /dev/null +++ b/benchmark/swe_bench_lite.py @@ -0,0 +1,47 @@ +import matplotlib.pyplot as plt +from matplotlib import rc + +def plot_swe_bench_lite(data_file): + with open(data_file, "r") as file: + lines = file.readlines() + + models = [] + pass_rates = [] + + for line in lines: + if line.strip(): + pass_rate, model = line.split("%") + models.append(model.strip()) + pass_rates.append(float(pass_rate.strip())) + + plt.rcParams["hatch.linewidth"] = 0.5 + plt.rcParams["hatch.color"] = "#444444" + + rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) + + fig, ax = plt.subplots(figsize=(10, 5)) + ax.grid(axis="y", zorder=0, lw=0.2) + for spine in ax.spines.values(): + spine.set_edgecolor("#DDDDDD") + spine.set_linewidth(0.5) + + colors = [ + "red" if "Aider" in model else "green" if "AutoCodeRover" in model else "blue" for model in models + ] + bars = ax.bar(models, pass_rates, color=colors, alpha=0.5, zorder=3) + + for bar in bars: + yval = bar.get_height() + ax.text(bar.get_x() + bar.get_width()/2, yval + 0.5, f'{yval}%', ha='center', va='bottom', fontsize=12, alpha=0.75) + + ax.set_xlabel("Models", fontsize=18) + ax.set_ylabel("Pass Rate (%)", fontsize=18) + ax.set_title("SWE Benchmark Pass Rates by Model", fontsize=20) + plt.xticks(rotation=45, ha='right') + plt.tight_layout() + plt.savefig("swe_bench_lite.png") + plt.savefig("swe_bench_lite.svg") + plt.show() + +# Example usage +plot_swe_bench_lite("benchmark/tmp.txt") From c9349d6e23be609203cac3f85e4e16b035a7b3be Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:13:00 -0700 Subject: [PATCH 03/53] Updated SWE Bench Lite to display pass rates by model with adjusted colors and title. --- benchmark/swe_bench_lite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 36fea56fe..1a6f7a052 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -26,7 +26,7 @@ def plot_swe_bench_lite(data_file): spine.set_linewidth(0.5) colors = [ - "red" if "Aider" in model else "green" if "AutoCodeRover" in model else "blue" for model in models + "red" if "Aider" in model else "blue" for model in models ] bars = ax.bar(models, pass_rates, color=colors, alpha=0.5, zorder=3) @@ -36,7 +36,7 @@ def plot_swe_bench_lite(data_file): ax.set_xlabel("Models", fontsize=18) ax.set_ylabel("Pass Rate (%)", fontsize=18) - ax.set_title("SWE Benchmark Pass Rates by Model", fontsize=20) + ax.set_title("SWE Bench Lite pass rates", fontsize=20) plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.savefig("swe_bench_lite.png") From 5761218b9abe81e4b6a3ab07bd5f5d1e08353b7b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:13:01 -0700 Subject: [PATCH 04/53] aider: Add imgcat to display the graph after saving it. # Aider chat conversation: USER: save it as a png and svg and imgcat it out ASSISTANT: To save the graph as a PNG and SVG and then display it using `imgcat`, we need to modify `benchmark/swe_bench_lite.py`: 1. Import `imgcat`. 2. Add `imgcat` to display the graph after saving it. Here are the *SEARCH/REPLACE* blocks: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH from matplotlib import rc ======= from matplotlib import rc from imgcat import imgcat >>>>>>> REPLACE ``` benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH plt.show() ======= imgcat(fig) plt.show() >>>>>>> REPLACE ``` --- benchmark/swe_bench_lite.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 1a6f7a052..a54cff9ab 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -1,5 +1,6 @@ import matplotlib.pyplot as plt from matplotlib import rc +from imgcat import imgcat def plot_swe_bench_lite(data_file): with open(data_file, "r") as file: @@ -41,6 +42,7 @@ def plot_swe_bench_lite(data_file): plt.tight_layout() plt.savefig("swe_bench_lite.png") plt.savefig("swe_bench_lite.svg") + imgcat(fig) plt.show() # Example usage From d1bbcb9bf87a484eec88888400c40ff8d39234c4 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:14:37 -0700 Subject: [PATCH 05/53] Change pass rate label to lowercase and update colors in SWE Bench Lite plot. --- benchmark/swe_bench_lite.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index a54cff9ab..023df87f0 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -27,7 +27,7 @@ def plot_swe_bench_lite(data_file): spine.set_linewidth(0.5) colors = [ - "red" if "Aider" in model else "blue" for model in models + "#b3e6a8" if "Aider" in model else "#b3d1e6" for model in models ] bars = ax.bar(models, pass_rates, color=colors, alpha=0.5, zorder=3) @@ -36,14 +36,13 @@ def plot_swe_bench_lite(data_file): ax.text(bar.get_x() + bar.get_width()/2, yval + 0.5, f'{yval}%', ha='center', va='bottom', fontsize=12, alpha=0.75) ax.set_xlabel("Models", fontsize=18) - ax.set_ylabel("Pass Rate (%)", fontsize=18) + ax.set_ylabel("Pass rate (%)", fontsize=18) ax.set_title("SWE Bench Lite pass rates", fontsize=20) plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.savefig("swe_bench_lite.png") plt.savefig("swe_bench_lite.svg") imgcat(fig) - plt.show() # Example usage plot_swe_bench_lite("benchmark/tmp.txt") From 5ef96a32e2a9443d752da1579a299ac855411c21 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:14:38 -0700 Subject: [PATCH 06/53] aider: Set the y-axis to go to 30. # Aider chat conversation: USER: make the y-axis go to 30 ASSISTANT: Here are the changes to make the y-axis go to 30 in `benchmark/swe_bench_lite.py`: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH plt.xticks(rotation=45, ha='right') ======= ax.set_ylim(0, 30) plt.xticks(rotation=45, ha='right') >>>>>>> REPLACE ``` Here are the changes to make the y-axis go to 30 in `benchmark/over_time.py`: benchmark/over_time.py ```python <<<<<<< SEARCH plt.tight_layout() ======= ax.set_ylim(0, 30) plt.tight_layout() >>>>>>> REPLACE ``` --- benchmark/over_time.py | 1 + benchmark/swe_bench_lite.py | 1 + 2 files changed, 2 insertions(+) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 33e80e67e..dc30134aa 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -47,6 +47,7 @@ def plot_over_time(yaml_file): ax.set_xlabel("Model release date", fontsize=18) ax.set_ylabel("Aider code editing benchmark,\npercent completed correctly", fontsize=18) ax.set_title("LLM code editing skill by model release date", fontsize=20) + ax.set_ylim(0, 30) plt.tight_layout() plt.savefig("tmp_over_time.png") plt.savefig("tmp_over_time.svg") diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 023df87f0..957b2101e 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -38,6 +38,7 @@ def plot_swe_bench_lite(data_file): ax.set_xlabel("Models", fontsize=18) ax.set_ylabel("Pass rate (%)", fontsize=18) ax.set_title("SWE Bench Lite pass rates", fontsize=20) + ax.set_ylim(0, 30) plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.savefig("swe_bench_lite.png") From 6765b12a7de53ce09a482f42c935486507382ab5 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:18:18 -0700 Subject: [PATCH 07/53] Update plot_swe_bench_lite function to handle model names with '|' by replacing it with newline character and adjusting bar colors and transparency. --- benchmark/swe_bench_lite.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 957b2101e..c1ad7d7c6 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -12,6 +12,8 @@ def plot_swe_bench_lite(data_file): for line in lines: if line.strip(): pass_rate, model = line.split("%") + model = model.strip() + model = model.replace("|", "\n") models.append(model.strip()) pass_rates.append(float(pass_rate.strip())) @@ -29,13 +31,13 @@ def plot_swe_bench_lite(data_file): colors = [ "#b3e6a8" if "Aider" in model else "#b3d1e6" for model in models ] - bars = ax.bar(models, pass_rates, color=colors, alpha=0.5, zorder=3) + bars = ax.bar(models, pass_rates, color=colors, alpha=0.75, zorder=3) for bar in bars: yval = bar.get_height() ax.text(bar.get_x() + bar.get_width()/2, yval + 0.5, f'{yval}%', ha='center', va='bottom', fontsize=12, alpha=0.75) - ax.set_xlabel("Models", fontsize=18) + #ax.set_xlabel("Models", fontsize=18) ax.set_ylabel("Pass rate (%)", fontsize=18) ax.set_title("SWE Bench Lite pass rates", fontsize=20) ax.set_ylim(0, 30) From a6ae4cab0686499ebf28dcc7e0308636effa1485 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:18:20 -0700 Subject: [PATCH 08/53] aider: Make the model labels on the x axis larger. # Aider chat conversation: USER: make the model labels on the x axis larger ASSISTANT: Here are the changes to make the model labels on the x-axis larger in `benchmark/swe_bench_lite.py` and `benchmark/over_time.py`: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH plt.xticks(rotation=45, ha='right') ======= plt.xticks(rotation=45, ha='right', fontsize=14) >>>>>>> REPLACE ``` benchmark/over_time.py ```python <<<<<<< SEARCH plt.tight_layout() ======= plt.xticks(fontsize=14) plt.tight_layout() >>>>>>> REPLACE ``` --- benchmark/over_time.py | 1 + benchmark/swe_bench_lite.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index dc30134aa..ee0cd61df 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -48,6 +48,7 @@ def plot_over_time(yaml_file): ax.set_ylabel("Aider code editing benchmark,\npercent completed correctly", fontsize=18) ax.set_title("LLM code editing skill by model release date", fontsize=20) ax.set_ylim(0, 30) + plt.xticks(fontsize=14) plt.tight_layout() plt.savefig("tmp_over_time.png") plt.savefig("tmp_over_time.svg") diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index c1ad7d7c6..246729da0 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -41,7 +41,7 @@ def plot_swe_bench_lite(data_file): ax.set_ylabel("Pass rate (%)", fontsize=18) ax.set_title("SWE Bench Lite pass rates", fontsize=20) ax.set_ylim(0, 30) - plt.xticks(rotation=45, ha='right') + plt.xticks(rotation=45, ha='right', fontsize=14) plt.tight_layout() plt.savefig("swe_bench_lite.png") plt.savefig("swe_bench_lite.svg") From aac19f59113787602773db76f9cdb0ce543dbf87 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:18:44 -0700 Subject: [PATCH 09/53] Update xticks fontsize to 16 in swe_bench_lite.py. --- benchmark/swe_bench_lite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 246729da0..0b854ff86 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -41,7 +41,7 @@ def plot_swe_bench_lite(data_file): ax.set_ylabel("Pass rate (%)", fontsize=18) ax.set_title("SWE Bench Lite pass rates", fontsize=20) ax.set_ylim(0, 30) - plt.xticks(rotation=45, ha='right', fontsize=14) + plt.xticks(rotation=45, ha='right', fontsize=16) plt.tight_layout() plt.savefig("swe_bench_lite.png") plt.savefig("swe_bench_lite.svg") From 19e7823859918a63803b25601bbcb87e0c1f7f90 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:18:45 -0700 Subject: [PATCH 10/53] aider: Add more whitespace around the perimeter. # Aider chat conversation: USER: add more whitespace around the perimeter ASSISTANT: Here are the changes to add more whitespace around the perimeter in `benchmark/swe_bench_lite.py` and `benchmark/over_time.py`: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH plt.tight_layout() ======= plt.tight_layout(pad=3.0) >>>>>>> REPLACE ``` benchmark/over_time.py ```python <<<<<<< SEARCH plt.tight_layout() ======= plt.tight_layout(pad=3.0) >>>>>>> REPLACE ``` --- benchmark/over_time.py | 2 +- benchmark/swe_bench_lite.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index ee0cd61df..633584764 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -49,7 +49,7 @@ def plot_over_time(yaml_file): ax.set_title("LLM code editing skill by model release date", fontsize=20) ax.set_ylim(0, 30) plt.xticks(fontsize=14) - plt.tight_layout() + plt.tight_layout(pad=3.0) plt.savefig("tmp_over_time.png") plt.savefig("tmp_over_time.svg") imgcat(fig) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 0b854ff86..3a99428ae 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -42,7 +42,7 @@ def plot_swe_bench_lite(data_file): ax.set_title("SWE Bench Lite pass rates", fontsize=20) ax.set_ylim(0, 30) plt.xticks(rotation=45, ha='right', fontsize=16) - plt.tight_layout() + plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.png") plt.savefig("swe_bench_lite.svg") imgcat(fig) From 0b01b7caf5a8f110e46faff1f68c1bde438bb932 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:26:16 -0700 Subject: [PATCH 11/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 14 +- assets/swe_bench_lite.jpg | Bin 0 -> 37018 bytes assets/swe_bench_lite.svg | 1632 +++++++++++++++++++++++++++ benchmark/swe_bench_lite.py | 28 +- 4 files changed, 1660 insertions(+), 14 deletions(-) create mode 100644 assets/swe_bench_lite.jpg create mode 100644 assets/swe_bench_lite.svg diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 4021415f4..caa72c11f 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -1,12 +1,15 @@ --- title: Aider scores SOTA 26.3% on SWE Bench Lite excerpt: Aider scored 26.3% on SWE Bench Lite, achieving a state of the art result. +highlight_image: /assets/swe_bench_lite.jpg draft: true --- +[![SWE Bench Lite results](/assets/swe_bench_lite.svg)](https://aider.chat/assets/swe_bench_lite.svg) + # Aider scores SOTA 26.3% on SWE Bench Lite -[Aider scored 26.3%]() +Aider scored 26.3% on the [SWE Bench Lite benchmark](https://www.swebench.com), achieving a state of the art result. The current top leaderboard entry is 20.33% @@ -14,6 +17,8 @@ from Amazon Q Developer Agent. The best result reported elsewhere online seems to be [22.3% from AutoCodeRover](https://github.com/nus-apr/auto-code-rover). +## Interactive, not agentic + Aider achieved this result mainly through its focus on static code analysis, reliable LLM code editing and pragmatic workflows for interactive pair programming with AI. @@ -33,6 +38,8 @@ When a user asks aider for a change, they see the edits performed in real-time. Aider may also then offer additional help like fixing lint or test errors. +## Methodology + For the benchmark, aider was launched in each problem's git repository with the problem statement @@ -113,7 +120,7 @@ Some noteworthy observations: | 6 | Opus | 1 | 1.3 | 100.0 |**Total**| | **79** | **100%** | **100%** | -If we just look at which models produced correct solutions, +If we breakdown correct solutions purely by model, we can see that GPT-4o dominates. This isn't a fair comparison, because GPT-4o always took the first attempt at solving. @@ -145,8 +152,7 @@ to provide a compact and powerful summary of the entire code base. The map is constantly tailored to show repo context that is relevant to the current state of the chat conversation. - -by performing a graph optimization on the code's call graph. +This is done by performing a graph optimization on the code's call graph. When the user asks for a change to their code, the LLM uses the repo map to decide which files to edit. diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32e2abf4c3295ce521fdd9fd1f3f6dc7ae5ccc52 GIT binary patch literal 37018 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 CZi=k{ literal 0 HcmV?d00001 diff --git a/assets/swe_bench_lite.svg b/assets/swe_bench_lite.svg new file mode 100644 index 000000000..4da3fc0fd --- /dev/null +++ b/assets/swe_bench_lite.svg @@ -0,0 +1,1632 @@ + + + + + + + + 2024-05-22T15:20:34.149598 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 3a99428ae..cdbbf8227 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -1,6 +1,7 @@ import matplotlib.pyplot as plt -from matplotlib import rc from imgcat import imgcat +from matplotlib import rc + def plot_swe_bench_lite(data_file): with open(data_file, "r") as file: @@ -22,30 +23,37 @@ def plot_swe_bench_lite(data_file): rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) - fig, ax = plt.subplots(figsize=(10, 5)) + fig, ax = plt.subplots(figsize=(10, 6)) ax.grid(axis="y", zorder=0, lw=0.2) for spine in ax.spines.values(): spine.set_edgecolor("#DDDDDD") spine.set_linewidth(0.5) - colors = [ - "#b3e6a8" if "Aider" in model else "#b3d1e6" for model in models - ] + colors = ["#b3e6a8" if "Aider" in model else "#b3d1e6" for model in models] bars = ax.bar(models, pass_rates, color=colors, alpha=0.75, zorder=3) for bar in bars: yval = bar.get_height() - ax.text(bar.get_x() + bar.get_width()/2, yval + 0.5, f'{yval}%', ha='center', va='bottom', fontsize=12, alpha=0.75) + ax.text( + bar.get_x() + bar.get_width() / 2, + yval + 0.5, + f"{yval}%", + ha="center", + va="bottom", + fontsize=12, + alpha=0.75, + ) - #ax.set_xlabel("Models", fontsize=18) + # ax.set_xlabel("Models", fontsize=18) ax.set_ylabel("Pass rate (%)", fontsize=18) - ax.set_title("SWE Bench Lite pass rates", fontsize=20) + ax.set_title("SWE Bench Lite", fontsize=20) ax.set_ylim(0, 30) - plt.xticks(rotation=45, ha='right', fontsize=16) + plt.xticks(rotation=45, ha="right", fontsize=16) plt.tight_layout(pad=3.0) - plt.savefig("swe_bench_lite.png") + plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") imgcat(fig) + # Example usage plot_swe_bench_lite("benchmark/tmp.txt") From 5ba549834cf00460560484e6f4c09124bff571f9 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:28:28 -0700 Subject: [PATCH 12/53] Change the figure size in swe_bench_lite plot from 10x6 to 10x5. --- benchmark/swe_bench_lite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index cdbbf8227..c3e19c46b 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -23,7 +23,7 @@ def plot_swe_bench_lite(data_file): rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) - fig, ax = plt.subplots(figsize=(10, 6)) + fig, ax = plt.subplots(figsize=(10, 5)) ax.grid(axis="y", zorder=0, lw=0.2) for spine in ax.spines.values(): spine.set_edgecolor("#DDDDDD") From 81ac2e18cc5b44d19a56b942e6a0588c94ec4382 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:28:30 -0700 Subject: [PATCH 13/53] aider: Changed font color to dark grey in `benchmark/swe_bench_lite.py` and `benchmark/over_time.py`. # Aider chat conversation: USER: make the font color dark grey not black ASSISTANT: Here are the changes to make the font color dark grey instead of black in `benchmark/swe_bench_lite.py` and `benchmark/over_time.py`: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) ======= rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10, "color": "#444444"}) >>>>>>> REPLACE ``` benchmark/over_time.py ```python <<<<<<< SEARCH rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) ======= rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10, "color": "#444444"}) >>>>>>> REPLACE ``` --- benchmark/over_time.py | 2 +- benchmark/swe_bench_lite.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 633584764..b9c33f4d3 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -21,7 +21,7 @@ def plot_over_time(yaml_file): plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" - rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) + rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10, "color": "#444444"}) fig, ax = plt.subplots(figsize=(10, 5)) ax.grid(axis="y", zorder=0, lw=0.2) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index c3e19c46b..08ff9ab59 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -21,7 +21,7 @@ def plot_swe_bench_lite(data_file): plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" - rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) + rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10, "color": "#444444"}) fig, ax = plt.subplots(figsize=(10, 5)) ax.grid(axis="y", zorder=0, lw=0.2) From 1f7ff5471787721396f228ade525cea02be15db4 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:28:44 -0700 Subject: [PATCH 14/53] aider: Set font color using `plt.rcParams` to resolve `KeyError` for unrecognized key "font.color". # Aider chat conversation: USER: KeyError: 'Unrecognized key "font.color" for group "font" and name "color"' ASSISTANT: To fix the `KeyError` related to the unrecognized key "font.color", we need to set the font color using `plt.rcParams` instead of `rc`. Here are the changes: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10, "color": "#444444"}) ======= rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) plt.rcParams["text.color"] = "#444444" >>>>>>> REPLACE ``` benchmark/over_time.py ```python <<<<<<< SEARCH rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10, "color": "#444444"}) ======= rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) plt.rcParams["text.color"] = "#444444" >>>>>>> REPLACE ``` --- benchmark/over_time.py | 3 ++- benchmark/swe_bench_lite.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index b9c33f4d3..c65c7b941 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -21,7 +21,8 @@ def plot_over_time(yaml_file): plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" - rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10, "color": "#444444"}) + rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) + plt.rcParams["text.color"] = "#444444" fig, ax = plt.subplots(figsize=(10, 5)) ax.grid(axis="y", zorder=0, lw=0.2) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 08ff9ab59..de2189d00 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -21,7 +21,8 @@ def plot_swe_bench_lite(data_file): plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" - rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10, "color": "#444444"}) + rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) + plt.rcParams["text.color"] = "#444444" fig, ax = plt.subplots(figsize=(10, 5)) ax.grid(axis="y", zorder=0, lw=0.2) From c3b8caf4802e70271574daddc6ad9c26974483b8 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:29:57 -0700 Subject: [PATCH 15/53] Update text color to "#555" in swe_bench_lite.py. --- benchmark/swe_bench_lite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index de2189d00..eac2bbc46 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -22,7 +22,7 @@ def plot_swe_bench_lite(data_file): plt.rcParams["hatch.color"] = "#444444" rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) - plt.rcParams["text.color"] = "#444444" + plt.rcParams["text.color"] = "#555" fig, ax = plt.subplots(figsize=(10, 5)) ax.grid(axis="y", zorder=0, lw=0.2) From fcfc05e2d353537be887f4daf58dbb958dfeb905 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:29:58 -0700 Subject: [PATCH 16/53] aider: Make the x and y axis labels also #555. # Aider chat conversation: USER: make the x and y axis labels also #555 ASSISTANT: Here are the changes to make the x and y axis labels also #555 in `benchmark/swe_bench_lite.py` and `benchmark/over_time.py`: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH ax.set_ylabel("Pass rate (%)", fontsize=18) ax.set_title("SWE Bench Lite", fontsize=20) ax.set_ylim(0, 30) plt.xticks(rotation=45, ha="right", fontsize=16) plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") imgcat(fig) ======= ax.set_ylabel("Pass rate (%)", fontsize=18, color="#555") ax.set_title("SWE Bench Lite", fontsize=20) ax.set_ylim(0, 30) plt.xticks(rotation=45, ha="right", fontsize=16) plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") imgcat(fig) ax.xaxis.label.set_color("#555") >>>>>>> REPLACE ``` benchmark/over_time.py ```python <<<<<<< SEARCH ax.set_xlabel("Model release date", fontsize=18) ax.set_ylabel("Aider code editing benchmark,\npercent completed correctly", fontsize=18) ax.set_title("LLM code editing skill by model release date", fontsize=20) ax.set_ylim(0, 30) plt.xticks(fontsize=14) plt.tight_layout(pad=3.0) plt.savefig("tmp_over_time.png") plt.savefig("tmp_over_time.svg") imgcat(fig) ======= ax.set_xlabel("Model release date", fontsize=18, color="#555") ax.set_ylabel("Aider code editing benchmark,\npercent completed correctly", fontsize=18, color="#555") ax.set_title("LLM code editing skill by model release date", fontsize=20) ax.set_ylim(0, 30) plt.xticks(fontsize=14) plt.tight_layout(pad=3.0) plt.savefig("tmp_over_time.png") plt.savefig("tmp_over_time.svg") imgcat(fig) >>>>>>> REPLACE ``` --- benchmark/over_time.py | 4 ++-- benchmark/swe_bench_lite.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index c65c7b941..0ea641d64 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -45,8 +45,8 @@ def plot_over_time(yaml_file): textcoords="offset points", ) - ax.set_xlabel("Model release date", fontsize=18) - ax.set_ylabel("Aider code editing benchmark,\npercent completed correctly", fontsize=18) + ax.set_xlabel("Model release date", fontsize=18, color="#555") + ax.set_ylabel("Aider code editing benchmark,\npercent completed correctly", fontsize=18, color="#555") ax.set_title("LLM code editing skill by model release date", fontsize=20) ax.set_ylim(0, 30) plt.xticks(fontsize=14) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index eac2bbc46..c3f11006a 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -46,7 +46,7 @@ def plot_swe_bench_lite(data_file): ) # ax.set_xlabel("Models", fontsize=18) - ax.set_ylabel("Pass rate (%)", fontsize=18) + ax.set_ylabel("Pass rate (%)", fontsize=18, color="#555") ax.set_title("SWE Bench Lite", fontsize=20) ax.set_ylim(0, 30) plt.xticks(rotation=45, ha="right", fontsize=16) @@ -54,6 +54,7 @@ def plot_swe_bench_lite(data_file): plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") imgcat(fig) + ax.xaxis.label.set_color("#555") # Example usage From 9f2554fed7a68d9271911f1ba5aaea1640d8d7f8 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:33:11 -0700 Subject: [PATCH 17/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 4 +- assets/swe_bench_lite.jpg | Bin 37018 -> 32286 bytes assets/swe_bench_lite.svg | 303 +++++++++++++--------------- benchmark/swe_bench_lite.py | 19 +- 4 files changed, 154 insertions(+), 172 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index caa72c11f..f9d203ada 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -5,8 +5,6 @@ highlight_image: /assets/swe_bench_lite.jpg draft: true --- -[![SWE Bench Lite results](/assets/swe_bench_lite.svg)](https://aider.chat/assets/swe_bench_lite.svg) - # Aider scores SOTA 26.3% on SWE Bench Lite Aider scored 26.3% @@ -17,6 +15,8 @@ from Amazon Q Developer Agent. The best result reported elsewhere online seems to be [22.3% from AutoCodeRover](https://github.com/nus-apr/auto-code-rover). +[![SWE Bench Lite results](/assets/swe_bench_lite.svg)](https://aider.chat/assets/swe_bench_lite.svg) + ## Interactive, not agentic Aider achieved this result mainly through its focus on static code analysis, diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index 32e2abf4c3295ce521fdd9fd1f3f6dc7ae5ccc52..ff8b1e36622d2031a7c4b29cbabd7797f3e57fbb 100644 GIT binary patch literal 32286 zcmeFZ1z1(x)<3!lDM1=(q@+c<*`U(W-AGAy3BpEDz%3ylAl)5On?_JNq)WQHJ2!V* z=ywk9dC&d+ai8zG2cGrJxni$5$CzV|ImT~{xh_X8rvX^f;!@%OI5;?fG3+03IRjBs(aQg_$2yj#Ycx*TX zY`Dut00jU5cLUbjZyo;m2M3RUcmoL;1r_Zk>;VWC03Hqj0UiKd9_M#d(lPtD9N9G#q9T-~0z`@VeT=O6GI92WjAA~NcIbWBQW zT6#uiR(4KtNhzePyrQz|b3!2u9{kab1bKhT8@qYEAp5djhT8(nbluCN0E8}SAu8xoGFBJvY^Tq^b#D0mM- zlZ!r~QgbM6;~P5kq7l$=&d~0BBken7{~lpJ|1HX{2>VUfC;%M+4mNlQ*Z?5l=#)Oi z8|^>Ge|YeJOa=<%n@95(lKV=lNfL`?vd2$Y949&Fc#lqA0i55dlK{PIa$Tb2hamwU z22AdTEf<D?fNgh`Y0 z62SH<{Zq&y`uSYulQ9U7-ZnIQW`lfAt^Zs(w~Zy|#805|e84_I9FwBUTL>Q9)yE|Y znpqQ)n=_`;c8+-*$G8*TwxPmuZaaZr|?gLFWPYrqVqcPqb8`I?<-26Zn zjDou*=nqg+i=M+k(5O0N2~Ni=NeEDVTi$O+bWV@p0G zEPxOGFrly9EgG}DAA)N(y2o!GwbQi|SZt6Bx8?_!oAl<&N~!pQbh>F90HuONuDX`L zreJ`;=Bu@BW6@t~{2!3(iK*vm!~aFO*%>3XX3v?VA8DPU>{i z6u2Q+W@b@5iDrY8h~ptlrf@D}JvWw-r7P{{LNK)TVx^qj5bHO1(c3Yr;a;5dAd8A| z^HImpM$)MV)ti{`A-em@CBcK~|K}f-Te#+<gq{b2KVFo&~hW9jKAVf#Q0QZn`~eis2{d6;z~It#g^&a9~?T9S4eP zO%e^x@A&(%QVvjR6u^abEvVSZO-fQcJORIKn>$I}6$~OkqDGqMC=>d8dSR*GKu!_T z5F`H;@rz)eq-laF;p9?w%QQX0m!z7Qt$H=`+stC)RmnwfT~YFD66-@x)U^wmV_1Wq z3uKEY--*|j3nv9&j#ETmFfgBE3Y9l9Ko%o$4K)|RcUs&+2asrt$Q;~H)#?JBP@hXA zamAO0wm5~+6xO`-&cn;3!TLDLH)ZA2!^3vQH2sBFUs!qJQ+#<5QkPx#TL?it;F#40B6mR!XWwkA)Te;+r zvqvqXHDN=RPU%P`dn5u)uy63keYjkcWVf)JBPNwQmOAypHyaKSW#=kd1wAb@3MA0b*BWPxlD>+(J3P7og}K9BE|M-w7+&CoUf$Um@= zR#G*u)kd|Y)y z#ZoK5|6b&CI8sGU6DlT;+nd3>2KV`iM{Bpm(k8KdA3~y&E!A*7**&9D46nFw00Ax1 z9gXIK^x8_R+nlO3Xh`U)y^CD+&eV&5{xc$klXNB3;h&&*g@d7C(~}a2?Hag&_^X&Y zhUH#&RwD1818X$$p9E^7bW&nrB=QFX;U(tOAa!URu1}J`u596mWlV@MJ?nI6O-=A# z2$|6$XX>-znnIs6FZ)0&%d3#jKq*d2Zil+DB0?IOdkMfz#61Q|*9e=Wj(O%hvUwDY z6&gCV3C*agwQSJx%Cky0I@H{_t7#a6mD51c(4Q&aUIIzHsXOs?`H0`MQDOB|i#}-V zF3&WQ@)R;f_fSq-id#sd>!Cy=#gnrB4O-k2g1k;s`+k~zin(KNv@&<+{HkRC#FSipl0{pa1<3a;h%pAIf=Yud_$Ud66eYu$aBCvf5D*AA1;Bu1%a_|r=MfaR zmw;j3OF-DLs}608UyZW)>=$|U-h$FnnTb^EPYxmgmz%3XW(d_EgtwEBhMS)OE&-W3 z&Zk_KE8A`}&M3E%T~oQ<+fL?D9z`6sA7l#xXR71xTV}g5KaL3+2+MpY#Tb-OiICvA zj1XB=6D4;{Y-8Of1s3!e_Cb(S+1tOHx58mD1SKyo@~>x;HR~ym`uOIklEQ7lJpq!P z>?Wg7wmmrI@BDh>Zhtgd{m@L!r$}ZQVf3_VY{6Z zy4}i9PbRhh`v#UcrApBSk}Y=b_BaCuTdkAXAtDc(ejA5t#? zQ^@D^d+NQHfGuAr-YGp?!hat84}1P26#tnDf1xQtYS``DV?5dQD}a;wi}Y~&iedn~ ze|5Cg4YWa5pem=vQ>(_80H;d;Bft|+QRK$=W7saVByL8O4qy3933F5G1al|bLB^hs zw$cThevyrQM04(c-21E2cNn@UFX$0vmZLxV7UUq`3JRk5RUz*aYDf_3C{<$c5t}5o_Gu`A1ql{69X%yq(yA*R0SC!HbyQL6^4Sbnj&8J>fMkOj7TdwU#?*{ca z-`se$n3%0y6n2zIJwmXBR@zn$i@+;9#mE0+%|iXEG#_cj4ee?+qR_QT_9=A` zoz*bV@mT=Y1=(hA*1A336HQA~^yV{rE% z4Re8wb_GYiW*E-+QZR=?9=xsOJL!fmi_NzDU*1l0JHf!4(R3zquJF8G`rGhMk@lrlB zF$hhGG^O)KR+h>|P2N{$OIeGGDtGT3#x5-P;aw>A1>Ap-C+@M}jXcJA!K3n#$A!YG zqBMr&SW8ty-P{*IUdcyR(!zP7aiZC$sN(e1r0T_H8eKeFEp;43n_V}(`oc)IrYyW*I$dEZgKI=GdBL5~}88sG3SbXC!#e`UT-3p_` z!N_2Ghn|Qg0Z?GN)NJ3z^f1Ld%Do}GK?*R2BAoDKZubkoXrgR6HYNRwvb0tMPhI_5AoqlwvXbyeKN!w z@zB$bZ`EQTY$Tn@%JHyQLu~d;wf7MdQJJGl+40w4?x&JObA>R3ir-oEnx{=WST^r0193XW*lvK|?)f=+SPl!~#ze&IUe3C4Pk&rrS%Z5c!c&TtyZ;JeVD#2^$0jxc>>q$w^H z!7r~=y>QTJLyaz6t`1TYL}CP~>A0h|Pb>8)7Z;Qre$juPb!A;jzyNA;*x*-yA{-BT zbgt&0{<#Ow+0qGGwMuE-@uBTe_b$FmHN!dmn*V2? zoK@h?4C~B!lU7bu$hn)$F^Ek|!imqSlbAlGDp(-}+)+Dxr=*(uwXL(OU2g4MS;#Xn zA=G&|=|i$0X(q}VsV9d_9sxBgF*9HZMEk`D4O2)G7eT6TfG-%L|$V4T}+|QwR5msC7~4qT42}r8wJL z$)m%RW#%vZjDCrETC4IjcCVFG-~t`R70VI=;Z_-&();v8=mPEshT)a(0PI88JrwPV zgkZL(sP?GqxtrMWC4fVNt2PtV@=`x!k1Jj_h+$JJ1sM#ZzjbUJNGZMq{Qkx7*YMGh{(ZX) zMZjnrVYW)qmURB4!W1w);Qz+)YrPWwWlICDjVbPm`!utlT>|6=_H(0a)M<+G--&eY zN@}b-g%hIjZjB7*jz8+xmcfzU;Ye1bGIGG-4?M!}?8tJ<6&HBgZ#b0SBJ)NKTPEZ% zl@IX}P~8NulE|Pvd~Io&_mHf!1MOLQ<;ApOByv&LGklw_0nO3$st(Sa=!VX-F`_P1 z!8oU-zRD+ax(^-}v!Ymv%S%y>)E)Ka4n1tFitkjOI^ma1xeqG-{8`iZQy0-G+&KsJ9;KUHZp{K09Ph*O0doSIQSpY49(dZc(wr?P|2>!-K za`ABtRk0thq37+RHk?-!%=Kb#g#x`jnUobOhQp3JO8QGztWZc6BTweuV$Oa>c~9zc z;^&zoOVSXd=6x61Rc1D7og(o}Pu-w~etbSYl@5WIh&P|;r^5;G+PerD3Yi2Io%Sy$ zA^n##lzW2RB{K1Kb}(=B)6!@aNyzbG)J4O2ZeoG^St{CCGT&ipqJ1`v z2+EJA4o#bW-&UAB2+nF=l4QrDKTjLnb2jVhM(wY?| z9P4vqIB%D0LAoHWwug$$GU)f&PCg^Vl_wu&$R}Au-F7K=uw>&r9IGkgeu&`0*SuNd zoO^iao+H6OZjsI4*52GvSVeN z;QlEN<7Q(1Xg6(bsoF5sL&n)rDeBQMZ=iqNJ`oWDxQ02RV5uUarkf2>x}yHkCJ=Yv zLWoJYLo{-9cAz^;%HH;AV#x!enV581v~mSW{Ue)KrY-4Nexq7IFmc=C>l*|K+RSm;>}?&|48 zw~x_BA6{Qbb#&%E)hNWEcEGAg_ndO4I>U(LhJ^4S#v6_iZ4R7HLnSFbnrStmHTmr0 zH)m}3GRw+*#$_2^914_>!X-2yaBeb@jGrlXLmX_g^}cFZaI?Cc<=-<5oTxx=Lw_$2 zl8qoZa7dh1)C9u2?XURADY(z|(-ieBmBQ&4pXhoLrF9w>`1QWAB(?12*q8*a29#< z2w$S3#I?`AY8tFfGn9!9NPb{PEP)2(P?DgMA#Nkdg;`h1ZzYDl|JGsZFlg!gfa0k2 z5`gwczf^C&skY?AbhO7qkwcK45eE^w%iw~9w}v&-1P%7=oA4p;q(->hdOBWy{japZeCh^^o*lp|nwd-q zBBq00D`|?-Z5Oyy3D_PV_+KAzNJfbg|Zai*9Z)q~@zzEWN8x%G15cflD;HjmBTR2B-!xh36-1n*6-J|4W4 zJ{v?erdP)?8mnGjk)SlsCT@r#XiYO6^4PiH!{^hIwFKg#0TYGdPJcHt9(a||V_y;C z{r_cGlJXii2I*rI%o6?rJ%K(b7-V6E3dLURoxjp8Xa}M3&uk}M8M10Q1+d@_IS!Pf zQ!RAjmNo|xn7$zO-F4s|lZPB^4MM4-ShPecFWoxcezOBLEy*rQ7wS+^6f>|<7_6Hc z1Wi%24sltnPVKDLZH3HR5|?LgzgIc-0n_KBcM&hC_8$aEFAC|aXfU%ZvbC6|h47f4 zbxBz5Q_OF!_K%Lcu^-CZ6))p1pr*fH0SE>%j;CZa>2%#5I<@h|nCO4!$E)lJkYfid z3qzt^9mzvx{pzY{nF}@|1UJ%NISbw5Hzr=8&wQfO&=a+xu9cBtWa780ijAy8@JKhg z(1YB(+|Zoh&{LT95+M4z?<>9=2lgJ8(8uK?W+r#A+ReD;S59H8Igz)^qgSYoZmcE zOE+1g*lmH{xL{1)!3DnTfZ5eaOK6J)dHeZyF&=Db-q#Tt&uefuY2Vivu0!an(wa9Y z8<-ukf!xeTlj-nfz>>6~YE%rV!o&S^lpU(bvEqNJub4_?nrms(GQQZCRvooWVzmW3OIHnhufR=)0cwh%7g~lv1bwj!l%*x8kPU9zY zh4N!+{6O4}k<7vh{^fjgabSRxFy@Z@*w$ifquNeE61I(rALb-~$_61JoSYDba{@WB z#WI0qnj}r3${23o`3Mb;b%$xSN_Rzdrg`;c)cAk%%Wa z(!x*t?u56kI)I1)BPrl%dGNs)YK^6EHb$CEnueI;Q(HVgu?15;)6uj@`bsh+-c3nl z&&RPBj}tc&7j(K`Le}C9J+cZQy8Nq>q1tWb{fm%LxbDtJ1u_gRhydO-UFOadIz(@m zgnc+#yx8HhhP_nSV7qxa0ZNr@^|vs)g4Ql(PI?gj2n-aEd3|B+6rS1I(BLD7bn81k z(RRX93|$kK$Tu+jS%F2!zF+vu(sBi~vp%(zIM2AD&`%^*VjKdq4bf_AK{Y`BpUwlp z66yhAoU{f^R%2SC zfqu^q)>`Bk?{yUO>|0Bmsmp-ZTNXG>bUEVlP>~bP!I}2i7CijVcX^lkR1P}_lpMlSi(`(}2x?e6-;?bn6#KB&!w3J6U7BM;I*_6-e*ZyP z9&RJ9&dBIRvj|A8h76m>6^s}ZMpLDS0$Nr~TyGwhj`VNIF6U+|D9qOfHc`K&lx{8)Cg zNcY+2h{?HPe&?><3ZIer7cXQq-JLha^mRt`pJ8y)hoRmP@A_Sv*YqXe8R&iHcYP2|&7gpQ zu*V9r7r{{!!vp-|p-wdCXie~8rXxsJwe6&k&aUq_H9%3Ca3JuR&) z25S>hh7AOY_qDUW;<560bb1PahBfzVNHG2`(({>kzcA-jJJnwdpkO8RU9pT z+RoG6UY7+A?u$9GToGNs{4iHtp&0+DXE32v{De!?WM^l4Ce5q*7SdfubqFTLvg>f- zsJc6MqR_qpUS;H0Vlk%nnSj<7i{T7eXomce{B9DmmHuW(d(fMU-V>!>5!5136_Ame z^+;ktMhx)K?#-dOm*Nqot;MJM{Q{pks1OY3|Ax~nttEV1{#>?vUx>bbKLuRh__G4| zyK=A}U$(>;^P`6cTJ86?GXFVraJLD%e4bN~lEZBLIe4PBN&Cu@{s9S-VoJlB`34Ku z@24X4!4}!SFY_n(R7P4N$j&@sKId-;Kn1DJLD6}uR_5{!UEi9^8mXJ0h+x5gQJI*_ z_(ruJVTr6Z$Y|PKtt%g_MnLG+BNLYL5FEqt*RIE({M+1>81wmY8fy^%M6;^$<$?iEV6{TXb zb_a8AcI~k-NO6F5nkJPP?StZdK^522yYbnr#k!+;Vf3SfY|0@IM2X0oOX*Wu?=_2| zD?A7lBTh5p&dI8WPv-Yb)qsSHub&y6f zd$!RGcK*Sb4C>79JSDk(mb#msQhBTByGV>^j+@=XHS{)yJRn1d~BXv>*(s{zklW!I48u9 z*`l7m)Z7w7pu zgBc-B`)YlN&JL2@?Ke0-6vmb<#4!3Fmi|h&`dN_=(|rZY#5%p^mIO^TGAy-gIfr7j z=T~ai&kAYSI_b`)eo7X|QuLw?ND1YcvH9~_)@8E+v9ot~x?t7UtXS#CotP+v4@(=>gERB0c=$;%g0PszrhYc|%2Lq!8 z5f`;Nk4ZZm@3t25!a4fbp|+5%C2bFdT)avaHGaA`-yublnp#a7CRACV)I~9~u&s zYhC)(Nrr1t4w3#-0JFQ3nsB}2fZD5P_bSsh%^ln}$%NZUET7nBbPL)w<4dC&n@b^F zy#1PlDc*Z7mcI7cc74q+G|I;$loPa^Kq zgf6p1Fbf%uYmhJC3lpb7=oDOc&)HByvh4?~v&D?1tho(7gTZ44Am{y14g8@q8H zJxEP>Up~MPU!XL1-TD3nEUi%aM`iR9u-CtzgjfNCsLVm*!1l`1i3;^I&N|>W`Q)Il z@7h%^mhYN4Cd}hv!Fw-UYH->EGX=k2f!Te3aRI6MH_4b00TrY@2foif{MI$bvZMlL(S@KNEU6#Q{KNSg9#nmmv#_@p zJlR~d?fKLB`q@%Gdeh&x{p*PpmMi~D@2mcL;WqFhWBHEAmBOBJP5PB_v z?^mO9{mA9Cfga_3ITY9&$B##U((W7g*QEYx?&^s@3Mlx4tK!N0Ldj9JCld$q&=2MG>SqhZ{|4WGb!OEp!y0t5 za;gZq1T1B)==f`#Hp5`f70@_E=TO-&4Ax0ZH(E`8)wfWxduwvBAhA(Q{$;w@UCew! zSdSgwh*7p89vtF#uZ-4SY`sn|t$>8}-GJ=jFmOj2Rg)C+yApO=$d0)16EnpRK;9fX zSKs8_F!r02c^hJPCi&K28<}orF5QV&xRlP$3>IZns2sLpS*i+Kl9q8Rp5jy@XnAr} zDTF+fa{F}P67ZxnOh$&OEy?4xW-4&9_@nsbbyfof=t2u6>q<`7C?U_;}I1 zR(5>s!cLBnX*lTietr#wmif4>#!tp)P+8g@pZZ@MK%IMsd8{x;lb4QLY~7b#zDYF` zadoWHi06NqgiO?mSL*NQSj4Q>qkj}%m?NL{rcJp9Xv)JRu!!U)z#5x0|B@{ zkb{KdKDv*?LkPT&Fisk?`J9h-V3NEz>~M5))FtFDiS2+gR{H=cL7LVX~nE z&Gg<6wk%v4bCI;=Z@j+3TN{HO@4$ATX}2a`}1u-X}_Nncz2+n@fNcO3y207 z&k{>7OfYY%d7wF{qzRAFN8g1&K5aZFoRN{@&1inAmzegsXJv@H%$~#6xcrro(qtMv z>EP>skmMQSag}I{mY;jF!eWy#RUmA9VH{YVkS;Q> z8rCHs6eb|+gmtH!LmLwFVuvBXc6kAtZVt1Fa=vEwIiYM$P9ry8C~zNm3Z*!`sn!^E zzll?!jgh%{spG*2Yp@)$yXGCRX;9j0vQ+CCpeAxvpkkpyJH0%vIf@a0gN`s3=p#ATSDNNSlzhJfNAQtBDm|k_UnHSn`D;Tz z&S0*yEHHpVgn>pNBn8a)nzjtK%4UJ4^p|wW93!W84q*K}UrWui*tC{0fT7FO3cs9) ze~lb7S@68cT#0hctB#z!{Vr=0U#ewAM<_ii$XS1~brYcjcnf_sP)4wFjiqzJ35e7^)PaYjRJBPt_Qyd+8iyY3Vk@Ovy{Dg1 zbSt%ixY}}(qyrrw zlPl_d7FxzUj+))3yEdJ;f&2!ctw+r;EV=qysO=X{EdLv*_-XXPk+qzA$UtYHs@=n) z_AuxCS1Q^sxL52O)cemHA^w1MmHs&$1T7a9?QVHl=f8(p+f2xJLf@0*T4ucYaNEqUSr4qfyLs(@)jDPvoOFV zvQlqJX@u#w5fBlT2kM|WzP+F0-}o4cdk+>;^o_gjbxf(>BuN7_uD_tO;N&v3vxa&0 z<~*0Nnz(N~5=@^b8+ZlnnhgDu?+<%pG5j^O--0bU1rPI>NYr32{{{+yIJCKfV5ZTx z(Evv0X6|4s&(JH1;rBRRmkfvlLqG|j%EYo%ZXsI9kW(9xi82+n%n{vyBS_3l~r#a3UU7=YuyoQc{ql9-Ew zybllaNWsfCSGyf5*ER#0Y+kmeQbodWw#Q(01{i?x{S0u;35G1Yn6@b_F^vcols@^^ zP|ojghKusC;xOhb^gZRXsdTjgnukVrko!--m8#AZ$JD-I?aw)O#t{4$ssp{MBg#x^> zVkit(z2*d2=1+dX0IP&=ZRB~X4i>!gJx4f+8OyWQh6+brd^-Q43k(1!q9%Uh6>NI_ zEzf96;G9vrcS4qQF=G-ZFPIYlSXqqJ9WAtf$OHMe1~Yp#i37ij2iLqB0HF&u1OF~- z;}0t$n&&hcI00-={H48Nn-6|irtkv4llrcKkzrb6I+76zf=`D~z}!U-nmQ&SdzJFm3_}3)W5JE8X}@N5V=nF+4?>f2GC^1GOn+ zpwm#(GRr?SxVro-Rpw_{vh}wlifg{Z^1sU_`Tg#kqobiw(?omFGkWmoD0ief@N*8k z{DKGpL->!h^IQt?9cJRD@iJ>8&nGUS%(FK~28m`3MeHE~&EhD$)D=Yezr28}bYJQ} z0E*?`(cvG8)CV@k=nt-0(J(x(GI(;du2R)?-$C)58)ihWRAj#DFAU;Gs22k^hOjX2 zb%4}w>B6{@xu?oT(jJjnFnJ$O{sTz(`a7@3R(|Gw_6}_Hw1}<~Uox`aHbKhO%C0ob zG`^~R<5xBelhSWkQsMY@;%5`sbhv&czVX{6i2DN#_z@<6{pxkmFGC}*YT#Gejjq$f z8NQ`&om3OKhIBX>T#Vo9{L08;YG=Q06LZnh^tTh>1f^npP74!(s#~yqB>$8e4zGP> z4h-|bl1C^MV1e$st}6cKf<;*74}D587uwG~lFBP#7oVWJu+Q6E>6vR2%?mtQ)Ld^* zA`ebOUT3_o*EJLkzuQNcMb-ug^ca392C$D&%QTslr;x}o=Xev#B+D=zX^d5W?YNa$e*$x1>w4~Jo9#^)`^ zit~vlYjlgi&uJ;%)VuQM2jP1ZGZJB-rM$%VFkC(i40xS1p01^dLXBvwLh&{760iZ= z`mgE$mZhtRk#|TuG^slS9S#0@M<;asp2i`=CBRhs5>O8NzL4TYv@LY%;y|4~HB87i zQV0yXdQU`7^N@S+>l-yzJ9>JYJcvFncYM?lvHKUrh=eP)bTRN8Bnll`isaAOr!MNw zRzuc1K!>m|4&+pdk%q357Og8oJ7F!@LQhkFK2e}3LF0kU?16U)C}Ft-jKRhu>(?{6 z?-bj}KXs5dVvjO2mGOj%@->@7rC^Xvv6s;~qcmd~eMlQ{Z%Doq^om`^Bmzw^3|~mx z!kr#I>QJ@(2bF45-^q6YKku%nR5!fl24AAxf-YG9>yIZ@KqlItZ#+;PrC;=Hh;ZQ> z3wZ3sSlHipmplCHxGYWFf-X6huMpCske25jY9D?!q?;1_be!+M^L~b34XX5xF-v08 zyro~}Q0{$by@^U&L~%8&g1?4e<((3dp7x{Y2d%sJk$Jy}T|`)aA1Sj;mzRAetn0b9 z-`Nc;&aeB%%A5^6N8y?FYP`Ci7qX!3uxSnBe{QK_=b1m_y3(%;dAV+n6Bz6IC+`xx z)g1dm8n+NXX)q^r3(>sA>TFm{jI_JLp`hu1rG?Zp#<6cgQP3;Fu}PX+g!ZZEL0&Nc z3DBDPj1KDFb`r9kO`paNq=BKbnm{%vK3T|Ogby#e5Rt#%(5m|>4XQ5SzY&kC;ZwXCiPY$$TdE`J zKhKr(Nbndt?f?wX!7*SGTRSP1fa~V++xEV%62gMbp+)^MAy<5oTUQgihT~L)Pa^Jw zDE{E0{LiODevN(gKMqxUUouZjaQThK$Dx{&%-r+Fwhs~Ir070$uCoiVjaD)K5cI#L zMB?9+_3PLY|Sxv3XB*B=aXP|J@!0 zyEbgcOUOlfw8rqM?XKb@Fuelx9#dsO&!H!qWd{}SLD3`<7N4;uZa_~DiP zol%`^r_?8j1d|&vMcF@+zE2=()af1t2sD_O6F27KVXJJI067|LHRv_$|yl z~s&pRqNN-gr;lTi}Uv}4R_sV>gcL&$yYHo;i$@qTHY?fYyAz9R}q z@qai8Fstq#Hg75sps_c?t(w6@E;b^9a-~3y_%(D3tkkba55L$EKX=u`7zl$dD%&SL z*5k#f*`RR=_!7apEK0ao(0&Q9*jX;!5lb%*U*KP;E&ePW3=Uf@f7y=p+RMAE8 zy9A@DDS`W>F~fiTalJx8<%>km4B0e!S4*;q&!&@n86z^mDm&eZr)o`eax8ZV{8%A) zwlvameIs+cOGE{?8xDzG17O=8Sq|3dhqa%z#gl9`SHPhg@8WrYUIDbWzibTqA0YP} zoTPc=`tRMTd3KZL9Ih0%C(x;21Zx6Ca1K1X!TF}zFT6qPpfsw?{zJ577Aqpa4e`)k zS1u|;+wAnYiyHVdOsiB+{%>gHz!!?cw{D12j6Gan${AAEfN9}`V#27b~`|5On zr{OI+x9ml37qCW79uAFs5{UH~aeAC$@N`kAHuq+ut1E}4mfY(bUrYRsC3m~tPqrtK zf#m^l2RRILH!a@)i`*icWrgm|G2TVjLRIzOu2^|%NwxabDr`)8U`w~O;f^(v`s)|> zd5n$vN4;qWO9KQcEf1fak8NR0)-Z-AeNWN`LJ?r$jtFl;tk*$Xc<#5ji=k z#El&i#Y<$sThGOn=npa9vc5ZX@UGUUx2Dw)jP+uQ5Pj(*oS?b_00Cg|m(w0j%tUrp zmjFZ3yl+))%|&jCx%|#4ZVz$mP{-;db7_xBRpe;vD5O7+wWxrQ8{P()7l97mo7sY# z$^Y>{dg{l3D|S|-^6oTJa>k4rSO&rD+lt;34gpachM zt>+fgC9$7JHzHzWX@_2Cx6MDhjc$BjDliatP>!E?xOCeq=t=(F+^04@kHPIYJXFBg z>@lbW1R!QI!{v86xur0$#dR0bRxabi-3+Sr=CgIwCHpIthVPr@*4=QbJEx_)N?*dz zkdrIi0PO|L7JS_>~-)?r>&&x)7r8*8WK{bLei0yWgL67~|fk0ShW zI1fTZMF>i_u*~1gVY8H`-x+)-=4c6Q-5!VAja0svY00q6?5p9kO`V*SvSxZC<3p&0 zg(iN|M!la~PAr$`>WVSZ6vwXf;8SYoTLLA1M|HD*a>rncqc)^x|KuK>6T6iW9&Nq3 zBpLF`Nk634kcFULM^K)#V3yt>@OfYB1Rf~J{`8`;>Yd%lajt|m;Zp;a4@vK(<|W;c zc<0I?0DbFLb;cskQ>V2GOKyt%qkNk8h=Jt3Z-u0iZdTd8CQ;q7 z?utj=%-^6CHg*(OlL+@>=R2z)I=4*!AW#lIY9u%u&g&gHPN47HX7~B{oT&a@?F&I8 zuCW!K+pb#1xcac%-<7DNP#a|Pb0GhZK*%-g9->1x`dv2WEI;v)7w<8?EDOma)$D0h z_1kh?=yFvoe2ko!EAQWLd>gb7CE$&mEu^uJu%dpaUp{C`5$0?vR=l>h)g$rna8bp= zn`WC1Yq^`%gzoMi5G6CnYFxa7AJS%1ISi8#G~+H)gcKw<(>4`;}?o2KlG zTQSqpdfI)}M|257QilZ{Qjn_RzUi{s8lEWZpnN{r^piPiA^R5z2g(xL=UOUz6K#%M z3kS`J7ARU%LF0zah#xau0PP<9%k31NFlfv)dyk>}H%#9@I*I%i= zoA!}V)C0{>;7qQRsd10)MMA0&we^Zx(NS-ZCQSRb6+jmkZwi>-yJsSq9ONocS+A&r z|M6AU8ijc;t>`VEa$Cp4SCm1Y1#HD0jySd@-CAvj4l9iTT9dk@Rp!m_@pPP-1!V0P+v(A8b7o6#{2=k z;VrgZS#Dl^-Hq~&pfn40cdqq{GtV>&QCDxRe7$RWTu=53)~+O6?nx>@T7v(2lLT#{4K zNYsesMcsM>aE1+yQRQ&9ADoU$FNnoh$eNm3)mv0)J)ZV+^)v{o-_Prj4r`oaT(0*K z3Mhd0AY+w?8PRXbJqF9uahs&~zt_$4#%WG|hQZsI83azWE?~agt81@yAW6fi9H&Z=WU$Sn(o5vWPyn0B% zzRE5Yq_;ahDocdaT$$W&@IF#Ph6psNV+i#K z#8wy+UVMy;=}!Wnqu=_gzT$Tr4{KHTj2++}A|rg7e3XRF0&Ix#SMpUD zf+%Nwu|g>q3wRV7K3K?KCNL~<4UYK(;NzCUp&ykZQ^Yfg4hE2?^&nve7C^M+F+1*s z6FqI+i{}gDg?$S5tt$-upNX}`uK{8nDy5Z$1(w{u5nmnEz4Nrdl6$F9YkyBy*PK}A zHor-lA2$o--czQdKm+?1{gWkBZ#58RLvAw3XFhh!GSB_=a3aFv{w6RTAmx~%Wd^19 zm%?URt{SbdR68q@PIXz>$FDS+{=(h9iaP2s_Ms$fXh&DhSW-SGL~%>eY=~#HAS>a{ zU~iI%QW>`dRD;_2=_SA_c*1|BzvrJmNu%k$Sc&w;BCxf8;_(d5~dPno({Tq)6Gv$UC0{>2~D$9(#ez&5bQk1&|l`9_-KGVf{3=Ke7qq<`9Hb)_Kl5!|8)n$GF8 zQxdAdn>HWbwsA%HO(D4(%*8F}^2`O<#PFT#c6hhaVqB(0@A%wsU_XANJ}_NT(N{{p z#hK0=n-OI>4zO#wO~!w)CUT4aV{N|9gw)JjW`0n~i6w3GA`d!%j&Ql=Ma*Kqe9e&a zYc2sx`pL~vXa3+&!E__`7q3F)AGT0)-A&A)z|j2oAyvC}$k&mQV>EK~&|x3wFTEy$Q5!j) zMH|ILD0CmS*)z8W5etP6se%L&CDIi>i%K&f2z1^RbLHvWCU0LlAs*X?2IZ_czKqg1 zQ;Q99V4-1oP!bsfJAS)@-lo#M0)7^WJw!MnNK(5jk{U(CWQ`s_>-&rkjQt1v6U`F^BO4%>Cq!`25@Z!5@LPp`?dkH_Hi^jbTYL3nIn%jHRei0wqXhYeZ%8n_<-_o7FQ)t~dt1kR`>!`8<^ zvk>U(isvg7M;b?mr(Osa|A52fxMyVlKkZ$2P?KAmrzog2r3gq>0;r)#uK^S(flC#U z7C<_LfDuATq$<)usR{}xy@X~+sDgAs5C{-Rs6n~`q)WTY?6#85XAz8x5!?IEiM*>^62hqHDUrbfA+yw2jj z@Cvs95YUV}d|>DJn2>gBqLEc&NYIfzJ5Xk9G`LtTvjnUjDUyun=xC79&UqUQbiz^Pn1gPgC7_)rMFFq97??85|?Eoai-yw z`lra)U;!<`Et+vvL_XRDGuh5LDn~zB`+n zD0L?Hfl2WXo@on#@^=L4%at5JrP-ril8w6Rl?cUeLx_lb!nKzEw|%AX(>onhR--km z;$EFxaxj^Dc$n}@Tf8xXN=I~~?$b}?-cBKyY+1Iw8qe15#|E)|_2p4hqt?)l?oVBz zccA4xeu=7K3{Rho$%pJii}pdVedUJ_YPT-Dkc!)S^8=y~iT3hrR4F9c@=kQnl)YIz z!~8nuLh!{w30ZMwAT+kv+3&t1&rFozU@CoWKQ#D{WX~VsgFhjJ{;oMiUf7@{Z+S;X z6p!yaYzo)>2NIu;DfpTun?A5aJM@DLFBQG10UUYKoVTB;`EhW&NsE8i?bQGAjDt1x zDz;dNUhq-}mFsfwH85qZQ4STn^~r}#^I?f}b+jf8O_k6(i|u}iJTm15oGCkYf+X@H zChY*(-r>ckt=bm$TQ|+^R6m)ulMHw6 z=VzwvCwMb12}!L%drM2K{VXjYtF^XCr(t^lMS-66-c7a$PAf%+&|#Oil)lFArAiK9S#$>G0J7pXX+T z$1$f+SLIC#(0yiSO;2wlpckwrQUzQ3`U!kteF*vbvv1St;3Y)NOHdCijonk5@@5@) zyf(fkXVi*KS07L3yb>pt80fbLJ<}`|Z4sVx7)MKiF#QoF%PdbYrPcON&1S(YqMyT|B6w>eP7t@xF%X*K%tiC}#VzR@NLG&NfJDc~LY7O0+Gh=Y%zQKr}lH5XW)xvWsIV)rtXJ?Z$}j zVeeZGuXQ~)PB37zJ0jKPCbb#BC!x_l=gbR(ncnm)5mW{9M4fbz3UMUSoWJy!L4Jb&@R;-7LCqWp=us8V2Fb(e3Il`OPPshH8soH+Cts8{-MY{4 zvBybtPFqgwD@tK1IzRczBdMPccNq3ZYaUy5>{g(s?A#96bUb15frKPovq(kz7%HV1 zpX_@YY#s**?-1qSyfHhiLM<3QI zV6{l6|BCr;MHa_bC$v7=3feF{aHKFVnT(?-c)ZKS8m(10wEIzxKFIc32MIi=-#~Ac z)f?tqf%45I1aAi}cbS|jo{P|U^9`|0_cUeHiaDpDLE5M137SU|Ar0#k4L&FAf$F#jiedCo440ij|^s0DhEV|7n%ZV=HNVCfqNEp_8b>o z!=4Txjn8J&>&2p{bFTP}`U( zz$f+>5I=5Q1bZ^LS1BELej3?CHWTt~60HXsQSW;TFwf5y-nlD7#izT}J6;)dGc`U= zO?<#hmdW$%i0|lTT&kA>29g|#L}br`;%%=?DEU3C>7+$vBWeO z*ED=KEWSJgMsQMFn9`w6#OF|KYVy}(u3Vjsz+AMwOM@-o+|#GmXbB0a1;NyC#*D^C=*^%iBef$blqr#)8nm&$GwfGeq6+3{}k8h)Uy;X@FyE)-= z_FHG1QkfFqS>va!$p0Sh{2Te#e}!Au9qY6&@M&#RBn`988lq^WTR)kK?YgMC66-H~ zQ>9hC(`#Iv&QPow2!!0=auH78Sxz{$1{ksRqDuDp$^{HF=vV>C;|(;FE0to3JG7ex z`!S1c2hHJ54c1YY6?3Pd*Dmtk(D-?0?uAcSO!FMHv{d|pO03HB7~lFxkBXz3-mni# zK6oNpXV!oYq+wT{>V>1$du+ICyH&)~ z%6RKHVmZH3ou}VMCo)fpyd_Vf^crF53JU7bus5fyTwI(za!%muP)(zqa7MsA6V9?T zMhw@Uj=V`sVR=Fhy@gq4U#@g3)F$NKvbDY=m_+IkU%bwB_Lfrj3F5;{gLSFo`SIHU zqImau1stuhczx(>;`1d2* znP@fd9iL9)Y|XI~db&_0rAEt;oQZ1T6`d=*!Pmn7f9C^>}$0R!or8TRf6aZ(AK5?3(UUY_$V zX+uL?fHzNp+F|;R1#Z+ZUy=%Uxl0W$;f93Wm)9wdC`WGfMZzfBTx&YU7s&Iq8sd>Q zXvlnlbKa=AaLz&vFbwmSYk&g#z-ZrxE`+4d?3uv>n)VX2{VFq$-Dq`;Pm|wSrC{sJ zGkv@r49C{1J}S)ZSM8w^pbTLAc9X_*fbIM!xl7#>pP!&%l-Bhk&)+n}%8sQ^K5ek6 z-Cq+tBB9k3|F$Ek8l4ZbNc?4n*{BY^n*SOtV(offN&8YA_l2>Uxn{Xj_3NTCGmcye zxmqD=v11|Vm#`v#O=-qi)E~s;LElV?trB6+kns258^Ee124PFMmMl= z2cJf4zktT=58sZb+~VpseZ(?r{o70okCAioRpcmDkT~Aj0$o8|Gz&_EZ`liiG`Ild zP;n@-ADuthLsAYhbw5;}o2S0HB zZuTQ1gJd>vq=G`gW`iVFjZ=3spJDvm=DO;-`$0DYW%-0UGaNlK0@Do}Ua6YaGqNJ3 zb(?rHs7lKNL`|)Azed*3xjCd5oyDv-^muhDfat5p4ZYqf->ZTOU9&3#Gu76<`y_gf zh|?O?4Pk)#JPj3?z6&tvIqq$N&^fh{e2sHoit=BD<~St^KE6)PtzN*{SCW*+ldghy?lwGC- zy0h&v~t5G`auwzPYDJo<6kEiY#7c*`bDrBtL=atDu0Ntl?GKzN{)$1*b;%-Depz5%J)^1kY?st zK)h^|thM`r{5yC~s~%{M<})S>-jLMfMgt6z)PXr;Vk4fzq<^JCjHbic?Aw2(>WpbC zbU17Iw2l8N{)x3?5M54sTFl2^h72~l9k#vK9jjIk@HGO|xBW)?PasNGIY5IsLccP$1aNEXJPcjos$_Xl)+geM}&vK)Si3cC0Sq-&((=Kr?JIsW;l|_9Wxn(|sDlR9r zXR!x(z5CcYIc9ib$$EW-#ih$+f6Mxcd}gse+Nd1Lz^=e_4i`=onYxy!l3-mY63XK| z8~c1%u$drdDW`<~{M#+FwDea|C}Y)=ciAL+Ru#UDw$4Ol)7XM2ai%r_!7h_< zk2f_R1m=vqO{}bh<9G8<(`rUBQI0|ZRU4B7!?VM3@%MMQ zDPfma=g%ccBe8=cRh`iH|F(gOLkfr@8vx>;OppQ8u=v%iQV8NCnH`$5xj zoC{l!wH#aNu%I1w@MxxUSjaI;q1|B6Y{3dbms1M=gY;yXumxEVp`3VOZIEEUU2b(eff zQ4Xi(4F`3c+6n%QAn{RNjMx^fI7_dcQ=AR``bTij3ey{I5!@$ zT`+vrdbrcUrArixWTRN6w(J)g43#}GqI*|DYCmv!pQY8?%x_jAopA1(6OE!QbwfFn zfV`aR4eF@=7_(Y!i5H%I93ZCNFjTDy_97aL;G%smYpQPMnYN%eA#{oYiA^p`yIBBv zwh4DliZUP)*7Uq+JkX(2npw>lMf)q&Dsf}+8AZq%qD`LKotzUUSJu{U3E><&%~
|eHzi9RU2gFOH5 RLSz5Ae*Y)ekM`H`e*qK21Fir7 literal 37018 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 CZi=k{ diff --git a/assets/swe_bench_lite.svg b/assets/swe_bench_lite.svg index 4da3fc0fd..8cf899025 100644 --- a/assets/swe_bench_lite.svg +++ b/assets/swe_bench_lite.svg @@ -1,12 +1,12 @@ - + - 2024-05-22T15:20:34.149598 + 2024-05-22T15:32:35.955951 image/svg+xml @@ -21,8 +21,8 @@ - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -884,7 +884,7 @@ z - + - + - - + - + - + - + - + - + - + - + - + - + - + @@ -1077,18 +1077,18 @@ L 690 177.293138 - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - + - + - - - @@ -1314,56 +1259,56 @@ L 690 50.4 " style="fill: none; stroke: #dddddd; stroke-width: 0.5; stroke-linejoin: miter; stroke-linecap: square"/> - +" clip-path="url(#p9518afeb13)" style="fill: #b3e6a8; opacity: 0.75"/> - +" clip-path="url(#p9518afeb13)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p9518afeb13)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p9518afeb13)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p9518afeb13)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p9518afeb13)" style="fill: #b3d1e6; opacity: 0.75"/> - + - + - + - + + + + @@ -1420,9 +1401,9 @@ z - + - + @@ -1430,9 +1411,9 @@ z - + - + @@ -1440,9 +1421,9 @@ z - + - + - + - + - + - + - + + diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index c3f11006a..f318bb74b 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -21,8 +21,9 @@ def plot_swe_bench_lite(data_file): plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" + font_color = "#555" rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) - plt.rcParams["text.color"] = "#555" + plt.rcParams["text.color"] = font_color fig, ax = plt.subplots(figsize=(10, 5)) ax.grid(axis="y", zorder=0, lw=0.2) @@ -37,24 +38,24 @@ def plot_swe_bench_lite(data_file): yval = bar.get_height() ax.text( bar.get_x() + bar.get_width() / 2, - yval + 0.5, + yval - 1.5, f"{yval}%", ha="center", - va="bottom", - fontsize=12, - alpha=0.75, + va="top", + fontsize=14, + # alpha=0.75, ) # ax.set_xlabel("Models", fontsize=18) - ax.set_ylabel("Pass rate (%)", fontsize=18, color="#555") + ax.set_ylabel("Pass rate (%)", fontsize=18, color=font_color) ax.set_title("SWE Bench Lite", fontsize=20) - ax.set_ylim(0, 30) - plt.xticks(rotation=45, ha="right", fontsize=16) + ax.set_ylim(0, 29) + plt.xticks(rotation=45, ha="right", fontsize=16, color=font_color) plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") imgcat(fig) - ax.xaxis.label.set_color("#555") + ax.xaxis.label.set_color(font_color) # Example usage From b67891e7f8b0f9cab97c9d5aadcadabedad8a233 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 15:56:11 -0700 Subject: [PATCH 18/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 77 +++++++++++++---------------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index f9d203ada..1999a5d53 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -10,7 +10,7 @@ draft: true Aider scored 26.3% on the [SWE Bench Lite benchmark](https://www.swebench.com), achieving a state of the art result. -The current top leaderboard entry is 20.33% +The current top leaderboard entry is 20.3% from Amazon Q Developer Agent. The best result reported elsewhere online seems to be [22.3% from AutoCodeRover](https://github.com/nus-apr/auto-code-rover). @@ -31,12 +31,13 @@ etc. Aider is first and foremost a tool for engineers to get real work done in real code bases through a pair programming chat style interface. +When a user asks aider for a change, they see the edits performed in real-time +and aider may also then offer additional +help like fixing lint or test errors. In normal use, the user is in full interactive control. This lets them quickly steer misunderstandings back on course and avoid wasted time, code reviews and token costs. -When a user asks aider for a change, they see the edits performed in real-time. -Aider may also then offer additional -help like fixing lint or test errors. + ## Methodology @@ -46,29 +47,21 @@ with the problem statement submitted as the opening chat message from "the user". After that aider runs as normal, with the following modifications: -- Aider's suggestions were always accepted. -When chatting, aider will suggest which files in the repo may need to be edited based on -the conversation. -It will offer to lint code that has been edited, -and to fix any issues uncovered. -Aider has workflows to run the repo's test suite and resolve failing tests. -Normally the user is asked to approved such suggestions, but -they were always accepted during the benchmark. +- Aider's suggestions were always accepted without user approval. - A simple harness was used to retry the SWE Bench problem if aider produced code which wasn't *plausibly correct*. -Plausible means that aider successfully edited the repo without breaking anything. -As mentioned, aider has integrated support for linting and testing, -so the harness just looks at aider's completion status to see if those -operations finished clean. -Note that *aider only had access to the pre-existing tests in the repo*, -not the held out "acceptance tests" that are used later to see if the -SWE Bench problem was correctly resolved. -- If the solution isn't plausible, the harness launches aider to try again from scratch. -The harness alternates between running aider with GPT-4o and Opus up to three times each, -until it finds a plausible solution. -- If no plausible solution is found, the harness picks the solution +Plausibly correct means that aider concluded that it had successfully edited the repo +without causing syntax errors or breaking any *pre-existing* tests. +- If the solution isn't plausible, the harness launches aider to try again from scratch +alternating between using aider with GPT-4o and Opus. +- If no plausible solution is found after six tries, the harness picks the solution with the least amount of edit/lint/test problems. -This is all roughly equivalent to a user: +It's important to be clear that during benchmarking +*aider only had access to the pre-existing tests in the repo*. +It could not see or run the held out "acceptance tests" that are used later to see if the +SWE Bench problem was correctly resolved. + +The benchmarking process can be thought of as similar to a user: - Launching aider in their repo with the something like command below, which tells aider to say yes to every suggestion and use pytest to run tests. @@ -77,7 +70,7 @@ tells aider to say yes to every suggestion and use pytest to run tests. - `/web https://github.com/django/django/issues/XXX` - If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again. Maybe with a different LLM this time. [Aider is tightly integrated with git](https://aider.chat/docs/faq.html#how-does-aider-use-git), -so it's always easy to undo/revert AI changes that don't pan out. +so it's always easy to revert AI changes that don't pan out. Of course, outside a benchmark setting it's probably unwise to let *any* AI agent run unsupervised on your code base. @@ -93,7 +86,7 @@ Running the entire SWE Bench Lite benchmark using aider with just GPT-4o achieved a score of 25%. This was itself a state of the art result, before being surpassed by the main result being reported here -that uses aider with both GPT-4o & Opus. +that used aider with both GPT-4o & Opus. ## GPT-4o vs Opus @@ -102,36 +95,36 @@ The harness proceeded in a fixed order, always starting with GPT-4o and then alternating with Opus until a plausible solution was found. The table below breaks down the 79 solutions which were ultimately -verified as correctly resolving their task. +verified as correctly resolving their issue. Some noteworthy observations: - Aider with GPT-4o immediately found 77% of the valid solutions on the first attempt. - ~90% of valid solutions were found after one attempt from aider with GPT-4o and Opus. -- A long tail of solutions continued to be found by both models including on the final, 6th attempt. +- A long tail of solutions continued to be found by both models including one on the final, sixth attempt of that problem. -| Attempt | Model | Number
resolved | Percent
of resolved | Cumulative
percent of
resolved | +| Attempt | Agent | Number
resolved | Percent
of resolved | Cumulative
percent of
resolved | |:--------:|------------|---------:|---------:|----:| -| 1 | GPT-4o | 61 | 77.2 | 77.2 -| 2 | Opus | 10 | 12.7 | 89.9 -| 3 | GPT-4o | 3 | 3.8 | 93.7 -| 4 | Opus | 2 | 2.5 | 96.2 -| 5 | GPT-4o | 2 | 2.5 | 98.7 -| 6 | Opus | 1 | 1.3 | 100.0 +| 1 | Aider with GPT-4o | 61 | 77.2 | 77.2 +| 2 | Aider with Opus | 10 | 12.7 | 89.9 +| 3 | Aider with GPT-4o | 3 | 3.8 | 93.7 +| 4 | Aider with Opus | 2 | 2.5 | 96.2 +| 5 | Aider with GPT-4o | 2 | 2.5 | 98.7 +| 6 | Aider with Opus | 1 | 1.3 | 100.0 |**Total**| | **79** | **100%** | **100%** | If we breakdown correct solutions purely by model, we can see that GPT-4o dominates. -This isn't a fair comparison, because GPT-4o always took the first -attempt at solving. -But anecdotal evidence from early runs of the benchmark -supports the observation that GPT-4o is significantly stronger than Opus +This isn't a fair and direct comparison, because GPT-4o always took the first +turn at solving. +But anecdotal evidence from earlier runs of the benchmark +supports the observation that aider with GPT-4o is significantly stronger than Opus for this endeavor. -| Model | Number resolved | Percent of resolved | +| Agent | Number resolved | Percent of resolved | |------------|---------:|---------:| -| GPT-4o | 66 | 83.5 | -| Opus | 13 | 16.5 | +| Aider with GPT-4o | 66 | 83.5 | +| Aider with Opus | 13 | 16.5 | |**Total**| **79** | **100%** | From 5b8bbdbe5f9cc62b58da61307d272ef43f65a288 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 16:08:51 -0700 Subject: [PATCH 19/53] copy --- assets/swe_bench_lite.jpg | Bin 32286 -> 35893 bytes assets/swe_bench_lite.svg | 759 ++++++++++++++++++++++---------------- 2 files changed, 434 insertions(+), 325 deletions(-) diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index ff8b1e36622d2031a7c4b29cbabd7797f3e57fbb..da1492d83b1d6fc3b7d782f8453af6b1fee9fb97 100644 GIT binary patch literal 35893 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 literal 32286 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
|eHzi9RU2gFOH5 RLSz5Ae*Y)ekM`H`e*qK21Fir7 diff --git a/assets/swe_bench_lite.svg b/assets/swe_bench_lite.svg index 8cf899025..5d5f620e4 100644 --- a/assets/swe_bench_lite.svg +++ b/assets/swe_bench_lite.svg @@ -6,7 +6,7 @@ - 2024-05-22T15:32:35.955951 + 2024-05-22T15:45:26.770357 image/svg+xml @@ -41,17 +41,17 @@ z - - + - + - - - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - + - + - - - + + - + - + - + - - + - + - + + - + - + - + - @@ -756,7 +963,7 @@ z - + - - - - @@ -864,15 +991,15 @@ z - - + + - + - + - + @@ -884,43 +1011,7 @@ z - - - - + @@ -933,22 +1024,22 @@ z - + +" clip-path="url(#p6db1ba36ab)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + - - + - + @@ -979,17 +1070,17 @@ z - + +" clip-path="url(#p6db1ba36ab)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + - + - + @@ -1025,17 +1116,17 @@ z - + +" clip-path="url(#p6db1ba36ab)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + - + - + @@ -1057,17 +1148,17 @@ z - + +" clip-path="url(#p6db1ba36ab)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + - + - + @@ -1076,17 +1167,17 @@ L 690 138.158892 - + +" clip-path="url(#p6db1ba36ab)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + - + - + @@ -1122,17 +1213,17 @@ z - + +" clip-path="url(#p6db1ba36ab)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + - + - + @@ -1140,7 +1231,7 @@ L 690 75.473969 - + @@ -1260,55 +1351,63 @@ L 690 50.4 +" clip-path="url(#p6db1ba36ab)" style="fill: #b3e6a8; opacity: 0.75"/> - +" clip-path="url(#p6db1ba36ab)" style="fill: #b3e6a8; opacity: 0.75"/> - +" clip-path="url(#p6db1ba36ab)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p6db1ba36ab)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p6db1ba36ab)" style="fill: #b3d1e6; opacity: 0.75"/> - + + + +" clip-path="url(#p6db1ba36ab)" style="fill: #b3d1e6; opacity: 0.75"/> - + - + - + + + + + + + + + + + - + - + - + @@ -1411,9 +1520,9 @@ z - + - + @@ -1421,9 +1530,9 @@ z - + - + - + - + - + @@ -1606,7 +1715,7 @@ z - + From 71ddb2799fabea5b45d5f5a83c1083baeb97c71b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 16:11:17 -0700 Subject: [PATCH 20/53] aider: Aider achieved a state-of-the-art result on the SWE Bench Lite benchmark, with improvements in code editing, linting, and testing processes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Aider chat conversation: USER: proofread this and make corrections. don't change style, but fix problems. ASSISTANT: _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Aider scored 26.3% on the [SWE Bench Lite benchmark](https://www.swebench.com), achieving a state of the art result. The current top leaderboard entry is 20.3% from Amazon Q Developer Agent. The best result reported elsewhere online seems to be ======= Aider scored 26.3% on the [SWE Bench Lite benchmark](https://www.swebench.com), achieving a state-of-the-art result. The current top leaderboard entry is 20.3% from Amazon Q Developer Agent. The best result reported elsewhere online seems to be >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Aider achieved this result mainly through its focus on static code analysis, reliable LLM code editing and pragmatic workflows for interactive pair programming with AI. Aider intentionally has quite limited and narrow "agentic behavior": it doesn't require a highly detailed upfront "spec" from ^C KeyboardInterrupt USER: don't fix formatting like that. linebreaks are fine. it will render properly. ASSISTANT: Understood. I will only fix grammatical and spelling errors without changing the formatting. _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Aider scored 26.3% on the [SWE Bench Lite benchmark](https://www.swebench.com), achieving a state of the art result. The current top leaderboard entry is 20.3% from Amazon Q Developer Agent. The best result reported elsewhere online seems to be [22.3% from AutoCodeRover](https://github.com/nus-apr/auto-code-rover). ======= Aider scored 26.3% on the [SWE Bench Lite benchmark](https://www.swebench.com), achieving a state-of-the-art result. The current top leaderboard entry is 20.3% from Amazon Q Developer Agent. The best result reported elsewhere online seems to be [22.3% from AutoCodeRover](https://github.com/nus-apr/auto-code-rover). >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Aider achieved this result mainly through its focus on static code analysis, reliable LLM code editing and pragmatic workflows for interactive pair programming with AI. Aider intentionally has quite limited and narrow "agentic behavior": it doesn't require a highly detailed upfront "spec" from the user, use RAG or vector search, farm out sub-problems to an army of LLMs, allow the LLM to use tools or perform web searches, ======= Aider achieved this result mainly through its focus on static code analysis, reliable LLM code editing, and pragmatic workflows for interactive pair programming with AI. Aider intentionally has quite limited and narrow "agentic behavior": it doesn't require a highly detailed upfront "spec" from the user, use RAG or vector search, farm out sub-problems to an army of LLMs, allow the LLM to use tools, or perform web searches, >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH When a user asks aider for a change, they see the edits performed in real-time and aider may also then offer additional help like fixing lint or test errors. In normal use, the user is in full interactive control. This lets them quickly steer misunderstandings back on course and ======= When a user asks aider for a change, they see the edits performed in real-time, and aider may also then offer additional help like fixing lint or test errors. In normal use, the user is in full interactive control. This lets them quickly steer misunderstandings back on course and >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH For the benchmark, aider was launched in each problem's git repository with the problem statement submitted as the opening chat message from "the user". After that aider runs as normal, with the following modifications: ======= For the benchmark, aider was launched in each problem's git repository with the problem statement submitted as the opening chat message from "the user." After that aider runs as normal, with the following modifications: >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH - A simple harness was used to retry the SWE Bench problem if aider produced code which wasn't *plausibly correct*. ======= - A simple harness was used to retry the SWE Bench problem if aider produced code that wasn't *plausibly correct*. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH - If the solution isn't plausible, the harness launches aider to try again from scratch ======= - If the solution isn't plausible, the harness launches aider to try again from scratch, >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH - If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again. Maybe with a different LLM this time. ======= - If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again, maybe with a different LLM this time. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Of course, outside a benchmark setting it's probably ======= Of course, outside a benchmark setting, it's probably >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Running the entire SWE Bench Lite benchmark using aider with just GPT-4o achieved a score of 25%. This was itself a state of the art result, before being surpassed by the main result being reported here that used aider with both GPT-4o & Opus. ======= Running the entire SWE Bench Lite benchmark using aider with just GPT-4o achieved a score of 25%. This was itself a state-of-the-art result, before being surpassed by the main result being reported here that used aider with both GPT-4o & Opus. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH The table below breaks down the 79 solutions which were ultimately ======= The table below breaks down the 79 solutions that were ultimately >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH - Aider with GPT-4o immediately found 77% of the valid solutions on the first attempt. ======= - Aider with GPT-4o immediately found 77% of the valid solutions on the first attempt. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH If we breakdown correct solutions purely by model, ======= If we break down correct solutions purely by model, >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Aider instead uses a [repository map](https://aider.chat/2023/10/22/repomap.html) to help the LLM understand the layout, code structure and content of a git repo. The repo map is created from the code's AST and call graph to provide a compact and powerful summary of the entire code base. The map is constantly tailored to show repo context that is relevant to the current state of the chat conversation. This is done by performing a graph optimization on the code's call graph. ======= Aider instead uses a [repository map](https://aider.chat/2023/10/22/repomap.html) to help the LLM understand the layout, code structure, and content of a git repo. The repo map is created from the code's AST and call graph to provide a compact and powerful summary of the entire code base. The map is constantly tailored to show repo context that is relevant to the current state of the chat conversation. This is done by performing a graph optimization on the code's call graph. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH When the user asks for a change to their code, the LLM uses the repo map to decide which files to edit. The LLM simply returns a normal text response explaining which files it needs to edit and why. Aider notices when the LLM mentions filenames from the repo, and asks the user if they should be added to the chat. Adding a file to the chat allows the LLM to see the full contents of the file and edit it. ======= When the user asks for a change to their code, the LLM uses the repo map to decide which files to edit. The LLM simply returns a normal text response explaining which files it needs to edit and why. Aider notices when the LLM mentions filenames from the repo, and asks the user if they should be added to the chat. Adding a file to the chat allows the LLM to see the full contents of the file and edit it. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Aider has always had a deep focus on ensuring that LLMs can not just write code, but reliably *edit* code. Aider a collection of prompting strategies and code editing backends which have ======= Aider has always had a deep focus on ensuring that LLMs can not just write code, but reliably *edit* code. Aider has a collection of prompting strategies and code editing backends which have >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH [Aider lints code]() after every LLM edit, and offers to automatically fix ======= [Aider lints code](https://aider.chat/docs/linting/) after every LLM edit and offers to automatically fix >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Aider includes basic linters built with tree-sitter that support ======= Aider includes basic linters built with tree-sitter that supports >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH This context increases the ability of the LLM to understand the problem and ======= This context increases the ability of the LLM to understand the problem and >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH A user working on a python project might do that by launching ======= A user working on a Python project might do that by launching >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH The repositories that are used in the SWE Bench problems are large open ======= The repositories that are used in the SWE Bench problems are large, open >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH A repo's test suite can be run in three ways: ======= A repo's test suite can be run in three ways: >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH 2. Run tests after aider has modified the repo. ======= 2. Run tests after aider has modified the repo. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH 3. Run the final "acceptance tests" to judge if the coding agent has ======= 3. Run the final "acceptance tests" to judge if the coding agent has >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH For the benchmark, aider is configured with a test command that will run the tests ======= For the benchmark, aider is configured with a test command that will run the tests >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH When aider runs a test command, it checks for a non-zero exit status. ======= When aider runs a test command, it checks for a non-zero exit status. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH To be clear, *aider can not run or even see the "acceptance tests"* from the `test_patch` ======= To be clear, *aider cannot run or even see the "acceptance tests"* from the `test_patch` >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH As aider executes, it notes the outcome of the editing, linting and testing steps. When aider completes, it returns their final status as either: succeeded with no errors remaining, or ended without resolving all errors. ======= As aider executes, it notes the outcome of the editing, linting, and testing steps. When aider completes, it returns its final status as either: succeeded with no errors remaining, or ended without resolving all errors. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH The benchmark harness uses these outcomes to determine if it has a plausible solution to the current SWE Bench task. A plausible solution is one where aider returns saying that it edited the repo with no outstanding edit, lint or test errors. ======= The benchmark harness uses these outcomes to determine if it has a plausible solution to the current SWE Bench task. A plausible solution is one where aider returns saying that it edited the repo with no outstanding edit, lint, or test errors. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH If the solution is not plausible, another instance of aider is launched again from scratch on the same problem. ======= If the solution is not plausible, another instance of aider is launched again from scratch on the same problem. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH It's worth noting that repositories may have lint or test errors present before aider even starts to edit them. Whether errors are caused by aider or were pre-existing, there will be instances where, after six tries, no plausible solution is obtained. ======= It's worth noting that repositories may have lint or test errors present before aider even starts to edit them. Whether errors are caused by aider or were pre-existing, there will be instances where, after six tries, no plausible solution is obtained. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH If all six attempts fail to produce a plausible solution, then the "best" solution available is selected as a the ======= If all six attempts fail to produce a plausible solution, then the "best" solution available is selected as the >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Which of the non-plausible solutions to use is determined ======= Which of the non-plausible solutions to use is determined >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH The benchmark harness produces one "best" solution for each of the 300 SWE Bench Lite instances, and saves it as a `model_patch`. A separate evaluation script uses the SWE Bench support code to test each of these results with the acceptance tests. ======= The benchmark harness produces one "best" solution for each of the 300 SWE Bench Lite instances and saves it as a `model_patch`. A separate evaluation script uses the SWE Bench support code to test each of these results with the acceptance tests. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH These `test_patch` acceptance tests are only ever run outside of aider and the benchmark harness, and only to compute the number of correctly resolved instances. They are never run, used or even visible during the attempts to solve the problems. ======= These `test_patch` acceptance tests are only ever run outside of aider and the benchmark harness, and only to compute the number of correctly resolved instances. They are never run, used, or even visible during the attempts to solve the problems. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Aider correctly resolved 79 out of 300 SWE Bench Lite instances, or 26.3%. ======= Aider correctly resolved 79 out of 300 SWE Bench Lite instances, or 26.3%. >>>>>>> REPLACE _posts/2024-05-22-swe-bench-lite.md markdown <<<<<<< SEARCH Much thanks to the team behind the [SWE Bench](https://www.swebench.com) family of AI coding benchmarks. Also thanks to Albert Örwall who has [dockerized the SWE Bench evaluation scripts](SWE-bench-docker) making it faster, easier and more reliable to run the acceptance tests. ======= Much thanks to the team behind the [SWE Bench](https://www.swebench.com) family of AI coding benchmarks. Also thanks to Albert Örwall who has [dockerized the SWE Bench evaluation scripts](SWE-bench-docker) making it faster, easier, and more reliable to run the acceptance tests. >>>>>>> REPLACE --- _posts/2024-05-22-swe-bench-lite.md | 58 ++++++++++++++--------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 1999a5d53..0344b51af 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -9,7 +9,7 @@ draft: true Aider scored 26.3% on the -[SWE Bench Lite benchmark](https://www.swebench.com), achieving a state of the art result. +[SWE Bench Lite benchmark](https://www.swebench.com), achieving a state-of-the-art result. The current top leaderboard entry is 20.3% from Amazon Q Developer Agent. The best result reported elsewhere online seems to be @@ -20,18 +20,18 @@ The best result reported elsewhere online seems to be ## Interactive, not agentic Aider achieved this result mainly through its focus on static code analysis, -reliable LLM code editing +reliable LLM code editing, and pragmatic workflows for interactive pair programming with AI. Aider intentionally has quite limited and narrow "agentic behavior": it doesn't require a highly detailed upfront "spec" from the user, use RAG or vector search, farm out sub-problems to an army of LLMs, -allow the LLM to use tools -or perform web searches, +allow the LLM to use tools, +or perform web searches, etc. Aider is first and foremost a tool for engineers to get real work done in real code bases through a pair programming chat style interface. -When a user asks aider for a change, they see the edits performed in real-time +When a user asks aider for a change, they see the edits performed in real-time, and aider may also then offer additional help like fixing lint or test errors. In normal use, the user is in full interactive control. @@ -44,14 +44,14 @@ avoid wasted time, code reviews and token costs. For the benchmark, aider was launched in each problem's git repository with the problem statement -submitted as the opening chat message from "the user". +submitted as the opening chat message from "the user." After that aider runs as normal, with the following modifications: - Aider's suggestions were always accepted without user approval. -- A simple harness was used to retry the SWE Bench problem if aider produced code which wasn't *plausibly correct*. +- A simple harness was used to retry the SWE Bench problem if aider produced code that wasn't *plausibly correct*. Plausibly correct means that aider concluded that it had successfully edited the repo without causing syntax errors or breaking any *pre-existing* tests. -- If the solution isn't plausible, the harness launches aider to try again from scratch +- If the solution isn't plausible, the harness launches aider to try again from scratch, alternating between using aider with GPT-4o and Opus. - If no plausible solution is found after six tries, the harness picks the solution with the least amount of edit/lint/test problems. @@ -68,11 +68,11 @@ tells aider to say yes to every suggestion and use pytest to run tests. - `aider --yes --test-cmd pytest` - Pasting the text of a GitHub issue into the chat, or adding it via URL with a command in the chat like: - `/web https://github.com/django/django/issues/XXX` -- If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again. Maybe with a different LLM this time. +- If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again, maybe with a different LLM this time. [Aider is tightly integrated with git](https://aider.chat/docs/faq.html#how-does-aider-use-git), so it's always easy to revert AI changes that don't pan out. -Of course, outside a benchmark setting it's probably +Of course, outside a benchmark setting, it's probably unwise to let *any* AI agent run unsupervised on your code base. Aider is intended to be used as an interactive pair-programming chat, where the user participates to direct aider's work and approve suggestions. @@ -84,7 +84,7 @@ or if the AI starts going down a wrong path. Running the entire SWE Bench Lite benchmark using aider with just GPT-4o achieved a score of 25%. -This was itself a state of the art result, before being surpassed by the main +This was itself a state-of-the-art result, before being surpassed by the main result being reported here that used aider with both GPT-4o & Opus. @@ -94,7 +94,7 @@ The benchmark harness alternated between running aider with GPT-4o and Opus. The harness proceeded in a fixed order, always starting with GPT-4o and then alternating with Opus until a plausible solution was found. -The table below breaks down the 79 solutions which were ultimately +The table below breaks down the 79 solutions that were ultimately verified as correctly resolving their issue. Some noteworthy observations: @@ -113,7 +113,7 @@ Some noteworthy observations: | 6 | Aider with Opus | 1 | 1.3 | 100.0 |**Total**| | **79** | **100%** | **100%** | -If we breakdown correct solutions purely by model, +If we break down correct solutions purely by model, we can see that GPT-4o dominates. This isn't a fair and direct comparison, because GPT-4o always took the first turn at solving. @@ -139,7 +139,7 @@ tools to interactively explore the code base. Aider instead uses a [repository map](https://aider.chat/2023/10/22/repomap.html) to help the LLM understand the -layout, code structure and content of a git repo. +layout, code structure, and content of a git repo. The repo map is created from the code's AST and call graph to provide a compact and powerful summary of the entire code base. The map is constantly @@ -185,9 +185,9 @@ They were only used to compute this statistic after the benchmarking was complet Once files have been selected for editing, the next step is of course to edit the source code to fix the problem. -Aider has always had a deep focus on ensuring that LLMs can not just write code, +Aider has always had a deep focus on ensuring that LLMs can not just write code, but reliably *edit* code. -Aider a collection of prompting strategies and code editing backends which have +Aider has a collection of prompting strategies and code editing backends which have been honed through [extensive benchmarking](https://aider.chat/docs/leaderboards/). These foundational capabilities help ensure that the LLM can not only code up a solution but @@ -200,10 +200,10 @@ respected when new code is added. ## Linting and fixing -[Aider lints code]() -after every LLM edit, and offers to automatically fix +[Aider lints code](https://aider.chat/docs/linting/) +after every LLM edit and offers to automatically fix any linting errors. -Aider includes basic linters built with tree-sitter that support +Aider includes basic linters built with tree-sitter that supports [most popular programming languages](https://github.com/paul-gauthier/grep-ast/blob/main/grep_ast/parsers.py). These built in linters will detect syntax errors and other fatal problems with the code. @@ -258,14 +258,14 @@ make the correct changes to resolve it. ## Testing and fixing Aider can be configured with the command needed to run tests for a repo. -A user working on a python project might do that by launching +A user working on a Python project might do that by launching aider like this: ``` aider --test-cmd pytest ``` -The repositories that are used in the SWE Bench problems are large open +The repositories that are used in the SWE Bench problems are large, open source projects with extensive existing test suites. A repo's test suite can be run in three ways: @@ -291,7 +291,7 @@ aider will automatically share the test output with the LLM and ask it to try and resolve the test failures. -To be clear, *aider can not run or even see the "acceptance tests"* from the `test_patch` +To be clear, *aider cannot run or even see the "acceptance tests"* from the `test_patch` as described in (3). Those tests are only run outside of aider and the benchmark harness, to compute the final benchmark score. @@ -300,9 +300,9 @@ to compute the final benchmark score. ## Finding a plausible solution -As aider executes, it notes the outcome of the editing, linting and testing +As aider executes, it notes the outcome of the editing, linting, and testing steps. -When aider completes, it returns their final status as either: +When aider completes, it returns its final status as either: succeeded with no errors remaining, or ended without resolving all errors. @@ -311,7 +311,7 @@ solution to the current SWE Bench task. A plausible solution is one where aider returns saying that it edited the repo with no outstanding -edit, lint or test errors. +edit, lint, or test errors. In this case, aider's changes are taken as the proposed solution and recorded as the SWE Bench `model_patch` to be evaluated later with the `test_patch` "acceptance tests". @@ -326,7 +326,7 @@ harness moves on to the next SWE Bench instance. It's worth noting that repositories may have lint or test errors present before aider even starts to edit them. Whether errors are caused by aider or were pre-existing, there will be instances where, after six tries, no plausible solution is obtained. If all six attempts fail to produce a plausible solution, -then the "best" solution available is selected as a the +then the "best" solution available is selected as the `model_patch`. Which of the non-plausible solutions to use is determined by ignoring the testing outcome @@ -340,14 +340,14 @@ and prioritizing solutions in the following order: ## Computing the benchmark score The benchmark harness produces one "best" solution for each of the 300 -SWE Bench Lite instances, and saves it as a `model_patch`. +SWE Bench Lite instances and saves it as a `model_patch`. A separate evaluation script uses the SWE Bench support code to test each of these results with the acceptance tests. These `test_patch` acceptance tests are only ever run outside of aider and the benchmark harness, and only to compute the number of correctly resolved instances. -They are never run, used or even visible during the attempts to solve the problems. +They are never run, used, or even visible during the attempts to solve the problems. Aider correctly resolved 79 out of 300 SWE Bench Lite instances, or 26.3%. @@ -358,6 +358,6 @@ Much thanks to the team behind the family of AI coding benchmarks. Also thanks to Albert Örwall who has [dockerized the SWE Bench evaluation scripts](SWE-bench-docker) -making it faster, easier and more reliable to run the acceptance tests. +making it faster, easier, and more reliable to run the acceptance tests. From d437be5bc1954d8575e1cbe8e8cb4cd5f0067e1c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 16:14:19 -0700 Subject: [PATCH 21/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 0344b51af..e7af45bc4 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -200,7 +200,7 @@ respected when new code is added. ## Linting and fixing -[Aider lints code](https://aider.chat/docs/linting/) +[Aider lints code](https://aider.chat/2024/05/22/linting.html) after every LLM edit and offers to automatically fix any linting errors. Aider includes basic linters built with tree-sitter that supports @@ -258,7 +258,7 @@ make the correct changes to resolve it. ## Testing and fixing Aider can be configured with the command needed to run tests for a repo. -A user working on a Python project might do that by launching +A user working on a python project might do that by launching aider like this: ``` From 18e3f55c4ed3ef0d8f781938deb8719dca50542b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 17:18:59 -0700 Subject: [PATCH 22/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index e7af45bc4..d67af98c8 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -273,12 +273,12 @@ A repo's test suite can be run in three ways: 2. Run tests after aider has modified the repo. So the pre-existing test cases are still present, but may have been modified by aider. Aider may have also added new tests. -3. Run the final "acceptance tests" to judge if the coding agent has +3. Run the final "acceptance tests" to judge if aider has successfully resolved the problem. SWE Bench verifies both pre-existing tests and a set of held out acceptance tests (from the so called `test_patch`) to check that the issue is properly resolved. During this final acceptance testing, -any aider edits to tests are discard to ensure a faithful test of whether the +any aider edits to tests are discarded to ensure a faithful test of whether the issue was resolved. For the benchmark, aider is configured with a test command that will run the tests From 5e13399f46b14619b2b9b2620db97efe2b56a71e Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 18:26:04 -0700 Subject: [PATCH 23/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 74 +++++++++++++++-------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index d67af98c8..fd0bf04b3 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -39,7 +39,7 @@ This lets them quickly steer misunderstandings back on course and avoid wasted time, code reviews and token costs. -## Methodology +## Benchmark methodology For the benchmark, aider was launched in each problem's git repository @@ -61,18 +61,18 @@ It's important to be clear that during benchmarking It could not see or run the held out "acceptance tests" that are used later to see if the SWE Bench problem was correctly resolved. -The benchmarking process can be thought of as similar to a user: +The benchmarking process was similar to a user employing aider like this: - Launching aider in their repo with the something like command below, which tells aider to say yes to every suggestion and use pytest to run tests. - `aider --yes --test-cmd pytest` - Pasting the text of a GitHub issue into the chat, or adding it via URL with a command in the chat like: - `/web https://github.com/django/django/issues/XXX` -- If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again, maybe with a different LLM this time. +- If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again, maybe using aider with a different LLM this time. [Aider is tightly integrated with git](https://aider.chat/docs/faq.html#how-does-aider-use-git), so it's always easy to revert AI changes that don't pan out. -Of course, outside a benchmark setting, it's probably +Outside a benchmark setting, it's probably unwise to let *any* AI agent run unsupervised on your code base. Aider is intended to be used as an interactive pair-programming chat, where the user participates to direct aider's work and approve suggestions. @@ -82,7 +82,7 @@ or if the AI starts going down a wrong path. ## Aider with GPT-4o alone was SOTA -Running the entire SWE Bench Lite benchmark using aider with just GPT-4o +Running the SWE Bench Lite benchmark using aider with just GPT-4o achieved a score of 25%. This was itself a state-of-the-art result, before being surpassed by the main result being reported here @@ -203,7 +203,7 @@ respected when new code is added. [Aider lints code](https://aider.chat/2024/05/22/linting.html) after every LLM edit and offers to automatically fix any linting errors. -Aider includes basic linters built with tree-sitter that supports +Aider includes basic linters built with tree-sitter to check [most popular programming languages](https://github.com/paul-gauthier/grep-ast/blob/main/grep_ast/parsers.py). These built in linters will detect syntax errors and other fatal problems with the code. @@ -220,36 +220,38 @@ make the correct changes to resolve it.
-> app.py:23:36: F821 undefined name 'num' -> app.py:41:16: F541 f-string is missing placeholders -> -> app.py: -> ...⋮... -> 6│class LongNum: -> 7│ def __init__(self, num): -> 8│ """ -> 9│ Initialize the number. -> 10│ """ -> ...⋮... -> 19│ def __str__(self): -> 20│ """ -> 21│ Render the number as a string. -> 22│ """ -> 23█ return str(num) -> 24│ -> 25│ -> 26│@app.route('/subtract//') -> ...⋮... -> 38│@app.route('/divide//') -> 39│def divide(x, y): -> 40│ if y == 0: -> 41█ return f"Error: Cannot divide by zero" -> 42│ else: -> 43│ result = x / y -> 44│ return str(result) -> 45│ -> ...⋮... -> +``` +app.py:23:36: F821 undefined name 'num' +app.py:41:16: F541 f-string is missing placeholders + +app.py: +...⋮... + 6│class LongNum: + 7│ def __init__(self, num): + 8│ """ + 9│ Initialize the number. + 10│ """ +...⋮... + 19│ def __str__(self): + 20│ """ + 21│ Render the number as a string. + 22│ """ + 23█ return str(num) + 24│ + 25│ + 26│@app.route('/subtract//') +...⋮... + 38│@app.route('/divide//') + 39│def divide(x, y): + 40│ if y == 0: + 41█ return f"Error: Cannot divide by zero" + 42│ else: + 43│ result = x / y + 44│ return str(result) + 45│ +...⋮... +``` + > Attempt to fix lint errors? yes
From 8b5451f4abaf11b543e7a24c25488598451cc981 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 20:15:46 -0700 Subject: [PATCH 24/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 35 +++++++++++++++-------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index fd0bf04b3..a69321ee3 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -63,8 +63,9 @@ SWE Bench problem was correctly resolved. The benchmarking process was similar to a user employing aider like this: -- Launching aider in their repo with the something like command below, which -tells aider to say yes to every suggestion and use pytest to run tests. +- Launching aider in their repo with the command below, which +tells aider to automatically proceed with every suggestion +and use pytest to run tests. - `aider --yes --test-cmd pytest` - Pasting the text of a GitHub issue into the chat, or adding it via URL with a command in the chat like: - `/web https://github.com/django/django/issues/XXX` @@ -267,7 +268,7 @@ aider like this: aider --test-cmd pytest ``` -The repositories that are used in the SWE Bench problems are large, open +The repositories that are used in the SWE Bench problems are large open source projects with extensive existing test suites. A repo's test suite can be run in three ways: @@ -275,30 +276,30 @@ A repo's test suite can be run in three ways: 2. Run tests after aider has modified the repo. So the pre-existing test cases are still present, but may have been modified by aider. Aider may have also added new tests. -3. Run the final "acceptance tests" to judge if aider has -successfully resolved the problem. -SWE Bench verifies both pre-existing tests and a set of held out acceptance tests -(from the so called `test_patch`) -to check that the issue is properly resolved. During this final acceptance testing, -any aider edits to tests are discarded to ensure a faithful test of whether the -issue was resolved. +3. Run the final "acceptance tests" to judge if aider has successfully resolved the problem. +These tests include the unmodified pre-existing tests and +a held out set of tests (from the so called `test_patch`). For the benchmark, aider is configured with a test command that will run the tests as described in (2) above. So testing will fail if aider has broken any pre-existing tests or if any new tests that it created aren't passing. -When aider runs a test command, it checks for a non-zero exit status. -In this case, -aider will automatically +If any tests fail, aider will automatically share the test output with the LLM and ask it to try and resolve the test failures. To be clear, *aider cannot run or even see the "acceptance tests"* from the `test_patch` -as described in (3). +described in (3). Those tests are only run outside of aider and the benchmark harness, to compute the final benchmark score. - - +To do that, +the SWE Bench support code +verifies that the pre-existing and held out tests +pass as expected from a correct solution. +If so, the issue is marked as resolved. +For this final acceptance testing, +any aider edits to tests are discarded to ensure a faithful determination +of whether the issue was resolved. ## Finding a plausible solution @@ -320,7 +321,7 @@ as the SWE Bench `model_patch` to be evaluated later with the If the solution is not plausible, another instance of aider is launched again from scratch on the same problem. -The harness alternates asking GPT-4o and Opus to solve the problem, +The harness alternates launching aider with GPT-4o and Opus to solve the problem, and gives each model three attempts -- for a total of six attempts. As soon as a plausible solution is found, it is accepted and the harness moves on to the next SWE Bench instance. From cdf4969c01a857b5c5f62429ea506f8c26fcd2e2 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 20:24:10 -0700 Subject: [PATCH 25/53] copy --- assets/swe_bench_lite.jpg | Bin 35893 -> 36571 bytes assets/swe_bench_lite.svg | 298 +++++++++++++++++++----------------- benchmark/swe_bench_lite.py | 7 +- 3 files changed, 163 insertions(+), 142 deletions(-) diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index da1492d83b1d6fc3b7d782f8453af6b1fee9fb97..c604a2ad379d1136d966bb4725ee85f8730028f1 100644 GIT binary patch literal 36571 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 literal 35893 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 diff --git a/assets/swe_bench_lite.svg b/assets/swe_bench_lite.svg index 5d5f620e4..b115d4164 100644 --- a/assets/swe_bench_lite.svg +++ b/assets/swe_bench_lite.svg @@ -6,7 +6,7 @@ - 2024-05-22T15:45:26.770357 + 2024-05-22T20:23:36.416838 image/svg+xml @@ -30,8 +30,8 @@ z
- - - + - + - + - + - + - + @@ -466,7 +466,7 @@ z - + @@ -479,12 +479,12 @@ z - + - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + - + - - + + + + + + + + + + + - - - - - - - - - + + + + + - + - + - + - + - + - - + + - - - - - + + + + + + + + - + - + - - + + - - - - - + + + + + + + + - + @@ -1025,23 +1041,23 @@ z - + - - + - + - + - + - + - + - + - + - + - + - + @@ -1168,18 +1184,18 @@ L 690 138.158892 - + - + - + - + - + - + @@ -1233,7 +1249,7 @@ L 690 75.473969 - + - - - @@ -1350,64 +1366,64 @@ L 690 50.4 " style="fill: none; stroke: #dddddd; stroke-width: 0.5; stroke-linejoin: miter; stroke-linecap: square"/> - +" clip-path="url(#p4afbc1300d)" style="fill: #b3e6a8; opacity: 0.75"/> - +" clip-path="url(#p4afbc1300d)" style="fill: #b3e6a8; opacity: 0.75"/> - +" clip-path="url(#p4afbc1300d)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p4afbc1300d)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p4afbc1300d)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p4afbc1300d)" style="fill: #b3d1e6; opacity: 0.75"/> - +" clip-path="url(#p4afbc1300d)" style="fill: #b3d1e6; opacity: 0.75"/> - + - + @@ -1466,7 +1482,7 @@ z - + - + @@ -1522,7 +1538,7 @@ z - + @@ -1532,7 +1548,7 @@ z - + - + - + + diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index f318bb74b..c67f2c47a 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -50,7 +50,12 @@ def plot_swe_bench_lite(data_file): ax.set_ylabel("Pass rate (%)", fontsize=18, color=font_color) ax.set_title("SWE Bench Lite", fontsize=20) ax.set_ylim(0, 29) - plt.xticks(rotation=45, ha="right", fontsize=16, color=font_color) + plt.xticks( + # rotation=45, + # ha="center", + fontsize=16, + color=font_color, + ) plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") From aca24976a7a67847c5e63a6b49fc96d1b02ade86 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 21:19:43 -0700 Subject: [PATCH 26/53] Add method to check for URLs in input. --- aider/coders/base_coder.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 158bdff7e..f76a81eaf 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -575,6 +575,13 @@ class Coder: return self.commands.run(inp) self.check_for_file_mentions(inp) + inp = self.check_for_urls(inp) + + return inp + + def check_for_urls(self, inp): + # todo use a regex to find all urls in inp + return inp def keyboard_interrupt(self): From dc8ae596c33c2ced77d8f04d539285fc5d4219f2 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 21:19:44 -0700 Subject: [PATCH 27/53] aider: Implement regex to find all URLs in the input string. # Aider chat conversation: USER: do the todo ASSISTANT: To address the TODO comment, we need to implement a regex to find all URLs in the input string. Here are the changes: 1. Import the `re` module for regular expressions. 2. Implement the `check_for_urls` method to find and process URLs in the input string. Here are the *SEARCH/REPLACE* blocks: aider/coders/base_coder.py ```python <<<<<<< SEARCH import hashlib ======= import hashlib import re >>>>>>> REPLACE ``` aider/coders/base_coder.py ```python <<<<<<< SEARCH # todo use a regex to find all urls in inp return inp ======= url_pattern = re.compile( r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+' ) urls = url_pattern.findall(inp) if urls: self.io.tool_output(f"Found URLs: {', '.join(urls)}") return inp >>>>>>> REPLACE ``` This will implement the functionality to find all URLs in the input string using a regular expression. --- aider/coders/base_coder.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index f76a81eaf..8ced8bb39 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import hashlib +import re import json import os import sys @@ -580,8 +581,12 @@ class Coder: return inp def check_for_urls(self, inp): - # todo use a regex to find all urls in inp - + url_pattern = re.compile( + r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+' + ) + urls = url_pattern.findall(inp) + if urls: + self.io.tool_output(f"Found URLs: {', '.join(urls)}") return inp def keyboard_interrupt(self): From 5032adf44be45ada1b5f23f821e89dea7f238e15 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 21:25:34 -0700 Subject: [PATCH 28/53] Add the url content --- aider/coders/base_coder.py | 11 +++++++---- aider/commands.py | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 8ced8bb39..fd39baf76 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1,9 +1,9 @@ #!/usr/bin/env python import hashlib -import re import json import os +import re import sys import threading import time @@ -582,11 +582,14 @@ class Coder: def check_for_urls(self, inp): url_pattern = re.compile( - r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+' + r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" ) urls = url_pattern.findall(inp) - if urls: - self.io.tool_output(f"Found URLs: {', '.join(urls)}") + for url in urls: + self.io.tool_output(f"Adding {url} to the chat.") + inp += "\n\n" + inp += self.commands.cmd_web(url) + return inp def keyboard_interrupt(self): diff --git a/aider/commands.py b/aider/commands.py index 146cb5dbd..898f8b699 100644 --- a/aider/commands.py +++ b/aider/commands.py @@ -69,8 +69,8 @@ class Commands: self.scraper = Scraper(print_error=self.io.tool_error) content = self.scraper.scrape(url) or "" - if content: - self.io.tool_output(content) + # if content: + # self.io.tool_output(content) instructions = self.scraper.get_playwright_instructions() if instructions: From a405defcff466f85795b478636fddb9ad6511b2a Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 21:27:59 -0700 Subject: [PATCH 29/53] ask for confirmation --- _posts/2024-05-22-swe-bench-lite.md | 3 +-- aider/coders/base_coder.py | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index a69321ee3..10b89addf 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -67,8 +67,7 @@ The benchmarking process was similar to a user employing aider like this: tells aider to automatically proceed with every suggestion and use pytest to run tests. - `aider --yes --test-cmd pytest` -- Pasting the text of a GitHub issue into the chat, or adding it via URL with a command in the chat like: - - `/web https://github.com/django/django/issues/XXX` +- Pasting the URL of a GitHub issue into the chat. Aider will offer to pull in the URL's content. - If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again, maybe using aider with a different LLM this time. [Aider is tightly integrated with git](https://aider.chat/docs/faq.html#how-does-aider-use-git), so it's always easy to revert AI changes that don't pan out. diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index fd39baf76..5b2f303e2 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -586,9 +586,9 @@ class Coder: ) urls = url_pattern.findall(inp) for url in urls: - self.io.tool_output(f"Adding {url} to the chat.") - inp += "\n\n" - inp += self.commands.cmd_web(url) + if self.io.confirm_ask(f"Add {url} to the chat?"): + inp += "\n\n" + inp += self.commands.cmd_web(url) return inp From 25d00b3aace5ca2919b060b3fa94079390be1dad Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 May 2024 21:31:44 -0700 Subject: [PATCH 30/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 10b89addf..4d61db15b 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -61,13 +61,14 @@ It's important to be clear that during benchmarking It could not see or run the held out "acceptance tests" that are used later to see if the SWE Bench problem was correctly resolved. -The benchmarking process was similar to a user employing aider like this: +The benchmarking process was similar to how a developer might use aider to +resolve a GitHub issue: -- Launching aider in their repo with the command below, which -tells aider to automatically proceed with every suggestion -and use pytest to run tests. +- They could launch aider in their repo with the command below, which +tells aider they want to accept every suggestion +and to use pytest to run tests. - `aider --yes --test-cmd pytest` -- Pasting the URL of a GitHub issue into the chat. Aider will offer to pull in the URL's content. +- Paste the URL or text of a GitHub issue into the chat. Aider will pull in the URL's content and then try and solve the issue. - If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again, maybe using aider with a different LLM this time. [Aider is tightly integrated with git](https://aider.chat/docs/faq.html#how-does-aider-use-git), so it's always easy to revert AI changes that don't pan out. From 2852acb9475b8e4716ba1731ef6c54f54ef754fd Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 06:03:25 -0700 Subject: [PATCH 31/53] Updated HISTORY --- HISTORY.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/HISTORY.md b/HISTORY.md index ea125c884..7aab4df7c 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,6 +1,10 @@ # Release history +### main + +- Aider will notice if you paste a URL into the chat, and offer to scrape it. + ### v0.36.0 - [Aider can now lint your code and fix any errors](https://aider.chat/2024/05/22/linting.html). From 071e5e273b7193e66363159699f7553e16cf2e8f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 06:46:26 -0700 Subject: [PATCH 32/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 78 ++++++++++++++++------------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 4d61db15b..90f9cee54 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -89,7 +89,7 @@ This was itself a state-of-the-art result, before being surpassed by the main result being reported here that used aider with both GPT-4o & Opus. -## GPT-4o vs Opus +## Aider with GPT-4o & Opus The benchmark harness alternated between running aider with GPT-4o and Opus. The harness proceeded in a fixed order, always starting with GPT-4o and @@ -99,35 +99,39 @@ The table below breaks down the 79 solutions that were ultimately verified as correctly resolving their issue. Some noteworthy observations: -- Aider with GPT-4o immediately found 77% of the valid solutions on the first attempt. -- ~90% of valid solutions were found after one attempt from aider with GPT-4o and Opus. -- A long tail of solutions continued to be found by both models including one on the final, sixth attempt of that problem. +- Aider with GPT-4o on the first attempt immediately found 69% of all plausible solutions which accounted for 77% of the correctly resulted problems. +- ~75% of all plausible and ~90% of all resolved solutions were found after one attempt from aider with GPT-4o and Opus. +- A long tail of solutions continued to be found by both models including one resolved solution on the final, sixth attempt of that problem. -| Attempt | Agent | Number
resolved | Percent
of resolved | Cumulative
percent of
resolved | -|:--------:|------------|---------:|---------:|----:| -| 1 | Aider with GPT-4o | 61 | 77.2 | 77.2 -| 2 | Aider with Opus | 10 | 12.7 | 89.9 -| 3 | Aider with GPT-4o | 3 | 3.8 | 93.7 -| 4 | Aider with Opus | 2 | 2.5 | 96.2 -| 5 | Aider with GPT-4o | 2 | 2.5 | 98.7 -| 6 | Aider with Opus | 1 | 1.3 | 100.0 -|**Total**| | **79** | **100%** | **100%** | +| Attempt | Agent |Number
plausible
solutions|Percent of
plausible
solutions| Number
correctly
resolved | Percent
of correctly
resolved | +|:--------:|------------|---------:|---------:|----:|---:| +| 1 | Aider with GPT-4o | 208 | 69.3% | 61 | 77.2% | +| 2 | Aider with Opus | 49 | 16.3% | 10 | 12.7% | +| 3 | Aider with GPT-4o | 20 | 6.7% | 3 | 3.8% | +| 4 | Aider with Opus | 9 | 3.0% | 2 | 2.5% | +| 5 | Aider with GPT-4o | 11 | 3.7% | 2 | 2.5% | +| 6 | Aider with Opus | 3 | 1.0% | 1 | 1.3% | +| **Total** | | **300** | **100%** | **79** | **100%** | If we break down correct solutions purely by model, -we can see that GPT-4o dominates. +we can see that aider with GPT-4o outperforms Opus. This isn't a fair and direct comparison, because GPT-4o always took the first -turn at solving. -But anecdotal evidence from earlier runs of the benchmark -supports the observation that aider with GPT-4o is significantly stronger than Opus +turn at solving and therefore got to solve all the "easiest" problems. +Aider with Opus only ever saw the problems that GPT-4o failed to solve on the first attempt. + +Aider with GPT-4o was producing higher quality plausible solutions, +with a greater chance of going on to be accepted as resolving the issue. +Other anecdotal evidence from earlier runs of the benchmark +also supports the observation that aider with GPT-4o is significantly stronger than Opus for this endeavor. -| Agent | Number resolved | Percent of resolved | -|------------|---------:|---------:| -| Aider with GPT-4o | 66 | 83.5 | -| Aider with Opus | 13 | 16.5 | -|**Total**| **79** | **100%** | +| Agent | Number
plausible
solutions | Number
correctly
resolved | Percent
plausible
which
resolved| +|------------|---------:|---------:|---:| +| Aider with GPT-4o | 239 | 66 |27.6% | +| Aider with Opus | 61 | 13 |21.3% | +| **Total** | **300** | **79** |**26.3%** | ## Repository map, not RAG @@ -171,14 +175,18 @@ Please add app.py to the chat so I can proceed with the changes. This is a convenient and natural workflow for interactive chat, and it worked well for the SWE Bench tasks. -Each task comes with a “gold” patch, which was created by a human developer -to solve the issue. -Aider successfully identified and added the file from the gold patch +Aider successfully identified the correct file to edit in 70.3% of the benchmark tasks. +We can determine which file needed to be edited using the "gold" patch +which is associated with SWE Bench Task. +This patch was created by a human developer +to solve the issue, and therefore reveals a file which can +be edited to solve the problem. Of course aider is not able to see or use the gold patch -or the files it names in any way. -They were only used to compute this statistic after the benchmarking was completed. +or the file names it contains in any way. +This information was only used to compute +statistics after the benchmarking was completed. ## Reliable code editing @@ -186,13 +194,13 @@ They were only used to compute this statistic after the benchmarking was complet Once files have been selected for editing, the next step is of course to edit the source code to fix the problem. -Aider has always had a deep focus on ensuring that LLMs can not just write code, +Aider goes to great lengths to ensure that LLMs can not just write code, but reliably *edit* code. Aider has a collection of prompting strategies and code editing backends which have been honed through [extensive benchmarking](https://aider.chat/docs/leaderboards/). -These foundational capabilities help ensure that the LLM can not only code up a solution but -also properly integrate it into the existing code base and source files. +These foundational capabilities help ensure that aider can +properly integrate code from LLMs into an existing code base and source files. The repository map helps here too, making sure that the LLM can see relevant classes, functions and variables from the entire repo. @@ -293,7 +301,7 @@ described in (3). Those tests are only run outside of aider and the benchmark harness, to compute the final benchmark score. To do that, -the SWE Bench support code +an evaluation script verifies that the pre-existing and held out tests pass as expected from a correct solution. If so, the issue is marked as resolved. @@ -342,10 +350,12 @@ and prioritizing solutions in the following order: ## Computing the benchmark score -The benchmark harness produces one "best" solution for each of the 300 +The benchmark harness produces one candidate solution for each of the 300 SWE Bench Lite instances and saves it as a `model_patch`. -A separate evaluation script uses the SWE Bench support code to -test each of these results with the acceptance tests. +A separate evaluation script +tests each of these results with the acceptance tests. +It verifies that they pass as expected from a correct solution, like +the "gold" patch developed by a human to solve the issue. These `test_patch` acceptance tests are only ever run outside of aider and the benchmark harness, and only to compute the number of From d9594815b0f90f84310868172ac464f5b35bf89e Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 07:27:04 -0700 Subject: [PATCH 33/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 112 +++++++++++++++------------- 1 file changed, 62 insertions(+), 50 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 90f9cee54..64bf71ea3 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -1,15 +1,16 @@ --- -title: Aider scores SOTA 26.3% on SWE Bench Lite +title: Aider scores 26.3% on SWE Bench Lite excerpt: Aider scored 26.3% on SWE Bench Lite, achieving a state of the art result. highlight_image: /assets/swe_bench_lite.jpg draft: true --- -# Aider scores SOTA 26.3% on SWE Bench Lite +# Aider scores 26.3% on SWE Bench Lite Aider scored 26.3% on the -[SWE Bench Lite benchmark](https://www.swebench.com), achieving a state-of-the-art result. +[SWE Bench Lite benchmark](https://www.swebench.com), +achieving a state-of-the-art result. The current top leaderboard entry is 20.3% from Amazon Q Developer Agent. The best result reported elsewhere online seems to be @@ -207,19 +208,24 @@ can see relevant classes, functions and variables from the entire repo. This helps ensure that the project's existing APIs and conventions are respected when new code is added. +Regardless, there are still cases where aider may be unable to cleanly +complete the edits specified by the LLM. +This is usually because the LLM has failed to conform to the editing +instructions in its system prompt. +When aider completes, it returns an editing outcome that indicates +whether it was able to successfully complete all edits. +The benchmark harness used this editing status as +one criteria to determine if aider has +created a plausible soultion. + ## Linting and fixing +One key criteria for a plausible solution is that it passes basic +linting, which means that the code is valid and without syntax +or other fatal errors. [Aider lints code](https://aider.chat/2024/05/22/linting.html) after every LLM edit and offers to automatically fix -any linting errors. -Aider includes basic linters built with tree-sitter to check -[most popular programming languages](https://github.com/paul-gauthier/grep-ast/blob/main/grep_ast/parsers.py). -These built in linters will detect syntax errors and other fatal problems with the code. - -Users can also configure aider to use their preferred linters. -This allows aider to check for a larger class of problems, keep the code style -aligned with the rest of the repo, etc. -But for the benchmark, aider simply used its built-in linters. +any problems. Aider shows linting errors to the LLM in a novel format, using the abstract syntax tree (AST) to display relevant code context for each @@ -265,67 +271,68 @@ app.py: +In the benchmark, these linting suggestions are always accepted. +At completion, +aider reports a linting outcome that +indicates if it was able to ultimately produce +code without any outstanding linting errors. +The benchmark harness used this status as +one of the criteria to determine if aider has +created a plausible soultion. ## Testing and fixing -Aider can be configured with the command needed to run tests for a repo. -A user working on a python project might do that by launching -aider like this: +Another key crtieria for a plausible solution is that it must +not have any broken tests. +Aider can be configured with the command needed to run tests for a repo, +and can automatically attempt to fix any testing errors. + +A user working on a python project might configure testing +by launching aider like this: ``` aider --test-cmd pytest ``` -The repositories that are used in the SWE Bench problems are large open +For the benchmark, aider is configured with a test command that will run the +tests that already exist in each problem's repository. +SWE Bench problems are based on repositories from large open source projects with extensive existing test suites. -A repo's test suite can be run in three ways: - -1. Run tests as they existed before trying to solve the problem, without any changes. -2. Run tests after aider has modified the repo. -So the pre-existing test cases are still present, but may have been modified by aider. -Aider may have also added new tests. -3. Run the final "acceptance tests" to judge if aider has successfully resolved the problem. -These tests include the unmodified pre-existing tests and -a held out set of tests (from the so called `test_patch`). - -For the benchmark, aider is configured with a test command that will run the tests -as described in (2) above. -So testing will fail if aider has broken any pre-existing tests or if any new +This means that +testing will fail if aider has broken any of these +pre-existing tests or if any new tests that it created aren't passing. -If any tests fail, aider will automatically -share the test output with the LLM and ask it to -try and resolve the test failures. -To be clear, *aider cannot run or even see the "acceptance tests"* from the `test_patch` -described in (3). +As with editig and linting, aider reports a testing outcome +that indicates if it completed with any outstanding testing errors. +The benchmark harness uses this status when deciding if aider +has produced a plausible solution. + +To be clear, *aider cannot run or even see the "acceptance tests"* +that are used to determine if a proposed solution correctly +resolves the problem. Those tests are only run outside of aider and the benchmark harness, to compute the final benchmark score. -To do that, -an evaluation script -verifies that the pre-existing and held out tests -pass as expected from a correct solution. -If so, the issue is marked as resolved. -For this final acceptance testing, -any aider edits to tests are discarded to ensure a faithful determination -of whether the issue was resolved. ## Finding a plausible solution -As aider executes, it notes the outcome of the editing, linting, and testing +Each time aider executes, it reports +the outcome of the editing, linting, and testing steps. -When aider completes, it returns its final status as either: -succeeded with no errors remaining, -or ended without resolving all errors. +Each of these steps may complete successfully or +return a status that indicates that there were outstanding +problems that remain unresolved. -The benchmark harness uses these outcomes to determine if it has a plausible +The benchmark harness uses these outcomes to determine if +aider has produced a plausible solution to the current SWE Bench task. A plausible solution is one where aider returns saying that it edited the repo with no outstanding edit, lint, or test errors. -In this case, aider's changes are taken as the proposed solution and recorded +In this case, aider's changes are recorded as the SWE Bench `model_patch` to be evaluated later with the -`test_patch` "acceptance tests". +acceptance tests. If the solution is not plausible, another instance of aider is launched again from scratch on the same problem. @@ -334,7 +341,12 @@ and gives each model three attempts -- for a total of six attempts. As soon as a plausible solution is found, it is accepted and the harness moves on to the next SWE Bench instance. -It's worth noting that repositories may have lint or test errors present before aider even starts to edit them. Whether errors are caused by aider or were pre-existing, there will be instances where, after six tries, no plausible solution is obtained. +It's worth noting that repositories may have lint or test errors +present before aider even starts to edit them. +Whether errors are caused by aider or were pre-existing, +there will be instances where +no plausible solution is +found after six tries. If all six attempts fail to produce a plausible solution, then the "best" solution available is selected as the From 15c228097bbfcf562cb10be814bda87b89a2f816 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 07:45:54 -0700 Subject: [PATCH 34/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 29 ++-- assets/swe_bench_lite.jpg | Bin 36571 -> 37529 bytes assets/swe_bench_lite.svg | 208 +++++++++++++++------------- benchmark/swe_bench_lite.py | 2 +- 4 files changed, 128 insertions(+), 111 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 64bf71ea3..b9ff99d12 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -13,7 +13,7 @@ on the achieving a state-of-the-art result. The current top leaderboard entry is 20.3% from Amazon Q Developer Agent. -The best result reported elsewhere online seems to be +The best result reported elsewhere seems to be [22.3% from AutoCodeRover](https://github.com/nus-apr/auto-code-rover). [![SWE Bench Lite results](/assets/swe_bench_lite.svg)](https://aider.chat/assets/swe_bench_lite.svg) @@ -94,26 +94,29 @@ that used aider with both GPT-4o & Opus. The benchmark harness alternated between running aider with GPT-4o and Opus. The harness proceeded in a fixed order, always starting with GPT-4o and -then alternating with Opus until a plausible solution was found. +then alternating with Opus until a plausible solution was found for each +problem. The table below breaks down the 79 solutions that were ultimately verified as correctly resolving their issue. Some noteworthy observations: -- Aider with GPT-4o on the first attempt immediately found 69% of all plausible solutions which accounted for 77% of the correctly resulted problems. +- Just the first attempt of Aider with GPT-4o resolved 20.3% of the problems, which ties the Amazon Q Developer Agent currently atop the official leaderboard. +- Aider with GPT-4o on the first attempt immediately found 69% of all plausible solutions which accounted for 77% of the correctly resolved problems. - ~75% of all plausible and ~90% of all resolved solutions were found after one attempt from aider with GPT-4o and Opus. -- A long tail of solutions continued to be found by both models including one resolved solution on the final, sixth attempt of that problem. +- A long tail of solutions continued to be found by both models including one correctly resolved solution on the final, sixth attempt of that problem. -| Attempt | Agent |Number
plausible
solutions|Percent of
plausible
solutions| Number
correctly
resolved | Percent
of correctly
resolved | -|:--------:|------------|---------:|---------:|----:|---:| -| 1 | Aider with GPT-4o | 208 | 69.3% | 61 | 77.2% | -| 2 | Aider with Opus | 49 | 16.3% | 10 | 12.7% | -| 3 | Aider with GPT-4o | 20 | 6.7% | 3 | 3.8% | -| 4 | Aider with Opus | 9 | 3.0% | 2 | 2.5% | -| 5 | Aider with GPT-4o | 11 | 3.7% | 2 | 2.5% | -| 6 | Aider with Opus | 3 | 1.0% | 1 | 1.3% | -| **Total** | | **300** | **100%** | **79** | **100%** | +| Attempt | Agent |Number
plausible
solutions|Percent of
plausible
solutions| Number
correctly
resolved | Percent of
correctly
resolved | Percent of
SWE Bench Lite Resolved | +|:--------:|------------|---------:|---------:|----:|---:|--:| +| 1 | Aider with GPT-4o | 208 | 69.3% | 61 | 77.2% | 20.3% | +| 2 | Aider with Opus | 49 | 16.3% | 10 | 12.7% | 3.3% | +| 3 | Aider with GPT-4o | 20 | 6.7% | 3 | 3.8% | 1.0% | +| 4 | Aider with Opus | 9 | 3.0% | 2 | 2.5% | 0.7% | +| 5 | Aider with GPT-4o | 11 | 3.7% | 2 | 2.5% | 0.7% | +| 6 | Aider with Opus | 3 | 1.0% | 1 | 1.3% | 0.3% | +| **Total** | | **300** | **100%** | **79** | **100%** | **26.3%** | + If we break down correct solutions purely by model, we can see that aider with GPT-4o outperforms Opus. diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index c604a2ad379d1136d966bb4725ee85f8730028f1..c940d26045dda3751b1ef60ee68da8c9f33c4520 100644 GIT binary patch delta 26843 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 diff --git a/assets/swe_bench_lite.svg b/assets/swe_bench_lite.svg index b115d4164..fe7cecc1a 100644 --- a/assets/swe_bench_lite.svg +++ b/assets/swe_bench_lite.svg @@ -6,7 +6,7 @@ - 2024-05-22T20:23:36.416838 + 2024-05-23T07:38:15.931243 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -453,7 +453,7 @@ z - + @@ -479,7 +479,7 @@ z - + @@ -601,7 +601,7 @@ z - + @@ -674,7 +674,7 @@ z - + @@ -886,7 +886,7 @@ z - + @@ -1007,7 +1007,7 @@ z - + @@ -1043,21 +1043,21 @@ z +" clip-path="url(#p535a156c8f)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - - + - + +" clip-path="url(#p535a156c8f)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + - + +" clip-path="url(#p535a156c8f)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1167,11 +1167,11 @@ z +" clip-path="url(#p535a156c8f)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1186,11 +1186,11 @@ L 690 158.200121 +" clip-path="url(#p535a156c8f)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1232,11 +1232,11 @@ z +" clip-path="url(#p535a156c8f)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1248,9 +1248,40 @@ L 690 81.200034 - - + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -1368,10 +1408,10 @@ L 690 50.4 +" clip-path="url(#p535a156c8f)" style="fill: #b3e6a8; opacity: 0.75"/> +" clip-path="url(#p535a156c8f)" style="fill: #b3e6a8; opacity: 0.75"/> +" clip-path="url(#p535a156c8f)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#p535a156c8f)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#p535a156c8f)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#p535a156c8f)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#p535a156c8f)" style="fill: #b3d1e6; opacity: 0.75"/> - - + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -1658,30 +1696,6 @@ Q 3319 0 2413 0 L 472 0 L 472 4591 z -" transform="scale(0.015625)"/> - +
diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index c67f2c47a..26aca75f6 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -47,7 +47,7 @@ def plot_swe_bench_lite(data_file): ) # ax.set_xlabel("Models", fontsize=18) - ax.set_ylabel("Pass rate (%)", fontsize=18, color=font_color) + ax.set_ylabel("Instances resolved (%)", fontsize=18, color=font_color) ax.set_title("SWE Bench Lite", fontsize=20) ax.set_ylim(0, 29) plt.xticks( From 2a881faac8d578a69edd2759354ceddcabbc24d2 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 07:51:06 -0700 Subject: [PATCH 35/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index b9ff99d12..d51a33ea5 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -102,12 +102,12 @@ verified as correctly resolving their issue. Some noteworthy observations: - Just the first attempt of Aider with GPT-4o resolved 20.3% of the problems, which ties the Amazon Q Developer Agent currently atop the official leaderboard. -- Aider with GPT-4o on the first attempt immediately found 69% of all plausible solutions which accounted for 77% of the correctly resolved problems. -- ~75% of all plausible and ~90% of all resolved solutions were found after one attempt from aider with GPT-4o and Opus. +- Including the second attempt, Aider with GPT-4o and Opus scored 23.6% on the benchmark, better than all other known results. +These first two attempts obtained ~75% of all plausible and ~90% of all resolved solutions. - A long tail of solutions continued to be found by both models including one correctly resolved solution on the final, sixth attempt of that problem. -| Attempt | Agent |Number
plausible
solutions|Percent of
plausible
solutions| Number
correctly
resolved | Percent of
correctly
resolved | Percent of
SWE Bench Lite Resolved | +| Attempt | Agent |Number
plausible
solutions|Percent of
plausible
solutions| Number
correctly
resolved | Percent of
correctly
resolved | Score on
SWE Bench
Lite | |:--------:|------------|---------:|---------:|----:|---:|--:| | 1 | Aider with GPT-4o | 208 | 69.3% | 61 | 77.2% | 20.3% | | 2 | Aider with Opus | 49 | 16.3% | 10 | 12.7% | 3.3% | From 2f3baf7cdd56e3ca800502e7b9ab7fe06008c846 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 08:04:37 -0700 Subject: [PATCH 36/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 26 +++++----- assets/swe_bench_lite.jpg | Bin 37529 -> 37193 bytes assets/swe_bench_lite.svg | 74 ++++++++++++++-------------- benchmark/swe_bench_lite.py | 2 +- 4 files changed, 51 insertions(+), 51 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index d51a33ea5..1ad664c74 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -23,21 +23,21 @@ The best result reported elsewhere seems to be Aider achieved this result mainly through its focus on static code analysis, reliable LLM code editing, and pragmatic workflows for interactive pair programming with AI. -Aider intentionally has quite limited and narrow "agentic behavior": -it doesn't require a highly detailed upfront "spec" from the user, -use RAG or vector search, farm out sub-problems to an army of LLMs, -allow the LLM to use tools, -or perform web searches, -etc. +Aider intentionally has quite limited and narrow "agentic behavior" +to avoid long delays, high token costs +and the need for users to repeatedly code review incorrect solutions. +It's also worth noting that aider currently does not use +RAG, vector search, tools or give the LLM access to execute code +or run web searches. -Aider is first and foremost a tool for engineers to get real work done in -real code bases through a pair programming chat style interface. -When a user asks aider for a change, they see the edits performed in real-time, -and aider may also then offer additional -help like fixing lint or test errors. -In normal use, the user is in full interactive control. +Aider is first and foremost an interactive tool for engineers to get real work done in +real code bases using a chat interface. +Aider provides a pair programming experience where users can ask for a change +and see the edits performed in real-time. +Aider can also offer additional help like fixing lint or test errors, +but the user is always in full interactive control. This lets them quickly steer misunderstandings back on course and -avoid wasted time, code reviews and token costs. +avoid wasting time and token costs. ## Benchmark methodology diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index c940d26045dda3751b1ef60ee68da8c9f33c4520..9c525c7c4ba1aac06d260bf4285b5718349d6804 100644 GIT binary patch delta 25340 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

Zam7 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 delta 24677 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 - 2024-05-23T07:38:15.931243 + 2024-05-23T07:52:54.138893 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -453,7 +453,7 @@ z - + @@ -479,7 +479,7 @@ z - + @@ -601,7 +601,7 @@ z - + @@ -674,7 +674,7 @@ z - + @@ -886,7 +886,7 @@ z - + @@ -1007,7 +1007,7 @@ z - + @@ -1043,16 +1043,16 @@ z +" clip-path="url(#pdd89e16c85)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - - + @@ -1089,11 +1089,11 @@ z +" clip-path="url(#pdd89e16c85)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1135,11 +1135,11 @@ z +" clip-path="url(#pdd89e16c85)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1167,11 +1167,11 @@ z +" clip-path="url(#pdd89e16c85)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1186,11 +1186,11 @@ L 690 158.200121 +" clip-path="url(#pdd89e16c85)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1232,11 +1232,11 @@ z +" clip-path="url(#pdd89e16c85)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1411,7 +1411,7 @@ L 163.368917 273.70025 L 163.368917 71.190023 L 96.917045 71.190023 z -" clip-path="url(#p535a156c8f)" style="fill: #b3e6a8; opacity: 0.75"/> +" clip-path="url(#pdd89e16c85)" style="fill: #b3e6a8; opacity: 0.75"/> +" clip-path="url(#pdd89e16c85)" style="fill: #b3e6a8; opacity: 0.75"/> +" clip-path="url(#pdd89e16c85)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#pdd89e16c85)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#pdd89e16c85)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#pdd89e16c85)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#pdd89e16c85)" style="fill: #b3d1e6; opacity: 0.75"/> - + - + @@ -1556,7 +1556,7 @@ z - + @@ -1566,7 +1566,7 @@ z - + @@ -1576,7 +1576,7 @@ z - + @@ -1586,7 +1586,7 @@ z - + - + + diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 26aca75f6..bac10552a 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -38,7 +38,7 @@ def plot_swe_bench_lite(data_file): yval = bar.get_height() ax.text( bar.get_x() + bar.get_width() / 2, - yval - 1.5, + yval - 1.25, f"{yval}%", ha="center", va="top", From 0f92c2bd7eb3afe866a2043cd5d87b45a1fea108 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 08:23:14 -0700 Subject: [PATCH 37/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 43 +++++++++++++++-------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 1ad664c74..bd276231d 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -58,7 +58,7 @@ alternating between using aider with GPT-4o and Opus. with the least amount of edit/lint/test problems. It's important to be clear that during benchmarking -*aider only had access to the pre-existing tests in the repo*. +*aider only had access to the pre-existing tests in the problem's repo*. It could not see or run the held out "acceptance tests" that are used later to see if the SWE Bench problem was correctly resolved. @@ -85,7 +85,7 @@ or if the AI starts going down a wrong path. ## Aider with GPT-4o alone was SOTA Running the SWE Bench Lite benchmark using aider with just GPT-4o -achieved a score of 25%. +achieved a score of 25.0%. This was itself a state-of-the-art result, before being surpassed by the main result being reported here that used aider with both GPT-4o & Opus. @@ -121,12 +121,14 @@ These first two attempts obtained ~75% of all plausible and ~90% of all resolved If we break down correct solutions purely by model, we can see that aider with GPT-4o outperforms Opus. This isn't a fair and direct comparison, because GPT-4o always took the first -turn at solving and therefore got to solve all the "easiest" problems. -Aider with Opus only ever saw the problems that GPT-4o failed to solve on the first attempt. +turn and therefore got first crack at all the "easiest" problems. +Aider with Opus only ever saw problems that GPT-4o failed to +find plausible solutions for on its first try. Aider with GPT-4o was producing higher quality plausible solutions, with a greater chance of going on to be accepted as resolving the issue. -Other anecdotal evidence from earlier runs of the benchmark +Again, this is biased by the turn ordering. +But other anecdotal evidence from earlier runs of the benchmark also supports the observation that aider with GPT-4o is significantly stronger than Opus for this endeavor. @@ -142,7 +144,7 @@ for this endeavor. The crucial first step in solving a SWE Bench problem is figuring out which parts of the repo are relevant and which files need to be edited. Most coding agents use some combination of RAG, vector search -and arming the LLM with +and providing the LLM with tools to interactively explore the code base. Aider instead uses a @@ -178,19 +180,19 @@ Please add app.py to the chat so I can proceed with the changes. This is a convenient and natural workflow for interactive chat, -and it worked well for the SWE Bench tasks. +and it worked well for the SWE Bench problems. Aider successfully identified the correct file to edit in 70.3% of the benchmark tasks. We can determine which file needed to be edited using the "gold" patch -which is associated with SWE Bench Task. +which is associated with each SWE Bench Task. This patch was created by a human developer to solve the issue, and therefore reveals a file which can be edited to solve the problem. Of course aider is not able to see or use the gold patch or the file names it contains in any way. This information was only used to compute -statistics after the benchmarking was completed. +statistics outside the benchmarking process. ## Reliable code editing @@ -209,7 +211,7 @@ properly integrate code from LLMs into an existing code base and source files. The repository map helps here too, making sure that the LLM can see relevant classes, functions and variables from the entire repo. This helps ensure that the project's existing APIs and conventions are -respected when new code is added. +respected and utilized when new code is added. Regardless, there are still cases where aider may be unable to cleanly complete the edits specified by the LLM. @@ -223,7 +225,7 @@ created a plausible soultion. ## Linting and fixing -One key criteria for a plausible solution is that it passes basic +Another key criteria for a plausible solution is that it passes basic linting, which means that the code is valid and without syntax or other fatal errors. [Aider lints code](https://aider.chat/2024/05/22/linting.html) @@ -285,10 +287,10 @@ created a plausible soultion. ## Testing and fixing -Another key crtieria for a plausible solution is that it must -not have any broken tests. +The final crtieria for a plausible solution is that +all tests must be passing. Aider can be configured with the command needed to run tests for a repo, -and can automatically attempt to fix any testing errors. +and will automatically attempt to fix any testing errors. A user working on a python project might configure testing by launching aider like this: @@ -306,7 +308,7 @@ testing will fail if aider has broken any of these pre-existing tests or if any new tests that it created aren't passing. -As with editig and linting, aider reports a testing outcome +As with editing and linting, aider reports a testing outcome that indicates if it completed with any outstanding testing errors. The benchmark harness uses this status when deciding if aider has produced a plausible solution. @@ -346,7 +348,7 @@ harness moves on to the next SWE Bench instance. It's worth noting that repositories may have lint or test errors present before aider even starts to edit them. -Whether errors are caused by aider or were pre-existing, +Whether unresolved errors were caused by aider or were pre-existing, there will be instances where no plausible solution is found after six tries. @@ -365,17 +367,18 @@ and prioritizing solutions in the following order: ## Computing the benchmark score -The benchmark harness produces one candidate solution for each of the 300 -SWE Bench Lite instances and saves it as a `model_patch`. +The benchmark harness produces a candidate solution for each of the 300 +SWE Bench Lite instances and saves it as the `model_patch`. + A separate evaluation script tests each of these results with the acceptance tests. It verifies that they pass as expected from a correct solution, like the "gold" patch developed by a human to solve the issue. -These `test_patch` acceptance tests are only ever run outside of aider +These so called `test_patch` acceptance tests are only ever run outside of aider and the benchmark harness, and only to compute the number of correctly resolved instances. -They are never run, used, or even visible during the attempts to solve the problems. +They are never run, used, or even visible during aider's attempts to solve the problems. Aider correctly resolved 79 out of 300 SWE Bench Lite instances, or 26.3%. From 15669b7ae812ab7d7f836b160c01ef9d83fb47ad Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 08:28:42 -0700 Subject: [PATCH 38/53] copy --- assets/swe_bench_lite.jpg | Bin 37193 -> 37633 bytes assets/swe_bench_lite.svg | 132 ++++++++++++++++++------------------ benchmark/swe_bench_lite.py | 15 ++-- 3 files changed, 77 insertions(+), 70 deletions(-) diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index 9c525c7c4ba1aac06d260bf4285b5718349d6804..d7455765e17cf56cc945a89977c22ee11dd0a78c 100644 GIT binary patch delta 27372 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 H&(wbaZ-i11 delta 26463 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 diff --git a/assets/swe_bench_lite.svg b/assets/swe_bench_lite.svg index f5c8faf2d..9affe1f65 100644 --- a/assets/swe_bench_lite.svg +++ b/assets/swe_bench_lite.svg @@ -6,7 +6,7 @@ - 2024-05-23T07:52:54.138893 + 2024-05-23T08:28:16.091496 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -453,7 +453,7 @@ z - + @@ -479,7 +479,7 @@ z - + @@ -601,7 +601,7 @@ z - + @@ -674,7 +674,7 @@ z - + @@ -886,7 +886,7 @@ z - + @@ -1007,7 +1007,7 @@ z - + @@ -1043,16 +1043,16 @@ z +" clip-path="url(#p009365f358)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - - + @@ -1087,18 +1087,18 @@ z - + - + - + - + - + - + - + - + - + @@ -1184,18 +1184,18 @@ L 690 158.200121 - + - + - + - + - + - + @@ -1408,62 +1408,62 @@ L 690 50.4 +" clip-path="url(#p009365f358)" style="fill: #b3e6a8; opacity: 0.75"/> +" clip-path="url(#p009365f358)" style="fill: #b3e6a8; opacity: 0.75"/> +" clip-path="url(#p009365f358)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#p009365f358)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#p009365f358)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#p009365f358)" style="fill: #b3d1e6; opacity: 0.75"/> +" clip-path="url(#p009365f358)" style="fill: #b3d1e6; opacity: 0.75"/> - + - + @@ -1556,7 +1556,7 @@ z - + @@ -1566,7 +1566,7 @@ z - + @@ -1576,7 +1576,7 @@ z - + @@ -1586,7 +1586,7 @@ z - + - + + diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index bac10552a..03095689d 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -34,14 +34,21 @@ def plot_swe_bench_lite(data_file): colors = ["#b3e6a8" if "Aider" in model else "#b3d1e6" for model in models] bars = ax.bar(models, pass_rates, color=colors, alpha=0.75, zorder=3) - for bar in bars: + for model, bar in zip(models, bars): yval = bar.get_height() + if "Aider" in model: + y = yval + 0.75 + va = "bottom" + else: + y = yval - 1.25 + va = "top" + ax.text( bar.get_x() + bar.get_width() / 2, - yval - 1.25, + y, f"{yval}%", ha="center", - va="top", + va=va, fontsize=14, # alpha=0.75, ) @@ -49,7 +56,7 @@ def plot_swe_bench_lite(data_file): # ax.set_xlabel("Models", fontsize=18) ax.set_ylabel("Instances resolved (%)", fontsize=18, color=font_color) ax.set_title("SWE Bench Lite", fontsize=20) - ax.set_ylim(0, 29) + ax.set_ylim(0, 29.9) plt.xticks( # rotation=45, # ha="center", From 210aeb6133020f606acb03cc5dbb2193620c3352 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 09:47:23 -0700 Subject: [PATCH 39/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 49 +++++++++++++++++++---------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index bd276231d..6a8053017 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -57,9 +57,11 @@ alternating between using aider with GPT-4o and Opus. - If no plausible solution is found after six tries, the harness picks the solution with the least amount of edit/lint/test problems. -It's important to be clear that during benchmarking -*aider only had access to the pre-existing tests in the problem's repo*. -It could not see or run the held out "acceptance tests" that are used later to see if the +It's important to be clear that +*aider and the benchmark harness +only had access to the pre-existing tests in each problem's repo*. +They could not see or run the held out "acceptance tests" that are used +after benchmarking to see if the SWE Bench problem was correctly resolved. The benchmarking process was similar to how a developer might use aider to @@ -69,27 +71,33 @@ resolve a GitHub issue: tells aider they want to accept every suggestion and to use pytest to run tests. - `aider --yes --test-cmd pytest` -- Paste the URL or text of a GitHub issue into the chat. Aider will pull in the URL's content and then try and solve the issue. +- They could start the chat by pasting in the URL or text of a GitHub issue. +Aider will pull in the URL's content and then try and solve the issue. - If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again, maybe using aider with a different LLM this time. [Aider is tightly integrated with git](https://aider.chat/docs/faq.html#how-does-aider-use-git), so it's always easy to revert AI changes that don't pan out. Outside a benchmark setting, it's probably -unwise to let *any* AI agent run unsupervised on your code base. -Aider is intended to be used as an interactive pair-programming chat, -where the user participates to direct aider's work and approve suggestions. +unwise or at least highly inefficient +to let *any* AI agent run unsupervised on your code base. +The reason aider is intended to be used interactively +is so that the user can participate and direct aider's work and approve suggestions. This way the user can offer immediate feedback or corrections if their initial instructions turn out to be ambiguous, or if the AI starts going down a wrong path. ## Aider with GPT-4o alone was SOTA -Running the SWE Bench Lite benchmark using aider with just GPT-4o +Running the benchmark harness +only using aider with GPT-4o to find plausible solutions achieved a score of 25.0%. This was itself a state-of-the-art result, before being surpassed by the main result being reported here that used aider with both GPT-4o & Opus. +As noted below, a single attempt using Aider with GPT-4o tied +the current top entry on the leader. + ## Aider with GPT-4o & Opus The benchmark harness alternated between running aider with GPT-4o and Opus. @@ -101,7 +109,7 @@ The table below breaks down the 79 solutions that were ultimately verified as correctly resolving their issue. Some noteworthy observations: -- Just the first attempt of Aider with GPT-4o resolved 20.3% of the problems, which ties the Amazon Q Developer Agent currently atop the official leaderboard. +- *Just the first attempt* of Aider with GPT-4o resolved 20.3% of the problems, which ties the Amazon Q Developer Agent currently atop the official leaderboard. - Including the second attempt, Aider with GPT-4o and Opus scored 23.6% on the benchmark, better than all other known results. These first two attempts obtained ~75% of all plausible and ~90% of all resolved solutions. - A long tail of solutions continued to be found by both models including one correctly resolved solution on the final, sixth attempt of that problem. @@ -151,7 +159,8 @@ Aider instead uses a [repository map](https://aider.chat/2023/10/22/repomap.html) to help the LLM understand the layout, code structure, and content of a git repo. -The repo map is created from the code's AST and call graph +The repo map is created from the code's +abstract syntax tree and call graph to provide a compact and powerful summary of the entire code base. The map is constantly tailored to show @@ -221,7 +230,7 @@ When aider completes, it returns an editing outcome that indicates whether it was able to successfully complete all edits. The benchmark harness used this editing status as one criteria to determine if aider has -created a plausible soultion. +created a plausible solution. ## Linting and fixing @@ -233,7 +242,7 @@ after every LLM edit and offers to automatically fix any problems. Aider shows linting errors to the LLM in a novel format, -using the abstract syntax tree (AST) to display relevant code context for each +using the abstract syntax tree to display relevant code context for each error. This context increases the ability of the LLM to understand the problem and make the correct changes to resolve it. @@ -283,7 +292,7 @@ indicates if it was able to ultimately produce code without any outstanding linting errors. The benchmark harness used this status as one of the criteria to determine if aider has -created a plausible soultion. +created a plausible solution. ## Testing and fixing @@ -371,9 +380,17 @@ The benchmark harness produces a candidate solution for each of the 300 SWE Bench Lite instances and saves it as the `model_patch`. A separate evaluation script -tests each of these results with the acceptance tests. -It verifies that they pass as expected from a correct solution, like -the "gold" patch developed by a human to solve the issue. +tests each of these solutions with the full test suite +including the held out acceptance tests. +For this final acceptance testing, any edits that aider made to tests +are discarded. +This ensures that the full, correct test suite is used for acceptance testing. +The evaluation script compares the test results +with results from testing +the "gold" patch that was developed by a human to correctly solve the issue. +If they match, the candidate solution has correctly resolved the issue. + + These so called `test_patch` acceptance tests are only ever run outside of aider and the benchmark harness, and only to compute the number of From ee7dcd5071696d4d825a1e02eaf4d74ed8a8645d Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 09:48:53 -0700 Subject: [PATCH 40/53] aider: Adjust alpha values for bars based on model name containing "Aider". # Aider chat conversation: USER: can we use more alpha for the aider bars and less alpha for the other bars? ASSISTANT: To adjust the alpha values for the bars, we need to modify the section where the bars are created and set their alpha values based on whether the model name contains "Aider". Here is the *SEARCH/REPLACE* block: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH bars = ax.bar(models, pass_rates, color=colors, alpha=0.75, zorder=3) ======= bars = [] for model, pass_rate, color in zip(models, pass_rates, colors): alpha = 0.9 if "Aider" in model else 0.5 bar = ax.bar(model, pass_rate, color=color, alpha=alpha, zorder=3) bars.append(bar[0]) >>>>>>> REPLACE ``` --- benchmark/swe_bench_lite.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 03095689d..c940b4bba 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -32,7 +32,11 @@ def plot_swe_bench_lite(data_file): spine.set_linewidth(0.5) colors = ["#b3e6a8" if "Aider" in model else "#b3d1e6" for model in models] - bars = ax.bar(models, pass_rates, color=colors, alpha=0.75, zorder=3) + bars = [] + for model, pass_rate, color in zip(models, pass_rates, colors): + alpha = 0.9 if "Aider" in model else 0.5 + bar = ax.bar(model, pass_rate, color=color, alpha=alpha, zorder=3) + bars.append(bar[0]) for model, bar in zip(models, bars): yval = bar.get_height() From 484f625b2cd6bbbb103256134915169ab6eb80fe Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 09:49:47 -0700 Subject: [PATCH 41/53] copy --- assets/swe_bench_lite.jpg | Bin 37633 -> 36449 bytes assets/swe_bench_lite.svg | 60 ++++++++++++++++++------------------ benchmark/swe_bench_lite.py | 2 +- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index d7455765e17cf56cc945a89977c22ee11dd0a78c..6d6d3e8070f4da9f9abc9e11cf1d47134c0404ad 100644 GIT binary patch literal 36449 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

@>Y2PI^x72H8LG_+Vi0b!3Uzr zs*?^FfvkJr#Zw1w^999PGWj3MrJ$#= zzzo1t-8_E)Zy$AWRh?Hld83FoBDL_-i^NB6eO^MCmO^W_e=Gj*&z`~P;*T>-m7?s- z9_#sJ)ac`yq+y)}#IF+CYaFQ?#UMy+_+zr~_Ad2(4C}=`2Zvp#veOVFXcW93OD*%&WKr08Z zR%r}wa)X|ZXzIJ$(#7joC8XPS^u>7?YUd ztm5XTB4k+x8TZtx2uGjeUiE5BSE{iy&mbNsDU)jyaWILbTmqGo2l`CeX8pzKo3OG= z?z7}g@@-r}`5#ZzMkasLp5+m)MQ>5`b9k0Rt=ZQT_A}bu+cSHXGl|~-vFY513|k~> zTq$B}Ez)V(XY5~I|BC)3j<@oK{<&3`on}fdUwD*brict5$aNo@UoZYa+1(GirUunrV z&-B^8p985_aq`r3z4)0RCB43@+L77U%2{5}BT-Fv0NY&aXV0}(Typtn%Jar|yKKM^ zaPYc{WWBErh6T&;TLw3tNzujE6fW+0fgRjV3qa+sxf2PsH$1VU8#!T!U6?L3?njx|C!uB1 zGmz&%hZ}Y3N)#XSOatDSGTtXn&ccwjF^(UV7JmU+(JjUG6_~88Z6MlOrg`1fKx2<6 zitUu~pGp%-5U<&r4-)6xlyBv@Kn3%oODgaYR+H`ci&86aI zt@}>DD$RIO$syX?NjsnSW!JFd5BP9n#M;?Impw<3C2p9gluR(hB7UT&qJq+@rK3%+ zr5QTQS0|tjT$sd7P@k=;2V1q4Rf6_iU+?4gJ#%T_kXXQ>kZ{ zrWX=yKV5bK^58Gd@Aoc;P9K?xc*1jS9Q$jFhaHn`klFoy=J@UhQsfDJMEDh~*)mdN zlQc@TfhWTY(+w2__Eb#YzZNT^gX*GYu&d=CwHy(n*%_JR^!tv$oky*inIlI0x~(k{ zk1d0&UGg40FvK-Ob!%E@t2}l%$qo;Kc;zv!d1taLkH1kbw{q;8t8%Qhbah&ieUZm6 zZfjw@(o6pMrSds0II0M`s9$eDtxKNBm)vq)s0M9ay3RdNK%&v0(Wyl?AFS8EP`=io!o9UhY7l?-LvGivDF^>Trh z_8azJlv6MDlp52B8u?&Z%5?cepMi4Cj=Qn8BRTjSw3{KE_s%6>Lye932Qw5HgIgkt zo%D#-O{iy-rV~E#eR)|s%T7lthD)qi9K_n~q99qqI=T#+ck);Eh~u1|3N;vTt6d_0 zBzBIB?+5}AcGv-{3tEK4RLgql>#WO-j1<0sFJK-KByg$}Fhh_JZS2#GI@fAs|8IbrjgRI)oWMv zIWVG!+N|z~F}c$fEsPZ7Xl{vGFZ~5*Hzp};#^x8V&qym@zco?Z_4Z10umrtt=(D2T z7B-hSbnj*s({q*s_+%e6w>5n+g~~rXf9l`kRKFAJO0n$_1+=8Y8F!fEE33+%W?$<} z8EsR1Z{xr19>f!HUGe$9x!eXA49Karg zNlrMJu(0@-v1u4mEJZ4r+kI$+*geGcN>3gAI_;fQvuAr>r>7vR(TiF}NOl$0Zz|3H z$H7_E=0fPa7F*rc`D(P1lrW%6H93 zXRzOZ*29`HpG-yVxS=>AFZ~p`VuqA2{*ZhT_@46EM+*mEO*uz>)r6n) z9}K*X3X)5GwlSa;j@TO+pO7F6XxT&e3eXXkQ&P0)5n{|>YiBn^M4T1#tz)gs7{1d8 z{eH=laq&od)P`J|K-?_P8`kbiEOdg5YpZqXr*;-Ra9W0kZ(~-~nB&^t*>mia*}(G< z>7u>MkGwOUNcqu~kQMDaD^% z`{v`F47#8a7xMeLR}^H3sejxN$g1}_8dO-=4=3A6EZrilm@%IYC;A2(zmve8o`^mC z5FoOBD`ddPcs=u&$4Qvx(#>^|e`QLF7-1-D2_}QJrbaL!qV;QlC^uEN2s+sxoiAp& zIL@w*&R}wVPG9O2ry~N6LwjYJhZ$Qxg~$SeciV`gE2XZ4 z(7jEvymzRwqN2laef4_s%f E0NxW>y#N3J literal 37633 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 T>HpE`{_lAHm&Q}!&yRlruiv+p diff --git a/assets/swe_bench_lite.svg b/assets/swe_bench_lite.svg index 9affe1f65..419998794 100644 --- a/assets/swe_bench_lite.svg +++ b/assets/swe_bench_lite.svg @@ -6,7 +6,7 @@ - 2024-05-23T08:28:16.091496 + 2024-05-23T09:49:41.227630 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -453,7 +453,7 @@ z - + @@ -479,7 +479,7 @@ z - + @@ -601,7 +601,7 @@ z - + @@ -674,7 +674,7 @@ z - + @@ -886,7 +886,7 @@ z - + @@ -1007,7 +1007,7 @@ z - + @@ -1043,16 +1043,16 @@ z +" clip-path="url(#p3efb973a07)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - - + @@ -1089,11 +1089,11 @@ z +" clip-path="url(#p3efb973a07)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1135,11 +1135,11 @@ z +" clip-path="url(#p3efb973a07)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1167,11 +1167,11 @@ z +" clip-path="url(#p3efb973a07)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1186,11 +1186,11 @@ L 690 161.676713 +" clip-path="url(#p3efb973a07)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1232,11 +1232,11 @@ z +" clip-path="url(#p3efb973a07)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1411,7 +1411,7 @@ L 163.368917 273.70025 L 163.368917 77.285649 L 96.917045 77.285649 z -" clip-path="url(#p009365f358)" style="fill: #b3e6a8; opacity: 0.75"/> +" clip-path="url(#p3efb973a07)" style="fill: #b3e6a8; opacity: 0.9"/> +" clip-path="url(#p3efb973a07)" style="fill: #b3e6a8; opacity: 0.9"/> +" clip-path="url(#p3efb973a07)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p3efb973a07)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p3efb973a07)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p3efb973a07)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p3efb973a07)" style="fill: #b3d1e6; opacity: 0.3"/> @@ -1745,7 +1745,7 @@ z - + diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index c940b4bba..b8949abfa 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -34,7 +34,7 @@ def plot_swe_bench_lite(data_file): colors = ["#b3e6a8" if "Aider" in model else "#b3d1e6" for model in models] bars = [] for model, pass_rate, color in zip(models, pass_rates, colors): - alpha = 0.9 if "Aider" in model else 0.5 + alpha = 0.9 if "Aider" in model else 0.3 bar = ax.bar(model, pass_rate, color=color, alpha=alpha, zorder=3) bars.append(bar[0]) From cf1140ba714390f62998149fb473d561cbf3cfde Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 09:56:03 -0700 Subject: [PATCH 42/53] Updated colors and alpha values for Aider models in SWE benchmark plot. --- benchmark/swe_bench_lite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index b8949abfa..abaebb6e3 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -31,10 +31,10 @@ def plot_swe_bench_lite(data_file): spine.set_edgecolor("#DDDDDD") spine.set_linewidth(0.5) - colors = ["#b3e6a8" if "Aider" in model else "#b3d1e6" for model in models] + colors = ["#17965A" if "Aider" in model else "#b3d1e6" for model in models] bars = [] for model, pass_rate, color in zip(models, pass_rates, colors): - alpha = 0.9 if "Aider" in model else 0.3 + alpha = 0.6 if "Aider" in model else 0.3 bar = ax.bar(model, pass_rate, color=color, alpha=alpha, zorder=3) bars.append(bar[0]) From d37bace5d70627452a87544dfc8c63d407cd10cb Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 09:56:04 -0700 Subject: [PATCH 43/53] aider: Make the percentages on top of Aider's bars and the Aider x labels bold. # Aider chat conversation: USER: make the percentages on top of aiders bars bold. make the aider x labels bold too ASSISTANT: To make the percentages on top of Aider's bars bold and the Aider x labels bold, we need to modify the text properties in the plotting section. Here are the *SEARCH/REPLACE* blocks: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH if "Aider" in model: y = yval + 0.75 va = "bottom" else: y = yval - 1.25 va = "top" ax.text( bar.get_x() + bar.get_width() / 2, y, f"{yval}%", ha="center", va=va, fontsize=14, # alpha=0.75, ) ======= y = yval + 0.75 if "Aider" in model else yval - 1.25 va = "bottom" if "Aider" in model else "top" fontweight = "bold" if "Aider" in model else "normal" ax.text( bar.get_x() + bar.get_width() / 2, y, f"{yval}%", ha="center", va=va, fontsize=14, fontweight=fontweight, ) >>>>>>> REPLACE ``` benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH plt.xticks( # rotation=45, # ha="center", fontsize=16, color=font_color, ) ======= xticks = plt.xticks( fontsize=16, color=font_color, ) for label in xticks[1]: if "Aider" in label.get_text(): label.set_fontweight("bold") >>>>>>> REPLACE ``` --- benchmark/swe_bench_lite.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index abaebb6e3..a7a0f77eb 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -40,12 +40,9 @@ def plot_swe_bench_lite(data_file): for model, bar in zip(models, bars): yval = bar.get_height() - if "Aider" in model: - y = yval + 0.75 - va = "bottom" - else: - y = yval - 1.25 - va = "top" + y = yval + 0.75 if "Aider" in model else yval - 1.25 + va = "bottom" if "Aider" in model else "top" + fontweight = "bold" if "Aider" in model else "normal" ax.text( bar.get_x() + bar.get_width() / 2, @@ -54,19 +51,20 @@ def plot_swe_bench_lite(data_file): ha="center", va=va, fontsize=14, - # alpha=0.75, + fontweight=fontweight, ) # ax.set_xlabel("Models", fontsize=18) ax.set_ylabel("Instances resolved (%)", fontsize=18, color=font_color) ax.set_title("SWE Bench Lite", fontsize=20) ax.set_ylim(0, 29.9) - plt.xticks( - # rotation=45, - # ha="center", + xticks = plt.xticks( fontsize=16, color=font_color, ) + for label in xticks[1]: + if "Aider" in label.get_text(): + label.set_fontweight("bold") plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") From 6d75a10c8bd003961a3ad8bb69f3553755014776 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 10:01:12 -0700 Subject: [PATCH 44/53] Changed font weight to "light" for model "Aider" in plot_swe_bench_lite. --- benchmark/swe_bench_lite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index a7a0f77eb..dec87492c 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -42,7 +42,7 @@ def plot_swe_bench_lite(data_file): yval = bar.get_height() y = yval + 0.75 if "Aider" in model else yval - 1.25 va = "bottom" if "Aider" in model else "top" - fontweight = "bold" if "Aider" in model else "normal" + fontweight = "bold" if "Aider" in model else "light" ax.text( bar.get_x() + bar.get_width() / 2, From ed43cd278a5ee1b99455ebc3f538e4f1606d600e Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 10:01:14 -0700 Subject: [PATCH 45/53] aider: Ensure bold and light fonts are visibly different by using "normal" instead of "light" for the non-Aider bars. # Aider chat conversation: USER: there's no visible difference bwteen the bold and light fonts? ASSISTANT: To ensure that the bold and light fonts are visibly different, we can use "normal" instead of "light" for the non-Aider bars. This should provide a more noticeable contrast. Here are the *SEARCH/REPLACE* blocks: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH fontweight = "bold" if "Aider" in model else "light" ======= fontweight = "bold" if "Aider" in model else "normal" >>>>>>> REPLACE ``` Let's make this change and see if it improves the visibility of the font differences. --- benchmark/swe_bench_lite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index dec87492c..a7a0f77eb 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -42,7 +42,7 @@ def plot_swe_bench_lite(data_file): yval = bar.get_height() y = yval + 0.75 if "Aider" in model else yval - 1.25 va = "bottom" if "Aider" in model else "top" - fontweight = "bold" if "Aider" in model else "light" + fontweight = "bold" if "Aider" in model else "normal" ax.text( bar.get_x() + bar.get_width() / 2, From a03e36f7f7ae1764f9eb8eaa183123e00ada7efe Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 10:01:55 -0700 Subject: [PATCH 46/53] Increased the font size of "Aider" labels in the SWE benchmark plot. --- benchmark/swe_bench_lite.py | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index a7a0f77eb..757664704 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -65,6 +65,7 @@ def plot_swe_bench_lite(data_file): for label in xticks[1]: if "Aider" in label.get_text(): label.set_fontweight("bold") + label.set_fontsize(16) plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") From 5ff4deb12ee7c1d4205878586f9a6af92521451f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 10:01:57 -0700 Subject: [PATCH 47/53] aider: Increased font weight for "Aider" labels to make them more visually distinct. # Aider chat conversation: USER: there's no visible difference bwteen the bold and light fonts? ASSISTANT: To make the bold font more visible, we can increase the font weight. Here are the changes: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH fontweight = "bold" if "Aider" in model else "normal" ======= fontweight = 800 if "Aider" in model else "normal" >>>>>>> REPLACE ``` benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH label.set_fontweight("bold") ======= label.set_fontweight(800) >>>>>>> REPLACE ``` This sets the font weight to 800 for the "Aider" labels, which should make them bolder and more visibly distinct from the other labels. --- benchmark/swe_bench_lite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 757664704..6a715585a 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -42,7 +42,7 @@ def plot_swe_bench_lite(data_file): yval = bar.get_height() y = yval + 0.75 if "Aider" in model else yval - 1.25 va = "bottom" if "Aider" in model else "top" - fontweight = "bold" if "Aider" in model else "normal" + fontweight = 800 if "Aider" in model else "normal" ax.text( bar.get_x() + bar.get_width() / 2, @@ -64,7 +64,7 @@ def plot_swe_bench_lite(data_file): ) for label in xticks[1]: if "Aider" in label.get_text(): - label.set_fontweight("bold") + label.set_fontweight(800) label.set_fontsize(16) plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.jpg") From c0f5cbb9b57773a4a379d1ec4362976e6823a975 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 10:03:43 -0700 Subject: [PATCH 48/53] copy --- assets/swe_bench_lite.jpg | Bin 36449 -> 37370 bytes assets/swe_bench_lite.svg | 60 ++++++++++++++++++------------------ benchmark/swe_bench_lite.py | 8 +---- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index 6d6d3e8070f4da9f9abc9e11cf1d47134c0404ad..11cb8b1c3f7ac9bb813fc515290fe70bfc679610 100644 GIT binary patch delta 25782 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 - 2024-05-23T09:49:41.227630 + 2024-05-23T10:03:39.368177 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -453,7 +453,7 @@ z - + @@ -479,7 +479,7 @@ z - + @@ -601,7 +601,7 @@ z - + @@ -674,7 +674,7 @@ z - + @@ -886,7 +886,7 @@ z - + @@ -1007,7 +1007,7 @@ z - + @@ -1043,16 +1043,16 @@ z +" clip-path="url(#p1078447209)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - - + @@ -1089,11 +1089,11 @@ z +" clip-path="url(#p1078447209)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1135,11 +1135,11 @@ z +" clip-path="url(#p1078447209)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1167,11 +1167,11 @@ z +" clip-path="url(#p1078447209)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1186,11 +1186,11 @@ L 690 161.676713 +" clip-path="url(#p1078447209)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1232,11 +1232,11 @@ z +" clip-path="url(#p1078447209)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1411,7 +1411,7 @@ L 163.368917 273.70025 L 163.368917 77.285649 L 96.917045 77.285649 z -" clip-path="url(#p3efb973a07)" style="fill: #b3e6a8; opacity: 0.9"/> +" clip-path="url(#p1078447209)" style="fill: #17965a; opacity: 0.6"/> +" clip-path="url(#p1078447209)" style="fill: #17965a; opacity: 0.6"/> +" clip-path="url(#p1078447209)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p1078447209)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p1078447209)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p1078447209)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p1078447209)" style="fill: #b3d1e6; opacity: 0.3"/> @@ -1745,7 +1745,7 @@ z - + diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 6a715585a..a3e4aa667 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -42,7 +42,6 @@ def plot_swe_bench_lite(data_file): yval = bar.get_height() y = yval + 0.75 if "Aider" in model else yval - 1.25 va = "bottom" if "Aider" in model else "top" - fontweight = 800 if "Aider" in model else "normal" ax.text( bar.get_x() + bar.get_width() / 2, @@ -51,21 +50,16 @@ def plot_swe_bench_lite(data_file): ha="center", va=va, fontsize=14, - fontweight=fontweight, ) # ax.set_xlabel("Models", fontsize=18) ax.set_ylabel("Instances resolved (%)", fontsize=18, color=font_color) ax.set_title("SWE Bench Lite", fontsize=20) ax.set_ylim(0, 29.9) - xticks = plt.xticks( + plt.xticks( fontsize=16, color=font_color, ) - for label in xticks[1]: - if "Aider" in label.get_text(): - label.set_fontweight(800) - label.set_fontsize(16) plt.tight_layout(pad=3.0) plt.savefig("swe_bench_lite.jpg") plt.savefig("swe_bench_lite.svg") From b56aa129dccfaac158c841bc7a2173d3a9743853 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 10:27:49 -0700 Subject: [PATCH 49/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 55 +++++++++++------------------ 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index 6a8053017..fbfce79a4 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -96,7 +96,7 @@ result being reported here that used aider with both GPT-4o & Opus. As noted below, a single attempt using Aider with GPT-4o tied -the current top entry on the leader. +the current top entry on the leaderboard. ## Aider with GPT-4o & Opus @@ -105,17 +105,19 @@ The harness proceeded in a fixed order, always starting with GPT-4o and then alternating with Opus until a plausible solution was found for each problem. -The table below breaks down the 79 solutions that were ultimately +The table below breaks down the plausible solutions that +were found for the 300 problems. +It also provides details on the 79 that were ultimately verified as correctly resolving their issue. Some noteworthy observations: - *Just the first attempt* of Aider with GPT-4o resolved 20.3% of the problems, which ties the Amazon Q Developer Agent currently atop the official leaderboard. - Including the second attempt, Aider with GPT-4o and Opus scored 23.6% on the benchmark, better than all other known results. These first two attempts obtained ~75% of all plausible and ~90% of all resolved solutions. -- A long tail of solutions continued to be found by both models including one correctly resolved solution on the final, sixth attempt of that problem. +- A long tail of solutions continued to be found using both models including one correctly resolved solution on the final, sixth attempt of that problem. -| Attempt | Agent |Number
plausible
solutions|Percent of
plausible
solutions| Number
correctly
resolved | Percent of
correctly
resolved | Score on
SWE Bench
Lite | +| Attempt | Agent |Number of
plausible
solutions|Percent of
plausible
solutions| Number of
correctly
resolved
solutions | Percent of
correctly
resolved
solutions | Score on
SWE Bench
Lite
(resolved/300) | |:--------:|------------|---------:|---------:|----:|---:|--:| | 1 | Aider with GPT-4o | 208 | 69.3% | 61 | 77.2% | 20.3% | | 2 | Aider with Opus | 49 | 16.3% | 10 | 12.7% | 3.3% | @@ -138,10 +140,10 @@ with a greater chance of going on to be accepted as resolving the issue. Again, this is biased by the turn ordering. But other anecdotal evidence from earlier runs of the benchmark also supports the observation that aider with GPT-4o is significantly stronger than Opus -for this endeavor. +for this benchmark. -| Agent | Number
plausible
solutions | Number
correctly
resolved | Percent
plausible
which
resolved| +| Agent | Number of
plausible
solutions | Number of
correctly
resolved
solutions | Percent of
plausible
which
correctly
resolved
| |------------|---------:|---------:|---:| | Aider with GPT-4o | 239 | 66 |27.6% | | Aider with Opus | 61 | 13 |21.3% | @@ -194,7 +196,7 @@ Aider successfully identified the correct file to edit in 70.3% of the benchmark tasks. We can determine which file needed to be edited using the "gold" patch -which is associated with each SWE Bench Task. +which is associated with each SWE Bench task. This patch was created by a human developer to solve the issue, and therefore reveals a file which can be edited to solve the problem. @@ -251,33 +253,18 @@ make the correct changes to resolve it. ``` app.py:23:36: F821 undefined name 'num' -app.py:41:16: F541 f-string is missing placeholders app.py: ...⋮... 6│class LongNum: - 7│ def __init__(self, num): - 8│ """ - 9│ Initialize the number. - 10│ """ ...⋮... - 19│ def __str__(self): - 20│ """ - 21│ Render the number as a string. - 22│ """ - 23█ return str(num) + 19│ def expound(self, threshold): + 20│ number = self.basis + 21│ while number < threshold: + 22│ number *= self.factor + 23█ return num 24│ 25│ - 26│@app.route('/subtract//') -...⋮... - 38│@app.route('/divide//') - 39│def divide(x, y): - 40│ if y == 0: - 41█ return f"Error: Cannot divide by zero" - 42│ else: - 43│ result = x / y - 44│ return str(result) - 45│ ...⋮... ``` @@ -288,7 +275,7 @@ app.py: In the benchmark, these linting suggestions are always accepted. At completion, aider reports a linting outcome that -indicates if it was able to ultimately produce +indicates if it was able to produce code without any outstanding linting errors. The benchmark harness used this status as one of the criteria to determine if aider has @@ -298,8 +285,8 @@ created a plausible solution. The final crtieria for a plausible solution is that all tests must be passing. -Aider can be configured with the command needed to run tests for a repo, -and will automatically attempt to fix any testing errors. +Aider can be configured with the command to run tests for a repo, +and will automatically attempt to fix any test failures. A user working on a python project might configure testing by launching aider like this: @@ -318,11 +305,11 @@ pre-existing tests or if any new tests that it created aren't passing. As with editing and linting, aider reports a testing outcome -that indicates if it completed with any outstanding testing errors. +that indicates if it completed with any outstanding failing tests. The benchmark harness uses this status when deciding if aider has produced a plausible solution. -To be clear, *aider cannot run or even see the "acceptance tests"* +To be clear, *aider cannot run or even see the held out "acceptance tests"* that are used to determine if a proposed solution correctly resolves the problem. Those tests are only run outside of aider and the benchmark harness, @@ -390,9 +377,7 @@ with results from testing the "gold" patch that was developed by a human to correctly solve the issue. If they match, the candidate solution has correctly resolved the issue. - - -These so called `test_patch` acceptance tests are only ever run outside of aider +These acceptance tests are only ever run outside of aider and the benchmark harness, and only to compute the number of correctly resolved instances. They are never run, used, or even visible during aider's attempts to solve the problems. From bb2d5b2fbfb4e031269df230bf9802f161b6cdea Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 11:34:42 -0700 Subject: [PATCH 50/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index fbfce79a4..fda353038 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -161,7 +161,7 @@ Aider instead uses a [repository map](https://aider.chat/2023/10/22/repomap.html) to help the LLM understand the layout, code structure, and content of a git repo. -The repo map is created from the code's +The repo map is created through static analysis of the code's abstract syntax tree and call graph to provide a compact and powerful summary of the entire code base. The map is constantly @@ -169,7 +169,7 @@ tailored to show repo context that is relevant to the current state of the chat conversation. This is done by performing a graph optimization on the code's call graph. -When the user asks for a change to their code, the LLM uses the repo map +When the user asks for a change to their code, the LLM can use the repo map to decide which files to edit. The LLM simply returns a normal text response explaining which files it needs to edit and why. @@ -230,7 +230,7 @@ This is usually because the LLM has failed to conform to the editing instructions in its system prompt. When aider completes, it returns an editing outcome that indicates whether it was able to successfully complete all edits. -The benchmark harness used this editing status as +The benchmark harness uses this editing status as one criteria to determine if aider has created a plausible solution. @@ -277,7 +277,7 @@ At completion, aider reports a linting outcome that indicates if it was able to produce code without any outstanding linting errors. -The benchmark harness used this status as +The benchmark harness uses this status as one of the criteria to determine if aider has created a plausible solution. @@ -309,8 +309,8 @@ that indicates if it completed with any outstanding failing tests. The benchmark harness uses this status when deciding if aider has produced a plausible solution. -To be clear, *aider cannot run or even see the held out "acceptance tests"* -that are used to determine if a proposed solution correctly +To be clear, *aider cannot run or even see the held out "acceptance tests"* that +are used to determine if a proposed solution correctly resolves the problem. Those tests are only run outside of aider and the benchmark harness, to compute the final benchmark score. From bfe91ae191b2dea14579826e62071512f30986ad Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 12:11:12 -0700 Subject: [PATCH 51/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index fda353038..f762224fb 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -243,10 +243,12 @@ or other fatal errors. after every LLM edit and offers to automatically fix any problems. +Aider ships with built-in linters based on tree-sitter +which work with most popular programming languages. Aider shows linting errors to the LLM in a novel format, using the abstract syntax tree to display relevant code context for each error. -This context increases the ability of the LLM to understand the problem and +This context helps LLMs understand the problem and make the correct changes to resolve it.

From b8feaed5f920a28e44eee0a7a7af205b7cd8bd75 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 13:12:57 -0700 Subject: [PATCH 52/53] aider: Reversed the order of the bars from short to tall. # Aider chat conversation: USER: reverse the order of the bars, so they go short->tall ASSISTANT: To reverse the order of the bars from short to tall, we can reverse the order of the `models` and `pass_rates` lists before plotting: benchmark/swe_bench_lite.py ```python <<<<<<< SEARCH models = [] pass_rates = [] for line in lines: if line.strip(): pass_rate, model = line.split("%") model = model.strip() model = model.replace("|", "\n") models.append(model.strip()) pass_rates.append(float(pass_rate.strip())) ======= models = [] pass_rates = [] for line in lines: if line.strip(): pass_rate, model = line.split("%") model = model.strip() model = model.replace("|", "\n") models.insert(0, model.strip()) pass_rates.insert(0, float(pass_rate.strip())) >>>>>>> REPLACE ``` This change uses `insert(0, ...)` instead of `append()` to add each model and pass rate to the beginning of their respective lists. This will effectively reverse the order, so the bars will be plotted from shortest to tallest. --- benchmark/swe_bench_lite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index a3e4aa667..72106f197 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -15,8 +15,8 @@ def plot_swe_bench_lite(data_file): pass_rate, model = line.split("%") model = model.strip() model = model.replace("|", "\n") - models.append(model.strip()) - pass_rates.append(float(pass_rate.strip())) + models.insert(0, model.strip()) + pass_rates.insert(0, float(pass_rate.strip())) plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" From 17381bed5885735fcc704848d38008eab6ef7dff Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 May 2024 13:13:34 -0700 Subject: [PATCH 53/53] copy --- _posts/2024-05-22-swe-bench-lite.md | 4 +- assets/swe_bench_lite.jpg | Bin 37370 -> 37317 bytes assets/swe_bench_lite.svg | 1546 +++++++++++++-------------- 3 files changed, 774 insertions(+), 776 deletions(-) diff --git a/_posts/2024-05-22-swe-bench-lite.md b/_posts/2024-05-22-swe-bench-lite.md index f762224fb..638ee4a37 100644 --- a/_posts/2024-05-22-swe-bench-lite.md +++ b/_posts/2024-05-22-swe-bench-lite.md @@ -27,8 +27,8 @@ Aider intentionally has quite limited and narrow "agentic behavior" to avoid long delays, high token costs and the need for users to repeatedly code review incorrect solutions. It's also worth noting that aider currently does not use -RAG, vector search, tools or give the LLM access to execute code -or run web searches. +RAG, vector search, tools or give the LLM access to search the web +or unilaterally execute code. Aider is first and foremost an interactive tool for engineers to get real work done in real code bases using a chat interface. diff --git a/assets/swe_bench_lite.jpg b/assets/swe_bench_lite.jpg index 11cb8b1c3f7ac9bb813fc515290fe70bfc679610..40adf98fd05daf244ee2075bb99f5cf2c7ed1ecf 100644 GIT binary patch delta 26439 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 RLnIk-QVsWQVvawv{{z_#X;=UN delta 26389 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 diff --git a/assets/swe_bench_lite.svg b/assets/swe_bench_lite.svg index 00f539180..0e67796c9 100644 --- a/assets/swe_bench_lite.svg +++ b/assets/swe_bench_lite.svg @@ -6,7 +6,7 @@ - 2024-05-23T10:03:39.368177 + 2024-05-23T13:12:59.895266 image/svg+xml @@ -41,17 +41,101 @@ z - - + - - + + + + + + + + + + + + + + + - - - + - - - - + + + + - - + + - - - - - - - - - - - - - - - - - - @@ -441,245 +400,140 @@ L 1578 3428 z " transform="scale(0.015625)"/> - - - - - - + + + + + + - + - - - - - - - + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + @@ -836,45 +762,7 @@ z - - - - + @@ -883,157 +771,265 @@ z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - + + - - - - + + + + - - - - - - - - - - - - + + + + + + + + - + - - - - - - - - - + + - - - - + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -1043,16 +1039,16 @@ z +" clip-path="url(#p0eec7a4844)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - - + @@ -1089,11 +1085,11 @@ z +" clip-path="url(#p0eec7a4844)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1135,11 +1131,11 @@ z +" clip-path="url(#p0eec7a4844)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1167,11 +1163,11 @@ z +" clip-path="url(#p0eec7a4844)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1186,11 +1182,11 @@ L 690 161.676713 +" clip-path="url(#p0eec7a4844)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1232,11 +1228,11 @@ z +" clip-path="url(#p0eec7a4844)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.2; stroke-linecap: square"/> - + @@ -1408,26 +1404,26 @@ L 690 50.4 +" clip-path="url(#p0eec7a4844)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p0eec7a4844)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p0eec7a4844)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p0eec7a4844)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p0eec7a4844)" style="fill: #b3d1e6; opacity: 0.3"/> +" clip-path="url(#p0eec7a4844)" style="fill: #17965a; opacity: 0.6"/> +" clip-path="url(#p0eec7a4844)" style="fill: #17965a; opacity: 0.6"/> - - + + - - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + + - - + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1745,7 +1743,7 @@ z - +