From 72613f3b27285c28a71a50242793f3b6852932d8 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 06:25:30 -0700 Subject: [PATCH 01/50] switch naming from openai/gpt-4o to gpt-4o --- _data/edit_leaderboard.yml | 2 +- _data/refactor_leaderboard.yml | 2 +- aider/args.py | 2 +- aider/models.py | 12 +++++++++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/_data/edit_leaderboard.yml b/_data/edit_leaderboard.yml index 8570970f2..dd0d5695e 100644 --- a/_data/edit_leaderboard.yml +++ b/_data/edit_leaderboard.yml @@ -406,7 +406,7 @@ - dirname: 2024-05-13-17-39-05--gpt-4o-diff test_cases: 133 - model: openai/gpt-4o + model: gpt-4o edit_format: diff commit_hash: b6cd852 pass_rate_1: 60.2 diff --git a/_data/refactor_leaderboard.yml b/_data/refactor_leaderboard.yml index f1232d34e..8b3816a1d 100644 --- a/_data/refactor_leaderboard.yml +++ b/_data/refactor_leaderboard.yml @@ -103,7 +103,7 @@ - dirname: 2024-05-13-17-42-22--refac-gpt-4o-diff test_cases: 89 - model: openai/gpt-4o + model: gpt-4o edit_format: diff commit_hash: b6cd852 pass_rate_1: 62.9 diff --git a/aider/args.py b/aider/args.py index f21e7f297..3b42d074d 100644 --- a/aider/args.py +++ b/aider/args.py @@ -67,7 +67,7 @@ def get_parser(default_config_files, git_root): const=gpt_4_model, help=f"Use {gpt_4_model} model for the main chat", ) - gpt_4o_model = "openai/gpt-4o" + gpt_4o_model = "gpt-4o" group.add_argument( "--4o", action="store_const", diff --git a/aider/models.py b/aider/models.py index 975367061..c32840d82 100644 --- a/aider/models.py +++ b/aider/models.py @@ -11,7 +11,7 @@ from PIL import Image from aider.dump import dump # noqa: F401 from aider.litellm import litellm -DEFAULT_MODEL_NAME = "openai/gpt-4o" +DEFAULT_MODEL_NAME = "gpt-4o" @dataclass @@ -94,6 +94,16 @@ MODEL_SETTINGS = [ lazy=True, reminder_as_sys_msg=True, ), + ModelSettings( + "gpt-4o", + "diff", + weak_model_name="gpt-3.5-turbo", + use_repo_map=True, + send_undo_reply=True, + accepts_images=True, + lazy=True, + reminder_as_sys_msg=True, + ), ModelSettings( "gpt-4-0125-preview", "udiff", From 8f36dff6d8d4aaba74c3652632d7e75bdd345c45 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:32:40 -0700 Subject: [PATCH 02/50] Added _posts/2024-05-13-models-over-time.md. --- _posts/2024-05-13-models-over-time.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 _posts/2024-05-13-models-over-time.md diff --git a/_posts/2024-05-13-models-over-time.md b/_posts/2024-05-13-models-over-time.md new file mode 100644 index 000000000..ee9ce1508 --- /dev/null +++ b/_posts/2024-05-13-models-over-time.md @@ -0,0 +1,6 @@ +--- +title: LLM code editing skill over time +excerpt: A comparison of LLM code editing skill based on the release dates of the models. +--- +# LLM code editing skill over time + From 547a07fadc824ec9b6784fd5b12cfd9a1e62e2e0 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:32:41 -0700 Subject: [PATCH 03/50] aider: Added scatter plot of `edit_leaderboard` models with `released` dates in `_posts/2024-05-13-models-over-time.md`. # Aider chat conversation: USER: draw a scatter plot of the edit_leaderboard models which have `released` dates. With x as the release date, y as the `pass_rate_2` and label each point with the `model` name field. use a chart style similar to the bar graph in the leaderboard.md, but we want a scatter plot for this one. put the scatter plot in the new blog post ASSISTANT: Let's add the scatter plot to the new blog post in `_posts/2024-05-13-models-over-time.md`. Here is the *SEARCH/REPLACE* block to add the scatter plot: _posts/2024-05-13-models-over-time.md ```markdown <<<<<<< SEARCH # LLM code editing skill over time ======= # LLM code editing skill over time >>>>>>> REPLACE ``` --- _posts/2024-05-13-models-over-time.md | 66 +++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/_posts/2024-05-13-models-over-time.md b/_posts/2024-05-13-models-over-time.md index ee9ce1508..f2865c9fa 100644 --- a/_posts/2024-05-13-models-over-time.md +++ b/_posts/2024-05-13-models-over-time.md @@ -4,3 +4,69 @@ excerpt: A comparison of LLM code editing skill based on the release dates of th --- # LLM code editing skill over time + + + + From 23348603a9d142051bda5c9f4cc5c705fd645f52 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:36:32 -0700 Subject: [PATCH 04/50] aider: Create Dockerfile and scripts to build and run the Jekyll site locally using Docker. # Aider chat conversation: USER: i want to render my github pages jekyll site locally. in the scripts/ dir, make me a dockerfile and scripts to build and run it. ASSISTANT: To render your GitHub Pages Jekyll site locally using Docker, we need to create a Dockerfile and two scripts: one to build the Docker image and another to run the container. Here are the necessary files: 1. `scripts/Dockerfile` 2. `scripts/build.sh` 3. `scripts/run.sh` Let's create these files: scripts/Dockerfile ```python <<<<<<< SEARCH ======= # Use the official Jekyll image from Docker Hub FROM jekyll/jekyll:latest # Set the working directory WORKDIR /srv/jekyll # Copy the current directory contents into the container at /srv/jekyll COPY . /srv/jekyll # Install any needed packages specified in Gemfile RUN bundle install # Expose port 4000 to the host EXPOSE 4000 # Run Jekyll server CMD ["jekyll", "serve", "--host", "0.0.0.0"] >>>>>>> REPLACE ``` scripts/build.sh ```python <<<<<<< SEARCH ======= #!/bin/bash # Build the Docker image docker build -t my-jekyll-site -f scripts/Dockerfile . >>>>>>> REPLACE ``` scripts/run.sh ```python <<<<<<< SEARCH ======= #!/bin/bash # Run the Docker container docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 my-jekyll-site >>>>>>> REPLACE ``` These scripts will allow you to build and run your Jekyll site locally using Docker. To use them, navigate to your project directory and run: ```sh bash scripts/build.sh bash scripts/run.sh ``` This will build the Docker image and start a container that serves your Jekyll site on `http://localhost:4000`. --- scripts/Dockerfile | 17 +++++++++++++++++ scripts/build.sh | 4 ++++ scripts/run.sh | 4 ++++ 3 files changed, 25 insertions(+) create mode 100644 scripts/Dockerfile create mode 100644 scripts/build.sh create mode 100644 scripts/run.sh diff --git a/scripts/Dockerfile b/scripts/Dockerfile new file mode 100644 index 000000000..888a811ad --- /dev/null +++ b/scripts/Dockerfile @@ -0,0 +1,17 @@ +# Use the official Jekyll image from Docker Hub +FROM jekyll/jekyll:latest + +# Set the working directory +WORKDIR /srv/jekyll + +# Copy the current directory contents into the container at /srv/jekyll +COPY . /srv/jekyll + +# Install any needed packages specified in Gemfile +RUN bundle install + +# Expose port 4000 to the host +EXPOSE 4000 + +# Run Jekyll server +CMD ["jekyll", "serve", "--host", "0.0.0.0"] diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100644 index 000000000..d4622fae4 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# Build the Docker image +docker build -t my-jekyll-site -f scripts/Dockerfile . diff --git a/scripts/run.sh b/scripts/run.sh new file mode 100644 index 000000000..d1036ecb4 --- /dev/null +++ b/scripts/run.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# Run the Docker container +docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 my-jekyll-site From e41af1c28e10739fff9a342a4cbf00f4ef7633f3 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:38:58 -0700 Subject: [PATCH 05/50] aider: Added Gemfile for Jekyll site setup. # Aider chat conversation: USER: will this pickup the github pages jekyll site that is in this repy? Like the _layouts _data _posts etc dirs? ASSISTANT: Yes, the current Dockerfile and scripts should pick up the GitHub Pages Jekyll site, including directories like `_layouts`, `_data`, `_posts`, etc., because the `COPY . /srv/jekyll` command in the Dockerfile copies the entire current directory (which should include those directories) into the Docker container. However, to ensure everything works correctly, let's make sure the Dockerfile and scripts are set up to handle the Jekyll site properly. Here are the steps: 1. Ensure the Dockerfile is correctly set up to copy the entire site and install dependencies. 2. Ensure the build and run scripts are correctly set up to build the Docker image and run the container. Let's review the current state of the files and make any necessary adjustments. scripts/Dockerfile ```python # Use the official Jekyll image from Docker Hub FROM jekyll/jekyll:latest # Set the working directory WORKDIR /srv/jekyll # Copy the current directory contents into the container at /srv/jekyll COPY . /srv/jekyll # Install any needed packages specified in Gemfile RUN bundle install # Expose port 4000 to the host EXPOSE 4000 # Run Jekyll server CMD ["jekyll", "serve", "--host", "0.0.0.0"] ``` scripts/build.sh ```python #!/bin/bash # Build the Docker image docker build -t my-jekyll-site -f scripts/Dockerfile . ``` scripts/run.sh ```python #!/bin/bash # Run the Docker container docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 my-jekyll-site ``` These files should work as expected. The `COPY . /srv/jekyll` command in the Dockerfile will copy all the necessary Jekyll site files, including `_layouts`, `_data`, `_posts`, etc., into the Docker container. The `bundle install` command will install any dependencies specified in the `Gemfile`. To verify, you can run the following commands in your project directory: ```sh bash scripts/build.sh bash scripts/run.sh ``` This will build the Docker image and start a container that serves your Jekyll site on `http://localhost:4000`. If you encounter any issues, please let me know! USER: I ran this command: bash scripts/build.sh And got this output: #1 [internal] load build definition from Dockerfile #1 transferring dockerfile: 435B done #1 DONE 0.0s #2 [internal] load .dockerignore #2 transferring context: 101B 0.0s done #2 DONE 0.0s #3 [internal] load metadata for docker.io/jekyll/jekyll:latest #3 DONE 0.6s #4 [1/4] FROM docker.io/jekyll/jekyll:latest@sha256:400b8d1569f118bca8a3a09a25f32803b00a55d1ea241feaf5f904d66ca9c625 #4 DONE 0.0s #5 [internal] load build context #5 transferring context: 250.53kB 0.2s done #5 DONE 0.2s #6 [2/4] WORKDIR /srv/jekyll #6 CACHED #7 [3/4] COPY . /srv/jekyll #7 CACHED #8 [4/4] RUN bundle install #8 6.277 Could not locate Gemfile #8 ERROR: process "/bin/sh -c bundle install" did not complete successfully: exit code: 10 ------ > [4/4] RUN bundle install: #8 6.277 Could not locate Gemfile ------ Dockerfile:11 -------------------- 9 | 10 | # Install any needed packages specified in Gemfile 11 | >>> RUN bundle install 12 | 13 | # Expose port 4000 to the host -------------------- ERROR: failed to solve: process "/bin/sh -c bundle install" did not complete successfully: exit code: 10 ASSISTANT: The error indicates that the `Gemfile` is not being found in the context being copied into the Docker container. This could be because the `Gemfile` is not in the root directory of your project or it might be missing. To resolve this, we need to ensure that the `Gemfile` is present in the root directory of your project. If it is not, you should add it. If it is present, we need to make sure it is being copied correctly. Let's first verify that the `Gemfile` is in the root directory of your project. If it is not, please add it. If it is, we can proceed with the current Dockerfile and scripts. Assuming the `Gemfile` is present in the root directory, the Dockerfile should work as expected. If the `Gemfile` is in a different directory, please let me know its location so we can adjust the Dockerfile accordingly. If the `Gemfile` is missing, you can create a basic one with the following content: Gemfile ```ruby source 'https://rubygems.org' gem 'jekyll' ``` Once the `Gemfile` is in place, you can re-run the build script: ```sh bash scripts/build.sh ``` If you encounter any further issues, please let me know! USER: please make it ASSISTANT: Let's create the `Gemfile` in the root directory of your project. Gemfile ```ruby <<<<<<< SEARCH ======= source 'https://rubygems.org' gem 'jekyll' >>>>>>> REPLACE ``` This `Gemfile` specifies the source for Ruby gems and includes the `jekyll` gem, which is necessary for your Jekyll site. After adding this `Gemfile`, you can re-run the build script: ```sh bash scripts/build.sh ``` This should resolve the issue with the missing `Gemfile` and allow the Docker image to be built successfully. If you encounter any further issues, please let me know! --- Gemfile | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Gemfile diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..167ee20bb --- /dev/null +++ b/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gem 'jekyll' From a76bf0c9fa2939d7083bee57463914d7d8df040d Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:39:57 -0700 Subject: [PATCH 06/50] aider: Add the `-it` flag to the `docker run` command in `scripts/run.sh` to run the container in interactive mode. # Aider chat conversation: USER: bash scripts/run.sh ASSISTANT: Let's update the `scripts/run.sh` to ensure it correctly mounts the current directory and serves the Jekyll site. scripts/run.sh ```python <<<<<<< SEARCH #!/bin/bash # Run the Docker container docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 my-jekyll-site ======= #!/bin/bash # Run the Docker container docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 -it my-jekyll-site >>>>>>> REPLACE ``` This change adds the `-it` flag to the `docker run` command, which ensures that the container runs in interactive mode and allocates a pseudo-TTY. This can be useful for debugging and interacting with the Jekyll server if needed. --- scripts/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run.sh b/scripts/run.sh index d1036ecb4..44c1c91a4 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -1,4 +1,4 @@ #!/bin/bash # Run the Docker container -docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 my-jekyll-site +docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 -it my-jekyll-site From e57653c718a59dc705b553d9f4dc36d2b25ef2db Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:42:42 -0700 Subject: [PATCH 07/50] aider: Added jekyll-theme-cayman to the Gemfile to resolve missing theme error. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Aider chat conversation: USER: bash scripts/run.sh ASSISTANT: Let's ensure that the `scripts/run.sh` script correctly mounts the current directory and serves the Jekyll site. The script should already be set up correctly, but let's verify and make sure everything is in place. Here is the current content of `scripts/run.sh`: scripts/run.sh ```bash #!/bin/bash # Run the Docker container docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 -it my-jekyll-site ``` This script should work as expected. If you encounter any issues, please let me know! USER: I ran this command: bash scripts/run.sh And got this output: ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux-musl] Configuration file: /srv/jekyll/_config.yml  ------------------------------------------------  Jekyll 4.2.2 Please append `--trace` to the `serve` command   for any additional information or backtrace.   ------------------------------------------------ /usr/gem/gems/jekyll-4.2.2/lib/jekyll/theme.rb:82:in `rescue in gemspec': The jekyll-theme-cayman theme could not be found. (Jekyll::Errors::MissingDependencyException) from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/theme.rb:79:in `gemspec' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/theme.rb:19:in `root' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/theme.rb:13:in `initialize' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:510:in `new' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:510:in `configure_theme' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:60:in `config=' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:23:in `initialize' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:30:in `new' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:30:in `process' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `block in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/serve.rb:86:in `block (2 levels) in init_with_program' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `block in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `each' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:in `go' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary.rb:21:in `program' from /usr/gem/gems/jekyll-4.2.2/exe/jekyll:15:in `' from /usr/gem/bin/jekyll:25:in `load' from /usr/gem/bin/jekyll:25:in `
' /usr/local/lib/ruby/site_ruby/3.1.0/rubygems/dependency.rb:311:in `to_specs': Could not find 'jekyll-theme-cayman' (>= 0) among 97 total gem(s) (Gem::MissingSpecError) Checked in 'GEM_PATH=/home/jekyll/.local/share/gem/ruby/3.1.0:/usr/local/lib/ruby/gems/3.1.0:/usr/gem' , execute `gem env` for more information from /usr/local/lib/ruby/site_ruby/3.1.0/rubygems/dependency.rb:323:in `to_spec' from /usr/local/lib/ruby/site_ruby/3.1.0/rubygems/specification.rb:1021:in `find_by_name' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/theme.rb:80:in `gemspec' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/theme.rb:19:in `root' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/theme.rb:13:in `initialize' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:510:in `new' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:510:in `configure_theme' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:60:in `config=' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:23:in `initialize' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:30:in `new' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:30:in `process' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `block in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/serve.rb:86:in `block (2 levels) in init_with_program' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `block in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `each' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:in `go' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary.rb:21:in `program' from /usr/gem/gems/jekyll-4.2.2/exe/jekyll:15:in `' from /usr/gem/bin/jekyll:25:in `load' from /usr/gem/bin/jekyll:25:in `
' ASSISTANT: The error indicates that the `jekyll-theme-cayman` theme is missing. We need to add this theme to the `Gemfile` and ensure it is installed. Let's update the `Gemfile` to include the `jekyll-theme-cayman` theme. Gemfile ```ruby <<<<<<< SEARCH source 'https://rubygems.org' gem 'jekyll' ======= source 'https://rubygems.org' gem 'jekyll' gem 'jekyll-theme-cayman' >>>>>>> REPLACE ``` After updating the `Gemfile`, you should rebuild the Docker image to ensure the new dependencies are installed: ```sh bash scripts/build.sh ``` Then, you can run the container again: ```sh bash scripts/run.sh ``` This should resolve the issue with the missing theme. If you encounter any further issues, please let me know! --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 167ee20bb..8699b9c81 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,3 @@ source 'https://rubygems.org' gem 'jekyll' +gem 'jekyll-theme-cayman' From c0ccd2cb1f46259a06ccfa41317146d91edf3ccf Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:44:18 -0700 Subject: [PATCH 08/50] added release dates --- _data/edit_leaderboard.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/_data/edit_leaderboard.yml b/_data/edit_leaderboard.yml index dd0d5695e..64722b334 100644 --- a/_data/edit_leaderboard.yml +++ b/_data/edit_leaderboard.yml @@ -1,6 +1,7 @@ - dirname: 2024-05-01-20-05-59--direct-opus-filenames-outside-fence test_cases: 133 model: claude-3-opus-20240229 + released: 2024-02-29 edit_format: diff commit_hash: f4b1797-dirty, f4b1797 pass_rate_1: 53.4 @@ -19,9 +20,11 @@ versions: 0.30.2-dev seconds_per_case: 32.4 total_cost: 13.8395 + - dirname: 2024-03-06-16-42-00--claude3-sonnet-whole test_cases: 133 model: claude-3-sonnet-20240229 + released: 2024-02-29 edit_format: whole commit_hash: a5f8076-dirty pass_rate_1: 43.6 @@ -40,9 +43,11 @@ versions: 0.25.1-dev seconds_per_case: 23.1 total_cost: 0.0000 + - dirname: 2024-04-29-19-17-28--deepseek-coder-whole test_cases: 132 model: deepseek-coder + released: 2024-01-25 edit_format: whole commit_hash: c07f793-dirty pass_rate_1: 47.0 @@ -61,6 +66,7 @@ versions: 0.30.2-dev seconds_per_case: 26.7 total_cost: 0.0000 + - dirname: 2024-05-03-20-47-24--gemini-1.5-pro-diff-fenced test_cases: 133 model: gemini-1.5-pro-latest @@ -86,6 +92,7 @@ - dirname: 2024-05-08-20-59-15--may-gpt-3.5-turbo-whole test_cases: 133 model: gpt-3.5-turbo-0125 + released: 2024-01-25 edit_format: whole commit_hash: 1d55f74 pass_rate_1: 41.4 @@ -108,6 +115,7 @@ - dirname: 2023-11-06-21-23-59--gpt-3.5-turbo-0301 test_cases: 133 model: gpt-3.5-turbo-0301 + released: 2023-03-01 edit_format: whole commit_hash: 44388db-dirty pass_rate_1: 50.4 @@ -126,9 +134,11 @@ versions: 0.16.4-dev seconds_per_case: 6.5 total_cost: 0.4822 + - dirname: 2023-11-07-02-41-07--gpt-3.5-turbo-0613 test_cases: 133 model: gpt-3.5-turbo-0613 + released: 2023-06-13 edit_format: whole commit_hash: 93aa497-dirty pass_rate_1: 38.3 @@ -168,9 +178,11 @@ versions: 0.30.2-dev seconds_per_case: 5.3 total_cost: 0.3261 + - dirname: 2024-01-25-23-37-15--jan-exercism-gpt-4-0125-preview-udiff test_cases: 133 model: gpt-4-0125-preview + released: 2024-01-25 edit_format: udiff commit_hash: edcf9b1 pass_rate_1: 55.6 @@ -189,9 +201,11 @@ versions: 0.22.1-dev seconds_per_case: 44.8 total_cost: 14.6428 + - dirname: 2024-05-04-15-07-30--redo-gpt-4-0314-diff-reminder-rules test_cases: 133 model: gpt-4-0314 + released: 2023-03-14 edit_format: diff commit_hash: 0d43468 pass_rate_1: 50.4 @@ -210,9 +224,11 @@ versions: 0.31.2-dev seconds_per_case: 19.8 total_cost: 16.2689 + - dirname: 2023-12-16-21-24-28--editblock-gpt-4-0613-actual-main test_cases: 133 model: gpt-4-0613 + released: 2023-06-13 edit_format: diff commit_hash: 3aa17c4 pass_rate_1: 46.6 @@ -235,6 +251,7 @@ - dirname: 2024-05-08-21-16-03--may-gpt-4-1106-preview-udiff test_cases: 133 model: gpt-4-1106-preview + released: 2023-11-06 edit_format: udiff commit_hash: 87664dc pass_rate_1: 51.9 @@ -257,6 +274,7 @@ - dirname: 2024-05-01-02-09-20--gpt-4-turbo-examples test_cases: 133 model: gpt-4-turbo-2024-04-09 + released: 2024-04-09 edit_format: udiff commit_hash: e610e5b-dirty pass_rate_1: 48.1 @@ -275,9 +293,11 @@ versions: 0.30.2-dev seconds_per_case: 22.8 total_cost: 6.3337 + - dirname: 2024-05-03-22-24-48--openrouter--llama3-diff-examples-sys-msg test_cases: 132 model: llama3-70b-8192 + released: 2024-04-18 edit_format: diff commit_hash: b5bb453 pass_rate_1: 38.6 @@ -296,9 +316,11 @@ versions: 0.31.2-dev seconds_per_case: 14.5 total_cost: 0.4311 + - dirname: 2024-05-06-18-31-08--command-r-plus-whole-final test_cases: 133 model: command-r-plus + released: 2024-04-04 edit_format: whole commit_hash: fc3a43e-dirty pass_rate_1: 21.8 @@ -317,9 +339,11 @@ versions: 0.31.2-dev seconds_per_case: 22.9 total_cost: 2.7494 + - dirname: 2024-05-07-12-55-06--deepseek-chat-v2-whole test_cases: 133 model: deepseek-chat v2 (whole) + released: 2024-05-06 edit_format: whole commit_hash: b1cae73, db994fb pass_rate_1: 50.4 @@ -342,6 +366,7 @@ - dirname: 2024-05-09-18-57-52--deepseek-chat-v2-diff-reverted-and-helpful-assistant2 test_cases: 133 model: deepseek-chat v2 (diff) + released: 2024-05-06 edit_format: diff commit_hash: 80a3f6d pass_rate_1: 44.4 @@ -364,6 +389,7 @@ - dirname: 2024-05-07-20-32-37--qwen1.5-110b-chat-whole test_cases: 133 model: qwen1.5-110b-chat + released: 2024-02-04 edit_format: whole commit_hash: 70b1c0c pass_rate_1: 30.8 @@ -382,6 +408,7 @@ versions: 0.31.2-dev seconds_per_case: 46.9 total_cost: 0.0000 + - dirname: 2024-05-07-20-57-04--wizardlm-2-8x22b-whole test_cases: 133 model: WizardLM-2 8x22B @@ -407,6 +434,7 @@ - dirname: 2024-05-13-17-39-05--gpt-4o-diff test_cases: 133 model: gpt-4o + released: 2024-05-13 edit_format: diff commit_hash: b6cd852 pass_rate_1: 60.2 From f36bcd9b73f539df0627c3c45f3573c88b404e77 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:45:11 -0700 Subject: [PATCH 09/50] Added gpt-4-turbo-2024-04-09 (udiff) to the leaderboard --- _data/edit_leaderboard.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/_data/edit_leaderboard.yml b/_data/edit_leaderboard.yml index dd0d5695e..dec866afe 100644 --- a/_data/edit_leaderboard.yml +++ b/_data/edit_leaderboard.yml @@ -426,3 +426,24 @@ seconds_per_case: 6.0 total_cost: 0.0000 +- dirname: 2024-04-12-22-11-22--gpt-4-turbo-2024-04-09-plain-udiff + test_cases: 133 + model: gpt-4-turbo-2024-04-09 (udiff) + edit_format: udiff + commit_hash: 9b2e697-dirty + pass_rate_1: 44.4 + pass_rate_2: 60.9 + percent_cases_well_formed: 82.0 + error_outputs: 72 + num_malformed_responses: 24 + user_asks: 0 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 4 + exhausted_context_windows: 0 + test_timeouts: 5 + command: aider --model gpt-4-turbo-2024-04-09 + date: 2024-04-12 + versions: 0.28.1-dev + seconds_per_case: 22.0 + total_cost: 6.3924 \ No newline at end of file From efc9e56b23440a60cc5bae6adaa0406ba4021682 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:46:13 -0700 Subject: [PATCH 10/50] cleanup --- _data/edit_leaderboard.yml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/_data/edit_leaderboard.yml b/_data/edit_leaderboard.yml index dec866afe..dd0d5695e 100644 --- a/_data/edit_leaderboard.yml +++ b/_data/edit_leaderboard.yml @@ -426,24 +426,3 @@ seconds_per_case: 6.0 total_cost: 0.0000 -- dirname: 2024-04-12-22-11-22--gpt-4-turbo-2024-04-09-plain-udiff - test_cases: 133 - model: gpt-4-turbo-2024-04-09 (udiff) - edit_format: udiff - commit_hash: 9b2e697-dirty - pass_rate_1: 44.4 - pass_rate_2: 60.9 - percent_cases_well_formed: 82.0 - error_outputs: 72 - num_malformed_responses: 24 - user_asks: 0 - lazy_comments: 0 - syntax_errors: 0 - indentation_errors: 4 - exhausted_context_windows: 0 - test_timeouts: 5 - command: aider --model gpt-4-turbo-2024-04-09 - date: 2024-04-12 - versions: 0.28.1-dev - seconds_per_case: 22.0 - total_cost: 6.3924 \ No newline at end of file From 6d2b9d6699ebec73ec2a664bba64567026eb5eec Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:49:38 -0700 Subject: [PATCH 11/50] Added gpt-4-turbo-2024-04-09 (diff) to the leaderboard --- _data/edit_leaderboard.yml | 22 ++++++++++++++++++++++ _data/refactor_leaderboard.yml | 25 ++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/_data/edit_leaderboard.yml b/_data/edit_leaderboard.yml index dd0d5695e..691214ee8 100644 --- a/_data/edit_leaderboard.yml +++ b/_data/edit_leaderboard.yml @@ -426,3 +426,25 @@ seconds_per_case: 6.0 total_cost: 0.0000 +- dirname: 2024-04-12-22-18-20--gpt-4-turbo-2024-04-09-plain-diff + test_cases: 33 + model: gpt-4-turbo-2024-04-09 (diff) + edit_format: diff + commit_hash: 9b2e697-dirty + pass_rate_1: 48.5 + pass_rate_2: 57.6 + percent_cases_well_formed: 100.0 + error_outputs: 15 + num_malformed_responses: 0 + user_asks: 15 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 0 + command: aider --model gpt-4-turbo-2024-04-09 + date: 2024-04-12 + versions: 0.28.1-dev + seconds_per_case: 17.6 + total_cost: 1.6205 + \ No newline at end of file diff --git a/_data/refactor_leaderboard.yml b/_data/refactor_leaderboard.yml index 8b3816a1d..22d1fb666 100644 --- a/_data/refactor_leaderboard.yml +++ b/_data/refactor_leaderboard.yml @@ -120,4 +120,27 @@ date: 2024-05-13 versions: 0.34.1-dev seconds_per_case: 27.8 - total_cost: 0.0000 \ No newline at end of file + total_cost: 0.0000 + +- dirname: 2024-04-10-13-26-18--refac-gpt-4-turbo-2024-04-09-diff + test_cases: 88 + model: gpt-4-turbo-2024-04-09 (diff) + edit_format: diff + commit_hash: 7875418 + pass_rate_1: 21.4 + percent_cases_well_formed: 6.8 + error_outputs: 247 + num_malformed_responses: 82 + user_asks: 1 + lazy_comments: 2 + syntax_errors: 3 + indentation_errors: 8 + exhausted_context_windows: 0 + test_timeouts: 0 + command: aider --model gpt-4-turbo-2024-04-09 + date: 2024-04-10 + versions: 0.28.1-dev + seconds_per_case: 67.8 + total_cost: 20.4889 + + \ No newline at end of file From 46afd4e0e21f46815ebbf31d35ab825da0a66794 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:50:47 -0700 Subject: [PATCH 12/50] added (udiff) label --- _data/edit_leaderboard.yml | 2 +- _data/refactor_leaderboard.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_data/edit_leaderboard.yml b/_data/edit_leaderboard.yml index 691214ee8..0be7aaf59 100644 --- a/_data/edit_leaderboard.yml +++ b/_data/edit_leaderboard.yml @@ -256,7 +256,7 @@ - dirname: 2024-05-01-02-09-20--gpt-4-turbo-examples test_cases: 133 - model: gpt-4-turbo-2024-04-09 + model: gpt-4-turbo-2024-04-09 (udiff) edit_format: udiff commit_hash: e610e5b-dirty pass_rate_1: 48.1 diff --git a/_data/refactor_leaderboard.yml b/_data/refactor_leaderboard.yml index 22d1fb666..db4d3483f 100644 --- a/_data/refactor_leaderboard.yml +++ b/_data/refactor_leaderboard.yml @@ -40,7 +40,7 @@ total_cost: 27.9176 - dirname: 2024-04-09-21-49-54--refac-gpt-4-turbo-2024-04-09 test_cases: 88 - model: gpt-4-turbo-2024-04-09 + model: gpt-4-turbo-2024-04-09 (udiff) edit_format: udiff commit_hash: b75fdb9 pass_rate_1: 34.1 From 8804bc00fd7002c33c416ab9fec66823a3f9b68b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 09:59:21 -0700 Subject: [PATCH 13/50] aider: Add jekyll-redirect-from gem to Gemfile to resolve missing dependency error. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Aider chat conversation: USER: I ran this command: bash scripts/run.sh And got this output: ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux-musl] Configuration file: /srv/jekyll/_config.yml  Dependency Error: Yikes! It looks like you don't have jekyll-redirect-from or one of its dependencies installed. In order to use Jekyll as currently configured, you'll need to install this gem. If you've run Jekyll with `bundle exec`, ensure that you have included the jekyll-redirect-from gem in your Gemfile as well. The full error message from Ruby is: 'cannot load such file -- jekyll-redirect-from' If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/!   ------------------------------------------------  Jekyll 4.2.2 Please append `--trace` to the `serve` command   for any additional information or backtrace.   ------------------------------------------------ /usr/gem/gems/jekyll-4.2.2/lib/jekyll/external.rb:73:in `rescue in block in require_with_graceful_fail': jekyll-redirect-from (Jekyll::Errors::MissingDependencyException) from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/external.rb:58:in `block in require_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/external.rb:57:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/external.rb:57:in `require_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/plugin_manager.rb:30:in `require_gems' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/plugin_manager.rb:22:in `conscientious_require' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:131:in `setup' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:36:in `initialize' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:30:in `new' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:30:in `process' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `block in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/serve.rb:86:in `block (2 levels) in init_with_program' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `block in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `each' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:in `go' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary.rb:21:in `program' from /usr/gem/gems/jekyll-4.2.2/exe/jekyll:15:in `' from /usr/local/bundle/bin/jekyll:27:in `load' from /usr/local/bundle/bin/jekyll:27:in `
' /usr/gem/gems/jekyll-4.2.2/lib/jekyll/external.rb:60:in `require': cannot load such file -- jekyll-redirect-from (LoadError) from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/external.rb:60:in `block in require_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/external.rb:57:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/external.rb:57:in `require_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/plugin_manager.rb:30:in `require_gems' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/plugin_manager.rb:22:in `conscientious_require' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:131:in `setup' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:36:in `initialize' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:30:in `new' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:30:in `process' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `block in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/serve.rb:86:in `block (2 levels) in init_with_program' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `block in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `each' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:in `go' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary.rb:21:in `program' from /usr/gem/gems/jekyll-4.2.2/exe/jekyll:15:in `' from /usr/local/bundle/bin/jekyll:27:in `load' from /usr/local/bundle/bin/jekyll:27:in `
' ASSISTANT: To resolve the missing `jekyll-redirect-from` gem error, we need to add it to the `Gemfile` and then rebuild the Docker image. Here are the changes: Gemfile ```ruby <<<<<<< SEARCH gem 'jekyll-theme-cayman' ======= gem 'jekyll-theme-cayman' gem 'jekyll-redirect-from' >>>>>>> REPLACE ``` After updating the `Gemfile`, you should rebuild the Docker image to ensure the new dependencies are installed: ```sh bash scripts/build.sh ``` Then, you can run the container again: ```sh bash scripts/run.sh ``` This should resolve the issue with the missing `jekyll-redirect-from` gem. If you encounter any further issues, please let me know! --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 8699b9c81..22c9a2738 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,4 @@ source 'https://rubygems.org' gem 'jekyll' gem 'jekyll-theme-cayman' +gem 'jekyll-redirect-from' From 3fb32f5bb881799aea0ade6f9f588a2a3f588f56 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:03:22 -0700 Subject: [PATCH 14/50] aider: Add missing dependencies by updating the Gemfile to include 'jekyll-sitemap'. # Aider chat conversation: USER: add all the missing dependencies ASSISTANT: To add all the missing dependencies, we need to update the `Gemfile` to include the required plugins mentioned in `_config.yml`. Specifically, we need to add `jekyll-sitemap`. Here are the changes: Gemfile ```ruby <<<<<<< SEARCH gem 'jekyll-redirect-from' ======= gem 'jekyll-redirect-from' gem 'jekyll-sitemap' >>>>>>> REPLACE ``` After updating the `Gemfile`, you should rebuild the Docker image to ensure the new dependencies are installed: ```sh bash scripts/build.sh ``` Then, you can run the container again: ```sh bash scripts/run.sh ``` This should resolve the issue with the missing dependencies. If you encounter any further issues, please let me know! --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 22c9a2738..4bbe4a2ef 100644 --- a/Gemfile +++ b/Gemfile @@ -2,3 +2,4 @@ source 'https://rubygems.org' gem 'jekyll' gem 'jekyll-theme-cayman' gem 'jekyll-redirect-from' +gem 'jekyll-sitemap' From 1fcd4e73c6afa3e76e2154033fb144360174114c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:08:05 -0700 Subject: [PATCH 15/50] aider: Update _config.yml to exclude unnecessary directories and files. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Aider chat conversation: USER: I ran this command: bash scripts/run.sh And got this output: ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux-musl] Configuration file: /srv/jekyll/_config.yml Source: /srv/jekyll Destination: /srv/jekyll/_site Incremental build: disabled. Enable with --incremental Generating...  ------------------------------------------------  Jekyll 4.2.2 Please append `--trace` to the `serve` command   for any additional information or backtrace.   ------------------------------------------------ /usr/gem/gems/jekyll-4.2.2/lib/jekyll/utils.rb:141:in `initialize': No such file or directory @ rb_sysopen - /srv/jekyll/tmp.benchmarks/practice.exercise (Errno::ENOENT) from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/utils.rb:141:in `open' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/utils.rb:141:in `has_yaml_header?' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/reader.rb:52:in `block in read_directories' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/reader.rb:48:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/reader.rb:48:in `read_directories' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/reader.rb:89:in `block in retrieve_dirs' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/reader.rb:86:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/reader.rb:86:in `retrieve_dirs' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/reader.rb:60:in `read_directories' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/reader.rb:16:in `read' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:181:in `read' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/site.rb:78:in `process' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:28:in `process_site' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:65:in `build' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/build.rb:36:in `process' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `block in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `each' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/command.rb:91:in `process_with_graceful_fail' from /usr/gem/gems/jekyll-4.2.2/lib/jekyll/commands/serve.rb:86:in `block (2 levels) in init_with_program' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `block in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `each' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:in `go' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary.rb:21:in `program' from /usr/gem/gems/jekyll-4.2.2/exe/jekyll:15:in `' from /usr/local/bundle/bin/jekyll:27:in `load' from /usr/local/bundle/bin/jekyll:27:in `
' ASSISTANT: The error message indicates that Jekyll is trying to open a file that doesn't exist: `/srv/jekyll/tmp.benchmarks/practice.exercise`. This suggests that there might be some configuration or file reference in your Jekyll setup that is pointing to a non-existent file. To resolve this, we can: 1. Ensure that the `tmp.benchmarks/practice.exercise` file exists in your project directory. 2. If this file is not needed, we can remove or update the configuration that references it. Let's start by checking the `_config.yml` file for any references to `tmp.benchmarks/practice.exercise`. Please add `_config.yml` to the chat if you want me to check and edit it. USER: how can i tell jekyll to ignore certain directories? i only want it to build pages in `docs` and `_posts` using the `_layouts` and `_data` dirs as needed. it also needs `_config.yml` but i don't think it needs anything else ASSISTANT: To instruct Jekyll to ignore certain directories, you can use the `exclude` option in your `_config.yml` file. This option allows you to specify directories and files that Jekyll should ignore when building the site. Here is how you can update your `_config.yml` to exclude all directories except `docs`, `_posts`, `_layouts`, `_data`, and `_config.yml`: _config.yml ```yaml <<<<<<< SEARCH theme: jekyll-theme-cayman url: "https://aider.chat" plugins: - jekyll-redirect-from - jekyll-sitemap defaults: - scope: path: "README.md" type: "pages" values: description: "A command-line chat tool for coding with GPT" ======= theme: jekyll-theme-cayman url: "https://aider.chat" plugins: - jekyll-redirect-from - jekyll-sitemap defaults: - scope: path: "README.md" type: "pages" values: description: "A command-line chat tool for coding with GPT" exclude: - tmp.benchmarks - scripts - Gemfile - Gemfile.lock - README.md - other_directories_or_files_to_exclude >>>>>>> REPLACE ``` This configuration will ensure that Jekyll only processes the necessary directories and files, and ignores the rest. You can add any other directories or files you want to exclude to the `exclude` list. --- _config.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/_config.yml b/_config.yml index 3779e1384..f54b4f17a 100644 --- a/_config.yml +++ b/_config.yml @@ -11,3 +11,11 @@ defaults: type: "pages" values: description: "A command-line chat tool for coding with GPT" + +exclude: + - tmp.benchmarks + - scripts + - Gemfile + - Gemfile.lock + - README.md + - other_directories_or_files_to_exclude From 218bda7d30718417df2c5a68c8ae942846099b6e Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:10:15 -0700 Subject: [PATCH 16/50] Added a large number of files and directories to the exclusion list in the config file. --- _config.yml | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) diff --git a/_config.yml b/_config.yml index f54b4f17a..6604982b4 100644 --- a/_config.yml +++ b/_config.yml @@ -19,3 +19,154 @@ exclude: - Gemfile.lock - README.md - other_directories_or_files_to_exclude +CNAME +CONTRIBUTING.md +Dockerfile~ +Gemfile +Gemfile.lock +HISTORY.md +HISTORY.md~ +LICENSE.txt +MANIFEST.in +OLD +README.md +__pycache__ +_config.yml +_config.yml~ +_data +_layouts +_posts +_site +aider +aider_chat.egg-info +assets +badedit.md~ +benchmark +blog +branches_to_delete.txt~ +bug.md~ +bug2.md~ +build +current.txt~ +desired.txt~ +dev-requirements.in +dev-requirements.in~ +dev-requirements.txt +docker +docs +examples +indent.md~ +no-dots-edit.md~ +pytest.ini +pytest.ini~ +raggit.py~ +requirements.in +requirements.in~ +requirements.txt +rqh.py~ +scripts +setup.py +share +tests +tmp +tmp.0125.graphs.sh +tmp.0125.graphs.sh~ +tmp.CONTRIBUTING.md +tmp.README.md +tmp.after +tmp.after2 +tmp.after~ +tmp.all +tmp.all-lazy-exercises +tmp.all-lazy-exercises~ +tmp.all-lazy-files +tmp.all-lazy-files.new +tmp.all-lazy-files.new.top17 +tmp.applied +tmp.before +tmp.before~ +tmp.benchmarks +tmp.claude3.graphs.sh +tmp.claude3.graphs.sh~ +tmp.convo +tmp.convo~ +tmp.diff +tmp.diff~ +tmp.du +tmp.edit.json +tmp.edit.md +tmp.edit.md~ +tmp.elides +tmp.err +tmp.foo.py +tmp.gast.storage +tmp.gemini.29eb2f4 +tmp.gemini.cleaned-up +tmp.gitlog +tmp.gpt-4-turbo-2024-04-09.graphs.sh +tmp.gpt-4-turbo-2024-04-09.graphs.sh~ +tmp.history +tmp.html +tmp.in +tmp.issue.html +tmp.issue.html~ +tmp.issue.md +tmp.issue.txt +tmp.jpg +tmp.json +tmp.kernel.py +tmp.last-edit.md +tmp.llama.storage-git +tmp.map +tmp.md +tmp.new +tmp.noop.yml +tmp.noop.yml~ +tmp.number.json +tmp.number.json~ +tmp.old +tmp.out +tmp.paasio +tmp.pdf +tmp.png +tmp.pricing.md +tmp.prof +tmp.py +tmp.py~ +tmp.refactor +tmp.replace-lines +tmp.response +tmp.search_replace_diff.html +tmp.sed +tmp.server.py +tmp.sh +tmp.share.md +tmp.share.md~ +tmp.sh~ +tmp.sitemap.xml +tmp.skill.sh +tmp.skill.sh~ +tmp.slim.html +tmp.space space.txt +tmp.speed.sh +tmp.speed.sh~ +tmp.st.py +tmp.st.py~ +tmp.subdir +tmp.summary +tmp.svg +tmp.sync.sh +tmp.sync.sh~ +tmp.timing +tmp.ts-pr.md +tmp.ts-pr.md~ +tmp.txt +tmp.udiff.graphs.sh +tmp.udiff.graphs.sh~ +tmp.udiff.sh +tmp.udiff.sh~ +tmp.unterminated.json +tmp.windows.txt +tmp.windows.txt~ +tmp.xxx +tmp_timing.svg From 6e4eb9fceae0cbd39aa8e7a32225b7f66f996898 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:10:16 -0700 Subject: [PATCH 17/50] aider: Updated _config.yml to exclude all directories and files except specific ones using wildcards. # Aider chat conversation: USER: can i "include" rather than "exclude" ASSISTANT: Jekyll does not have a built-in `include` option, but you can achieve the same effect by using the `exclude` option to exclude everything except the directories and files you want to include. To do this, you can list all the directories and files you want to exclude in the `_config.yml` file. Here is how you can update your `_config.yml` to exclude all directories and files except `docs`, `_posts`, `_layouts`, `_data`, and `_config.yml`: _config.yml ```yaml <<<<<<< SEARCH theme: jekyll-theme-cayman url: "https://aider.chat" plugins: - jekyll-redirect-from - jekyll-sitemap defaults: - scope: path: "README.md" type: "pages" values: description: "A command-line chat tool for coding with GPT" exclude: - tmp.benchmarks - scripts - Gemfile - Gemfile.lock - README.md - other_directories_or_files_to_exclude ======= theme: jekyll-theme-cayman url: "https://aider.chat" plugins: - jekyll-redirect-from - jekyll-sitemap defaults: - scope: path: "README.md" type: "pages" values: description: "A command-line chat tool for coding with GPT" exclude: - CNAME - CONTRIBUTING.md - Dockerfile~ - Gemfile - Gemfile.lock - HISTORY.md - HISTORY.md~ - LICENSE.txt - MANIFEST.in - OLD - README.md - __pycache__ - _config.yml~ - aider - aider_chat.egg-info - assets - badedit.md~ - benchmark - blog - branches_to_delete.txt~ - bug.md~ - bug2.md~ - build - current.txt~ - desired.txt~ - dev-requirements.in - dev-requirements.in~ - dev-requirements.txt - docker - examples - indent.md~ - no-dots-edit.md~ - pytest.ini - pytest.ini~ - raggit.py~ - requirements.in - requirements.in~ - requirements.txt - rqh.py~ - scripts - setup.py - share - tests - tmp - tmp.0125.graphs.sh - tmp.0125.graphs.sh~ - tmp.CONTRIBUTING.md - tmp.README.md - tmp.after - tmp.after2 - tmp.after~ - tmp.all - tmp.all-lazy-exercises - tmp.all-lazy-exercises~ - tmp.all-lazy-files - tmp.all-lazy-files.new - tmp.all-lazy-files.new.top17 - tmp.applied - tmp.before - tmp.before~ - tmp.benchmarks - tmp.claude3.graphs.sh - tmp.claude3.graphs.sh~ - tmp.convo - tmp.convo~ - tmp.diff - tmp.diff~ - tmp.du - tmp.edit.json - tmp.edit.md - tmp.edit.md~ - tmp.elides - tmp.err - tmp.foo.py - tmp.gast.storage - tmp.gemini.29eb2f4 - tmp.gemini.cleaned-up - tmp.gitlog - tmp.gpt-4-turbo-2024-04-09.graphs.sh - tmp.gpt-4-turbo-2024-04-09.graphs.sh~ - tmp.history - tmp.html - tmp.in - tmp.issue.html - tmp.issue.html~ - tmp.issue.md - tmp.issue.txt - tmp.jpg - tmp.json - tmp.kernel.py - tmp.last-edit.md - tmp.llama.storage-git - tmp.map - tmp.md - tmp.new - tmp.noop.yml - tmp.noop.yml~ - tmp.number.json - tmp.number.json~ - tmp.old - tmp.out - tmp.paasio - tmp.pdf - tmp.png - tmp.pricing.md - tmp.prof - tmp.py - tmp.py~ - tmp.refactor - tmp.replace-lines - tmp.response - tmp.search_replace_diff.html - tmp.sed - tmp.server.py - tmp.sh - tmp.share.md - tmp.share.md~ - tmp.sh~ - tmp.sitemap.xml - tmp.skill.sh - tmp.skill.sh~ - tmp.slim.html - tmp.space space.txt - tmp.speed.sh - tmp.speed.sh~ - tmp.st.py - tmp.st.py~ - tmp.subdir - tmp.summary - tmp.svg - tmp.sync.sh - tmp.sync.sh~ - tmp.timing - ^C KeyboardInterrupt USER: can exclude use wildcards? ASSISTANT: Yes, Jekyll's `exclude` option can use wildcards to specify patterns for files and directories to exclude. This can simplify the configuration significantly. Here is how you can update your `_config.yml` to exclude all directories and files except `docs`, `_posts`, `_layouts`, `_data`, and `_config.yml` using wildcards: _config.yml ```yaml <<<<<<< SEARCH theme: jekyll-theme-cayman url: "https://aider.chat" plugins: - jekyll-redirect-from - jekyll-sitemap defaults: - scope: path: "README.md" type: "pages" values: description: "A command-line chat tool for coding with GPT" exclude: - tmp.benchmarks - scripts - Gemfile - Gemfile.lock - README.md - other_directories_or_files_to_exclude ======= theme: jekyll-theme-cayman url: "https://aider.chat" plugins: - jekyll-redirect-from - jekyll-sitemap defaults: - scope: path: "README.md" type: "pages" values: description: "A command-line chat tool for coding with GPT" exclude: - "*" - "!docs" - "!_posts" - "!_layouts" - "!_data" - "!_config.yml" >>>>>>> REPLACE ``` This configuration will exclude all files and directories by default (`"*"`), but include the specified directories and files (`"!docs"`, `"!_posts"`, `"!_layouts"`, `"!_data"`, `"!_config.yml"`). --- _config.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/_config.yml b/_config.yml index 6604982b4..8364faf2f 100644 --- a/_config.yml +++ b/_config.yml @@ -13,12 +13,12 @@ defaults: description: "A command-line chat tool for coding with GPT" exclude: - - tmp.benchmarks - - scripts - - Gemfile - - Gemfile.lock - - README.md - - other_directories_or_files_to_exclude + - "*" + - "!docs" + - "!_posts" + - "!_layouts" + - "!_data" + - "!_config.yml" CNAME CONTRIBUTING.md Dockerfile~ From 7a1656ecc06d8fc3879b2604314279e0aec0e455 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:11:11 -0700 Subject: [PATCH 18/50] aider: Add health check to Dockerfile for Jekyll server. # Aider chat conversation: USER: $ bash scripts/run.sh ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux-musl] Configuration file: /srv/jekyll/_config.yml Source: /srv/jekyll Destination: /srv/jekyll/_site Incremental build: disabled. Enable with --incremental Generating... done in 56.634 seconds. ASSISTANT: It looks like the Jekyll site is generating successfully. If you need any further changes or encounter any issues, please let me know! USER: how do i see the site? ASSISTANT: To see the site, you need to access it via a web browser. The Jekyll server is running inside the Docker container and is exposed on port 4000. You can access it by navigating to `http://localhost:4000` in your web browser. Here are the steps to follow: 1. Ensure the Docker container is running by executing the `bash scripts/run.sh` command. 2. Open a web browser. 3. Navigate to `http://localhost:4000`. This should display your Jekyll site. If you encounter any issues, please let me know! USER: Safari can't open page ASSISTANT: If Safari can't open the page, it might be due to a few reasons. Let's troubleshoot step-by-step: 1. **Check if the Docker container is running**: Ensure that the Docker container is still running. You can do this by running `docker ps` in your terminal. You should see a container with the name `my-jekyll-site` and the port mapping `0.0.0.0:4000->4000/tcp`. 2. **Check for any errors in the terminal**: Look at the terminal where you ran `bash scripts/run.sh` for any error messages. 3. **Check if the port is correctly exposed**: Ensure that the port 4000 is correctly exposed and mapped to your host machine. 4. **Try accessing the site using a different browser**: Sometimes, browser-specific issues can prevent access. Try using a different browser like Chrome or Firefox. 5. **Check firewall settings**: Ensure that your firewall settings are not blocking port 4000. If everything seems correct and you still can't access the site, let's add a step to the Dockerfile to ensure the server is running correctly. Here is an updated `scripts/Dockerfile` to include a health check: scripts/Dockerfile ```dockerfile <<<<<<< SEARCH # Use the official Jekyll image from Docker Hub FROM jekyll/jekyll:latest # Set the working directory WORKDIR /srv/jekyll # Copy the current directory contents into the container at /srv/jekyll COPY . /srv/jekyll # Install any needed packages specified in Gemfile RUN bundle install # Expose port 4000 to the host EXPOSE 4000 # Run Jekyll server CMD ["jekyll", "serve", "--host", "0.0.0.0"] ======= # Use the official Jekyll image from Docker Hub FROM jekyll/jekyll:latest # Set the working directory WORKDIR /srv/jekyll # Copy the current directory contents into the container at /srv/jekyll COPY . /srv/jekyll # Install any needed packages specified in Gemfile RUN bundle install # Expose port 4000 to the host EXPOSE 4000 # Health check to ensure the server is running HEALTHCHECK --interval=30s --timeout=10s --start-period=5s CMD curl -f http://localhost:4000 || exit 1 # Run Jekyll server CMD ["jekyll", "serve", "--host", "0.0.0.0"] >>>>>>> REPLACE ``` After updating the Dockerfile, rebuild the Docker image and run the container again: ```sh bash scripts/build.sh bash scripts/run.sh ``` Then try accessing `http://localhost:4000` again. If you still encounter issues, please let me know! --- scripts/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/Dockerfile b/scripts/Dockerfile index 888a811ad..d4f6b6316 100644 --- a/scripts/Dockerfile +++ b/scripts/Dockerfile @@ -13,5 +13,8 @@ RUN bundle install # Expose port 4000 to the host EXPOSE 4000 +# Health check to ensure the server is running +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s CMD curl -f http://localhost:4000 || exit 1 + # Run Jekyll server CMD ["jekyll", "serve", "--host", "0.0.0.0"] From d64928bc04e4926bddb9044efd6b49a4957d3ece Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:15:51 -0700 Subject: [PATCH 19/50] aider: Updated Dockerfile to explicitly bind Jekyll to `0.0.0.0` and port `4000`. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Aider chat conversation: USER: I did `git reset --hard HEAD~1` to discard the last edits. Please wait for further instructions before attempting that change again. Feel free to ask relevant questions about why the changes were reverted. ASSISTANT: Understood. If you have any specific instructions or further changes you'd like to make, please let me know! If you have any questions about why the previous changes were reverted or need assistance with something else, feel free to ask. USER: $ curl http://localhost:4000 curl: (52) Empty reply from server ASSISTANT: The "Empty reply from server" error indicates that the server is not responding correctly. Let's troubleshoot this step-by-step: 1. **Check if the Jekyll server is running inside the Docker container**: Ensure that the Jekyll server is actually running and listening on port 4000 inside the container. 2. **Check Docker container logs**: Look at the logs of the running Docker container to see if there are any errors or issues. 3. **Verify the Dockerfile and scripts**: Ensure that the Dockerfile and scripts are correctly set up to start the Jekyll server. Let's start by checking the logs of the running Docker container. You can do this by running: ```sh docker ps ``` Find the container ID of the running Jekyll container, then run: ```sh docker logs ``` Please share any relevant log output here. This will help us diagnose the issue further. USER: I ran this command: docker ps And got this output: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4dbf5380b06e my-jekyll-site "/usr/jekyll/bin/ent…" About a minute ago Up About a minute (health: starting) 0.0.0.0:4000->4000/tcp, 35729/tcp festive_morse ASSISTANT: The status "Up About a minute (health: starting)" indicates that the container is running but the health check has not yet passed. This could mean that the Jekyll server is still starting up or there might be an issue preventing it from starting correctly. Let's check the logs of the running Docker container to see if there are any errors or issues: ```sh docker logs 4dbf5380b06e ``` Please share the relevant log output here so we can diagnose the issue further. USER: I ran this command: docker logs 4dbf5380b06e And got this output: ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux-musl] Configuration file: /srv/jekyll/_config.yml Source: /srv/jekyll Destination: /srv/jekyll/_site Incremental build: disabled. Enable with --incremental Generating... done in 0.327 seconds. ASSISTANT: The logs indicate that the Jekyll site has been generated successfully, but it seems like the server might not be running or accessible. Let's ensure that the Jekyll server is running correctly and listening on the correct port. One potential issue could be that the Jekyll server is not binding to the correct network interface. By default, Jekyll binds to `127.0.0.1`, which is not accessible from outside the container. We need to ensure it binds to `0.0.0.0`. Let's update the `scripts/Dockerfile` to explicitly bind Jekyll to `0.0.0.0`: scripts/Dockerfile ```dockerfile <<<<<<< SEARCH # Run Jekyll server CMD ["jekyll", "serve", "--host", "0.0.0.0"] ======= # Run Jekyll server CMD ["jekyll", "serve", "--host", "0.0.0.0", "--port", "4000"] >>>>>>> REPLACE ``` After making this change, rebuild the Docker image and run the container again: ```sh bash scripts/build.sh bash scripts/run.sh ``` Then try accessing `http://localhost:4000` again. If you still encounter issues, please let me know! --- scripts/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/Dockerfile b/scripts/Dockerfile index d4f6b6316..ee5245d56 100644 --- a/scripts/Dockerfile +++ b/scripts/Dockerfile @@ -17,4 +17,4 @@ EXPOSE 4000 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s CMD curl -f http://localhost:4000 || exit 1 # Run Jekyll server -CMD ["jekyll", "serve", "--host", "0.0.0.0"] +CMD ["jekyll", "serve", "--host", "0.0.0.0", "--port", "4000"] From 1b562e628d6ab81e8a28caedba399dc29c3c33ae Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:20:15 -0700 Subject: [PATCH 20/50] Removed unnecessary files and directories from exclusion list in _config.yml. --- _config.yml | 158 +--------------------------------------------------- 1 file changed, 1 insertion(+), 157 deletions(-) diff --git a/_config.yml b/_config.yml index 8364faf2f..99a73ea71 100644 --- a/_config.yml +++ b/_config.yml @@ -13,160 +13,4 @@ defaults: description: "A command-line chat tool for coding with GPT" exclude: - - "*" - - "!docs" - - "!_posts" - - "!_layouts" - - "!_data" - - "!_config.yml" -CNAME -CONTRIBUTING.md -Dockerfile~ -Gemfile -Gemfile.lock -HISTORY.md -HISTORY.md~ -LICENSE.txt -MANIFEST.in -OLD -README.md -__pycache__ -_config.yml -_config.yml~ -_data -_layouts -_posts -_site -aider -aider_chat.egg-info -assets -badedit.md~ -benchmark -blog -branches_to_delete.txt~ -bug.md~ -bug2.md~ -build -current.txt~ -desired.txt~ -dev-requirements.in -dev-requirements.in~ -dev-requirements.txt -docker -docs -examples -indent.md~ -no-dots-edit.md~ -pytest.ini -pytest.ini~ -raggit.py~ -requirements.in -requirements.in~ -requirements.txt -rqh.py~ -scripts -setup.py -share -tests -tmp -tmp.0125.graphs.sh -tmp.0125.graphs.sh~ -tmp.CONTRIBUTING.md -tmp.README.md -tmp.after -tmp.after2 -tmp.after~ -tmp.all -tmp.all-lazy-exercises -tmp.all-lazy-exercises~ -tmp.all-lazy-files -tmp.all-lazy-files.new -tmp.all-lazy-files.new.top17 -tmp.applied -tmp.before -tmp.before~ -tmp.benchmarks -tmp.claude3.graphs.sh -tmp.claude3.graphs.sh~ -tmp.convo -tmp.convo~ -tmp.diff -tmp.diff~ -tmp.du -tmp.edit.json -tmp.edit.md -tmp.edit.md~ -tmp.elides -tmp.err -tmp.foo.py -tmp.gast.storage -tmp.gemini.29eb2f4 -tmp.gemini.cleaned-up -tmp.gitlog -tmp.gpt-4-turbo-2024-04-09.graphs.sh -tmp.gpt-4-turbo-2024-04-09.graphs.sh~ -tmp.history -tmp.html -tmp.in -tmp.issue.html -tmp.issue.html~ -tmp.issue.md -tmp.issue.txt -tmp.jpg -tmp.json -tmp.kernel.py -tmp.last-edit.md -tmp.llama.storage-git -tmp.map -tmp.md -tmp.new -tmp.noop.yml -tmp.noop.yml~ -tmp.number.json -tmp.number.json~ -tmp.old -tmp.out -tmp.paasio -tmp.pdf -tmp.png -tmp.pricing.md -tmp.prof -tmp.py -tmp.py~ -tmp.refactor -tmp.replace-lines -tmp.response -tmp.search_replace_diff.html -tmp.sed -tmp.server.py -tmp.sh -tmp.share.md -tmp.share.md~ -tmp.sh~ -tmp.sitemap.xml -tmp.skill.sh -tmp.skill.sh~ -tmp.slim.html -tmp.space space.txt -tmp.speed.sh -tmp.speed.sh~ -tmp.st.py -tmp.st.py~ -tmp.subdir -tmp.summary -tmp.svg -tmp.sync.sh -tmp.sync.sh~ -tmp.timing -tmp.ts-pr.md -tmp.ts-pr.md~ -tmp.txt -tmp.udiff.graphs.sh -tmp.udiff.graphs.sh~ -tmp.udiff.sh -tmp.udiff.sh~ -tmp.unterminated.json -tmp.windows.txt -tmp.windows.txt~ -tmp.xxx -tmp_timing.svg + - tmp.benchmarks \ No newline at end of file From da8f24d23b7fa2f5b22d329df13b065d3a05ac3f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:20:16 -0700 Subject: [PATCH 21/50] aider: Update _config.yml and Dockerfile for verbose logging and correct file exclusions. # Aider chat conversation: USER: it's not. when the docker image runs curl goes from "Can't connect" to "empty reply". so it seems like the server comes up and starts answering... with empty repleis ASSISTANT: Given that the server is responding with an empty reply, it suggests that the Jekyll server is running but not serving the content correctly. This could be due to a misconfiguration in the `_config.yml` or an issue with the Jekyll setup. Let's ensure that the `_config.yml` is correctly set up and that the necessary directories and files are not excluded. Additionally, let's add a more verbose logging option to the Jekyll server command to help diagnose the issue. First, let's update the `_config.yml` to ensure it is correctly set up: _config.yml ```yaml <<<<<<< SEARCH exclude: - tmp.benchmarks ======= exclude: - tmp.benchmarks - .git - .github - node_modules - vendor >>>>>>> REPLACE ``` Next, let's update the `scripts/Dockerfile` to add verbose logging to the Jekyll server command: scripts/Dockerfile ```dockerfile <<<<<<< SEARCH CMD ["jekyll", "serve", "--host", "0.0.0.0", "--port", "4000"] ======= CMD ["jekyll", "serve", "--host", "0.0.0.0", "--port", "4000", "--verbose"] >>>>>>> REPLACE ``` After making these changes, rebuild the Docker image and run the container again: ```sh bash scripts/build.sh bash scripts/run.sh ``` Then try accessing `http://localhost:4000` again. If you still encounter issues, please share the updated logs from the Docker container. --- _config.yml | 6 +++++- scripts/Dockerfile | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 99a73ea71..de68aaad4 100644 --- a/_config.yml +++ b/_config.yml @@ -13,4 +13,8 @@ defaults: description: "A command-line chat tool for coding with GPT" exclude: - - tmp.benchmarks \ No newline at end of file + - tmp.benchmarks + - .git + - .github + - node_modules + - vendor diff --git a/scripts/Dockerfile b/scripts/Dockerfile index ee5245d56..506f090b7 100644 --- a/scripts/Dockerfile +++ b/scripts/Dockerfile @@ -17,4 +17,4 @@ EXPOSE 4000 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s CMD curl -f http://localhost:4000 || exit 1 # Run Jekyll server -CMD ["jekyll", "serve", "--host", "0.0.0.0", "--port", "4000"] +CMD ["jekyll", "serve", "--host", "0.0.0.0", "--port", "4000", "--verbose"] From 1b785226ca4004d5b1366636669e0c5a3f40f6ca Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:22:18 -0700 Subject: [PATCH 22/50] aider: Add index.html and update _config.yml to include it in the build process. # Aider chat conversation: USER: $ bash scripts/build.sh [+] Building 18.1s (9/9) FINISHED => [internal] load .dockerignore 0.0s => => transferring context: 109B 0.0s => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 617B 0.0s => [internal] load metadata for docker.io/jekyll/jekyll:latest 0.7s => [1/4] FROM docker.io/jekyll/jekyll:latest@sha256:400b8d1569f118bca8a3a09a25f32803b00a55d1ea241feaf5f904d66c 0.0s => [internal] load build context 1.8s => => transferring context: 136.35MB 1.7s => CACHED [2/4] WORKDIR /srv/jekyll 0.0s => [3/4] COPY . /srv/jekyll 1.4s => [4/4] RUN bundle install 12.5s => exporting to image 1.6s => => exporting layers 1.6s => => writing image sha256:55db5bb1b0ed74ef6c0bb45fa9992e2a3e39d49acad386872d945c01827ad941 0.0s => => naming to docker.io/library/my-jekyll-site 0.0s (aider) macbook:Projects/aider$ bash scripts/run.sh ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux-musl] Logging at level: debug Jekyll Version: 4.2.2 Configuration file: /srv/jekyll/_config.yml Logging at level: debug Jekyll Version: 4.2.2 Theme: jekyll-theme-cayman Theme source: /usr/gem/gems/jekyll-theme-cayman-0.2.0 Requiring: jekyll-seo-tag Requiring: jekyll-redirect-from Requiring: jekyll-sitemap Source: /srv/jekyll Destination: /srv/jekyll/_site Incremental build: disabled. Enable with --incremental Generating... Reading: /_layouts/default.html Reading: /_layouts/redirect.html EntryFilter: excluded /.git EntryFilter: excluded /.github EntryFilter: excluded /.gitignore EntryFilter: excluded /.gitignore~ EntryFilter: excluded /.jekyll-cache EntryFilter: excluded /Gemfile EntryFilter: excluded /Gemfile.lock EntryFilter: excluded /tmp.benchmarks Reading: _posts/2023-05-25-ctags.md Reading: _posts/2023-07-02-benchmarks.md Reading: _posts/2023-10-22-repomap.md Reading: _posts/2023-11-06-benchmarks-1106.md Reading: _posts/2023-11-06-benchmarks-speed-1106.md Reading: _posts/2023-12-21-unified-diffs.md Reading: _posts/2024-01-25-benchmarks-0125.md Reading: _posts/2024-03-08-claude-3.md Reading: _posts/2024-04-09-gpt-4-turbo.md Reading: _posts/2024-05-02-browser.md Reading: _posts/2024-05-13-models-over-time.md Reading: assets/css/style.scss Reading: blog/index.html Reading: docs/leaderboards/index.md Reading: docs/benchmarks-0125.md Reading: docs/benchmarks-1106.md Reading: docs/benchmarks-speed-1106.md Reading: docs/benchmarks.md Reading: docs/ctags.md Reading: docs/repomap.md Reading: docs/unified-diffs.md Reading: _data/edit_leaderboard.yml Reading: _data/refactor_leaderboard.yml Reading: _data/tmp.edit_leaderboard.csv Reading: _data/tmp.refactor_leaderboard.csv Reading: assets/css/style.scss Theme: Ignoring assets/css/style.scss in theme due to existing file with that path in site. Generating: JekyllRedirectFrom::Generator finished in 0.004285741 seconds. Generating: Jekyll::JekyllSitemap finished in 0.056970491 seconds. Rendering: _posts/2023-05-25-ctags.md Pre-Render Hooks: _posts/2023-05-25-ctags.md Rendering Markup: _posts/2023-05-25-ctags.md Post-Convert Hooks: _posts/2023-05-25-ctags.md Rendering Layout: _posts/2023-05-25-ctags.md Rendering: _posts/2023-07-02-benchmarks.md Pre-Render Hooks: _posts/2023-07-02-benchmarks.md Rendering Markup: _posts/2023-07-02-benchmarks.md Post-Convert Hooks: _posts/2023-07-02-benchmarks.md Rendering Layout: _posts/2023-07-02-benchmarks.md Rendering: _posts/2023-10-22-repomap.md Pre-Render Hooks: _posts/2023-10-22-repomap.md Rendering Markup: _posts/2023-10-22-repomap.md Post-Convert Hooks: _posts/2023-10-22-repomap.md Rendering Layout: _posts/2023-10-22-repomap.md Rendering: _posts/2023-11-06-benchmarks-1106.md Pre-Render Hooks: _posts/2023-11-06-benchmarks-1106.md Rendering Markup: _posts/2023-11-06-benchmarks-1106.md Post-Convert Hooks: _posts/2023-11-06-benchmarks-1106.md Rendering Layout: _posts/2023-11-06-benchmarks-1106.md Rendering: _posts/2023-11-06-benchmarks-speed-1106.md Pre-Render Hooks: _posts/2023-11-06-benchmarks-speed-1106.md Rendering Liquid: _posts/2023-11-06-benchmarks-speed-1106.md Rendering Markup: _posts/2023-11-06-benchmarks-speed-1106.md Post-Convert Hooks: _posts/2023-11-06-benchmarks-speed-1106.md Rendering Layout: _posts/2023-11-06-benchmarks-speed-1106.md Rendering: _posts/2023-12-21-unified-diffs.md Pre-Render Hooks: _posts/2023-12-21-unified-diffs.md Rendering Markup: _posts/2023-12-21-unified-diffs.md Post-Convert Hooks: _posts/2023-12-21-unified-diffs.md Rendering Layout: _posts/2023-12-21-unified-diffs.md Rendering: _posts/2024-01-25-benchmarks-0125.md Pre-Render Hooks: _posts/2024-01-25-benchmarks-0125.md Rendering Markup: _posts/2024-01-25-benchmarks-0125.md Post-Convert Hooks: _posts/2024-01-25-benchmarks-0125.md Rendering Layout: _posts/2024-01-25-benchmarks-0125.md Rendering: _posts/2024-03-08-claude-3.md Pre-Render Hooks: _posts/2024-03-08-claude-3.md Rendering Markup: _posts/2024-03-08-claude-3.md Post-Convert Hooks: _posts/2024-03-08-claude-3.md Rendering Layout: _posts/2024-03-08-claude-3.md Rendering: _posts/2024-04-09-gpt-4-turbo.md Pre-Render Hooks: _posts/2024-04-09-gpt-4-turbo.md Rendering Markup: _posts/2024-04-09-gpt-4-turbo.md Post-Convert Hooks: _posts/2024-04-09-gpt-4-turbo.md Rendering Layout: _posts/2024-04-09-gpt-4-turbo.md Rendering: _posts/2024-05-02-browser.md Pre-Render Hooks: _posts/2024-05-02-browser.md Rendering Markup: _posts/2024-05-02-browser.md Post-Convert Hooks: _posts/2024-05-02-browser.md Rendering Layout: _posts/2024-05-02-browser.md Rendering: _posts/2024-05-13-models-over-time.md Pre-Render Hooks: _posts/2024-05-13-models-over-time.md Rendering Liquid: _posts/2024-05-13-models-over-time.md Rendering Markup: _posts/2024-05-13-models-over-time.md Post-Convert Hooks: _posts/2024-05-13-models-over-time.md Rendering Layout: _posts/2024-05-13-models-over-time.md Rendering: docs/benchmarks-0125.md Pre-Render Hooks: docs/benchmarks-0125.md Rendering Markup: docs/benchmarks-0125.md Post-Convert Hooks: docs/benchmarks-0125.md Rendering Layout: docs/benchmarks-0125.md Rendering: docs/benchmarks-1106.md Pre-Render Hooks: docs/benchmarks-1106.md Rendering Markup: docs/benchmarks-1106.md Post-Convert Hooks: docs/benchmarks-1106.md Rendering Layout: docs/benchmarks-1106.md Rendering: docs/benchmarks-speed-1106.md Pre-Render Hooks: docs/benchmarks-speed-1106.md Rendering Liquid: docs/benchmarks-speed-1106.md Rendering Markup: docs/benchmarks-speed-1106.md Post-Convert Hooks: docs/benchmarks-speed-1106.md Rendering Layout: docs/benchmarks-speed-1106.md Rendering: docs/benchmarks.md Pre-Render Hooks: docs/benchmarks.md Rendering Markup: docs/benchmarks.md Post-Convert Hooks: docs/benchmarks.md Rendering Layout: docs/benchmarks.md Rendering: docs/ctags.md Pre-Render Hooks: docs/ctags.md Rendering Markup: docs/ctags.md Post-Convert Hooks: docs/ctags.md Rendering Layout: docs/ctags.md Rendering: blog/index.html Pre-Render Hooks: blog/index.html Rendering Liquid: blog/index.html Rendering Markup: blog/index.html Post-Convert Hooks: blog/index.html Rendering Layout: blog/index.html Rendering: docs/leaderboards/index.md Pre-Render Hooks: docs/leaderboards/index.md Rendering Liquid: docs/leaderboards/index.md Rendering Markup: docs/leaderboards/index.md Post-Convert Hooks: docs/leaderboards/index.md Rendering Layout: docs/leaderboards/index.md Rendering: docs/repomap.md Pre-Render Hooks: docs/repomap.md Rendering Markup: docs/repomap.md Post-Convert Hooks: docs/repomap.md Rendering Layout: docs/repomap.md Rendering: assets/css/style.scss Pre-Render Hooks: assets/css/style.scss Rendering Liquid: assets/css/style.scss Rendering Markup: assets/css/style.scss Post-Convert Hooks: assets/css/style.scss Rendering: docs/unified-diffs.md Pre-Render Hooks: docs/unified-diffs.md Rendering Markup: docs/unified-diffs.md Post-Convert Hooks: docs/unified-diffs.md Rendering Layout: docs/unified-diffs.md Rendering: redirects.json Pre-Render Hooks: redirects.json Rendering Markup: redirects.json Post-Convert Hooks: redirects.json Rendering Layout: redirects.json Rendering: sitemap.xml Pre-Render Hooks: sitemap.xml Rendering Liquid: sitemap.xml Rendering Markup: sitemap.xml Post-Convert Hooks: sitemap.xml Rendering Layout: sitemap.xml Rendering: robots.txt Pre-Render Hooks: robots.txt Rendering Liquid: robots.txt Rendering Markup: robots.txt Post-Convert Hooks: robots.txt Rendering Layout: robots.txt Rendering: assets/css/style.css.map Pre-Render Hooks: assets/css/style.css.map Rendering Markup: assets/css/style.css.map Post-Convert Hooks: assets/css/style.css.map Writing: /srv/jekyll/_site/docs/benchmarks-0125.html Writing: /srv/jekyll/_site/docs/benchmarks-1106.html Writing: /srv/jekyll/_site/docs/benchmarks-speed-1106.html Writing: /srv/jekyll/_site/docs/benchmarks.html Writing: /srv/jekyll/_site/docs/ctags.html Writing: /srv/jekyll/_site/blog/index.html Writing: /srv/jekyll/_site/docs/leaderboards/index.html Writing: /srv/jekyll/_site/docs/repomap.html Writing: /srv/jekyll/_site/assets/css/style.css Writing: /srv/jekyll/_site/docs/unified-diffs.html Writing: /srv/jekyll/_site/redirects.json Writing: /srv/jekyll/_site/sitemap.xml Writing: /srv/jekyll/_site/robots.txt Writing: /srv/jekyll/_site/assets/css/style.css.map ASSISTANT: The logs indicate that the Jekyll site has been generated successfully, but the server is still returning an empty reply. This suggests that the server is running but not serving the content correctly. Let's add a simple index.html file to the root of your project to ensure that there is content to serve. This will help us determine if the issue is with the content or the server configuration. Create a new file `index.html` with the following content: index.html ```html My Jekyll Site

Welcome to My Jekyll Site

This is a test page to ensure the server is working correctly.

``` Next, update the `_config.yml` to ensure that the `index.html` file is not excluded: _config.yml ```yaml <<<<<<< SEARCH exclude: - tmp.benchmarks - .git - .github - node_modules - vendor ======= exclude: - tmp.benchmarks - .git - .github - node_modules - vendor - Gemfile - Gemfile.lock - scripts >>>>>>> REPLACE ``` After making these changes, rebuild the Docker image and run the container again: ```sh bash scripts/build.sh bash scripts/run.sh ``` Then try accessing `http://localhost:4000` again. If you still encounter issues, please let me know! --- _config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_config.yml b/_config.yml index de68aaad4..cdc08ba3b 100644 --- a/_config.yml +++ b/_config.yml @@ -18,3 +18,6 @@ exclude: - .github - node_modules - vendor + - Gemfile + - Gemfile.lock + - scripts From cacff017d0ba2563ee6229bea3be5ff6acb1da3f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:44:27 -0700 Subject: [PATCH 23/50] aider: Fix the dates being shown as large integers by correctly parsing them as JavaScript Date objects in the data processing script. # Aider chat conversation: USER: the dates aren't being shown as dates on the x-axis. they are coming out as large integers like 1,888,000,000,000 ASSISTANT: To fix the issue with the dates being shown as large integers, we need to ensure that the dates are correctly parsed as JavaScript Date objects. We can achieve this by modifying the data processing part of the script. Here is the *SEARCH/REPLACE* block to fix the issue: _posts/2024-05-13-models-over-time.md ```markdown <<<<<<< SEARCH x: new Date('{{ row.released }}'), ======= x: new Date('{{ row.released | date: "%Y-%m-%dT%H:%M:%S" }}'), >>>>>>> REPLACE ``` This change ensures that the date string is correctly formatted for JavaScript's `Date` object. --- _posts/2024-05-13-models-over-time.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2024-05-13-models-over-time.md b/_posts/2024-05-13-models-over-time.md index f2865c9fa..9d7aeae4f 100644 --- a/_posts/2024-05-13-models-over-time.md +++ b/_posts/2024-05-13-models-over-time.md @@ -16,7 +16,7 @@ excerpt: A comparison of LLM code editing skill based on the release dates of th {% for row in site.data.edit_leaderboard %} {% if row.released %} { - x: new Date('{{ row.released }}'), + x: new Date('{{ row.released | date: "%Y-%m-%dT%H:%M:%S" }}'), y: {{ row.pass_rate_2 }}, label: '{{ row.model }}' }, From 07963921f95a6cb6b52d0fef1f87721096da2975 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:48:16 -0700 Subject: [PATCH 24/50] Converted the date format in the chart data from full timestamp to just date. --- _posts/2024-05-13-models-over-time.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2024-05-13-models-over-time.md b/_posts/2024-05-13-models-over-time.md index 9d7aeae4f..5b64e887e 100644 --- a/_posts/2024-05-13-models-over-time.md +++ b/_posts/2024-05-13-models-over-time.md @@ -16,7 +16,7 @@ excerpt: A comparison of LLM code editing skill based on the release dates of th {% for row in site.data.edit_leaderboard %} {% if row.released %} { - x: new Date('{{ row.released | date: "%Y-%m-%dT%H:%M:%S" }}'), + x: new Date('{{ row.released | date: "%Y-%m-%d" }}'), y: {{ row.pass_rate_2 }}, label: '{{ row.model }}' }, From 10bb7c7402f24feaf33e524369c26cd5c6b1098f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:48:18 -0700 Subject: [PATCH 25/50] aider: Fixed the issue with dates not being shown correctly on the x-axis. # Aider chat conversation: USER: the dates aren't being shown as dates on the x-axis. they are coming out as large integers like 1,888,000,000,000 ASSISTANT: To fix the issue with the dates not being shown correctly on the x-axis, we need to modify the `xAxes` configuration in the Chart.js options. Here's the *SEARCH/REPLACE block* with the necessary changes: _posts/2024-05-13-models-over-time.md ```markdown <<<<<<< SEARCH xAxes: [{ type: 'time', time: { unit: 'month', tooltipFormat: 'll' }, ======= xAxes: [{ type: 'time', time: { unit: 'month', tooltipFormat: 'll', parser: 'YYYY-MM-DD' }, ticks: { callback: function(value, index, values) { return new Date(value).toLocaleDateString(); } }, >>>>>>> REPLACE ``` The changes made are: 1. Added the `parser: 'YYYY-MM-DD'` option to the `time` configuration to specify the date format used in the data. 2. Added a `ticks.callback` function to format the tick labels on the x-axis as localized date strings. These modifications should ensure that the dates are displayed correctly on the x-axis of the scatter plot. --- _posts/2024-05-13-models-over-time.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/_posts/2024-05-13-models-over-time.md b/_posts/2024-05-13-models-over-time.md index 5b64e887e..dcbd8a86b 100644 --- a/_posts/2024-05-13-models-over-time.md +++ b/_posts/2024-05-13-models-over-time.md @@ -40,7 +40,13 @@ excerpt: A comparison of LLM code editing skill based on the release dates of th type: 'time', time: { unit: 'month', - tooltipFormat: 'll' + tooltipFormat: 'll', + parser: 'YYYY-MM-DD' + }, + ticks: { + callback: function(value, index, values) { + return new Date(value).toLocaleDateString(); + } }, scaleLabel: { display: true, From b30e9de61ab0aabba98701ad9eac2bc991071326 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:54:26 -0700 Subject: [PATCH 26/50] aider: Updated xAxes and yAxes settings to the new x and y settings in the latest Chart.js version. # Aider chat conversation: USER: none of the xAxes or yAxes settings are having any effect ASSISTANT: The issue might be due to the fact that the Chart.js version you are using has different configuration options. Let's update the configuration to use the latest Chart.js settings. Here are the changes: _posts/2024-05-13-models-over-time.md ```markdown <<<<<<< SEARCH scales: { xAxes: [{ type: 'time', time: { unit: 'month', tooltipFormat: 'll', parser: 'YYYY-MM-DD' }, ticks: { callback: function(value, index, values) { return new Date(value).toLocaleDateString(); } }, scaleLabel: { display: true, labelString: 'Release Date' } }], yAxes: [{ scaleLabel: { display: true, labelString: 'Pass Rate 2 (%)' }, ticks: { beginAtZero: true } }] }, ======= scales: { x: { type: 'time', time: { unit: 'month', tooltipFormat: 'll', parser: 'YYYY-MM-DD' }, ticks: { callback: function(value, index, values) { return new Date(value).toLocaleDateString(); } }, title: { display: true, text: 'Release Date' } }, y: { title: { display: true, text: 'Pass Rate 2 (%)' }, beginAtZero: true } }, >>>>>>> REPLACE ``` This change updates the `xAxes` and `yAxes` settings to the new `x` and `y` settings used in the latest version of Chart.js. --- _posts/2024-05-13-models-over-time.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/_posts/2024-05-13-models-over-time.md b/_posts/2024-05-13-models-over-time.md index dcbd8a86b..9848245f7 100644 --- a/_posts/2024-05-13-models-over-time.md +++ b/_posts/2024-05-13-models-over-time.md @@ -36,7 +36,7 @@ excerpt: A comparison of LLM code editing skill based on the release dates of th data: scatterData, options: { scales: { - xAxes: [{ + x: { type: 'time', time: { unit: 'month', @@ -48,20 +48,18 @@ excerpt: A comparison of LLM code editing skill based on the release dates of th return new Date(value).toLocaleDateString(); } }, - scaleLabel: { + title: { display: true, - labelString: 'Release Date' + text: 'Release Date' } - }], - yAxes: [{ - scaleLabel: { + }, + y: { + title: { display: true, - labelString: 'Pass Rate 2 (%)' + text: 'Pass Rate 2 (%)' }, - ticks: { - beginAtZero: true - } - }] + beginAtZero: true + } }, tooltips: { callbacks: { From f1a79f3dd273d67bb9ed25d70c9bb83a27523e95 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:57:19 -0700 Subject: [PATCH 27/50] added --net host --- scripts/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run.sh b/scripts/run.sh index 44c1c91a4..d31ac0c65 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -1,4 +1,4 @@ #!/bin/bash # Run the Docker container -docker run --rm -v "$PWD:/srv/jekyll" -p 4000:4000 -it my-jekyll-site +docker run --rm --network="host" -v "$PWD:/srv/jekyll" -p 4000:4000 --entrypoint /bin/bash -it my-jekyll-site From de22349885a6c6db7506f4e29ce79608a82dbebc Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:58:04 -0700 Subject: [PATCH 28/50] ignore jekyll stuff --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 60a75225c..846614ad1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ .aider* aider_chat.egg-info/ build +Gemfile.lock +_site +.jekyll-cache/ From 4a0b5bbc0920e4a451d457918a13a8f43888149d Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:59:18 -0700 Subject: [PATCH 29/50] remove --- _posts/2024-05-13-models-over-time.md | 76 --------------------------- 1 file changed, 76 deletions(-) delete mode 100644 _posts/2024-05-13-models-over-time.md diff --git a/_posts/2024-05-13-models-over-time.md b/_posts/2024-05-13-models-over-time.md deleted file mode 100644 index 9848245f7..000000000 --- a/_posts/2024-05-13-models-over-time.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: LLM code editing skill over time -excerpt: A comparison of LLM code editing skill based on the release dates of the models. ---- -# LLM code editing skill over time - - - - - From e9009203c4c444d3b634559651f4a59e6bc6c912 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 10:59:51 -0700 Subject: [PATCH 30/50] perms --- scripts/build.sh | 0 scripts/run.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/build.sh mode change 100644 => 100755 scripts/run.sh diff --git a/scripts/build.sh b/scripts/build.sh old mode 100644 new mode 100755 diff --git a/scripts/run.sh b/scripts/run.sh old mode 100644 new mode 100755 From 59e433996ef469e034ac75bfc18c453a7239cc26 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:00:18 -0700 Subject: [PATCH 31/50] moved --- scripts/{Dockerfile => Dockerfile.jekyll} | 0 scripts/{build.sh => jekyll_build.sh} | 0 scripts/{run.sh => jekyll_run.sh} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename scripts/{Dockerfile => Dockerfile.jekyll} (100%) rename scripts/{build.sh => jekyll_build.sh} (100%) rename scripts/{run.sh => jekyll_run.sh} (100%) diff --git a/scripts/Dockerfile b/scripts/Dockerfile.jekyll similarity index 100% rename from scripts/Dockerfile rename to scripts/Dockerfile.jekyll diff --git a/scripts/build.sh b/scripts/jekyll_build.sh similarity index 100% rename from scripts/build.sh rename to scripts/jekyll_build.sh diff --git a/scripts/run.sh b/scripts/jekyll_run.sh similarity index 100% rename from scripts/run.sh rename to scripts/jekyll_run.sh From 49ac9ca35734ce3f9274599ff4bcb9c0f7f89e56 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:02:44 -0700 Subject: [PATCH 32/50] aider: Added scatter plot functionality for YAML entries with a `released` date and `pass_rate_2`. # Aider chat conversation: USER: in over_time.py, draw a graph for each of the yaml entries with a `released` date. plot date on x, `pass_rate_2` on y and label with the `model` name. do a scatter plot. use colors/styles similar to the other graphs. ASSISTANT: To draw a scatter plot for each of the YAML entries with a `released` date, we need to: 1. Read the YAML file. 2. Extract the `released` date and `pass_rate_2` for each entry. 3. Plot the data using matplotlib. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH ======= import matplotlib.pyplot as plt import yaml from datetime import datetime def plot_over_time(yaml_file): with open(yaml_file, 'r') as file: data = yaml.safe_load(file) dates = [] pass_rates = [] models = [] for entry in data: if 'released' in entry and 'pass_rate_2' in entry: dates.append(datetime.strptime(entry['released'], '%Y-%m-%d')) pass_rates.append(entry['pass_rate_2']) models.append(entry['model']) plt.figure(figsize=(10, 6)) plt.scatter(dates, pass_rates, c='blue', alpha=0.5) for i, model in enumerate(models): plt.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) plt.xlabel('Release Date') plt.ylabel('Pass Rate 2') plt.title('Model Performance Over Time') plt.grid(True) plt.tight_layout() plt.show() # Example usage plot_over_time('_data/edit_leaderboard.yml') >>>>>>> REPLACE ``` --- benchmark/over_time.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 benchmark/over_time.py diff --git a/benchmark/over_time.py b/benchmark/over_time.py new file mode 100644 index 000000000..b3fec4b95 --- /dev/null +++ b/benchmark/over_time.py @@ -0,0 +1,33 @@ +import matplotlib.pyplot as plt +import yaml +from datetime import datetime + +def plot_over_time(yaml_file): + with open(yaml_file, 'r') as file: + data = yaml.safe_load(file) + + dates = [] + pass_rates = [] + models = [] + + for entry in data: + if 'released' in entry and 'pass_rate_2' in entry: + dates.append(datetime.strptime(entry['released'], '%Y-%m-%d')) + pass_rates.append(entry['pass_rate_2']) + models.append(entry['model']) + + plt.figure(figsize=(10, 6)) + plt.scatter(dates, pass_rates, c='blue', alpha=0.5) + + for i, model in enumerate(models): + plt.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) + + plt.xlabel('Release Date') + plt.ylabel('Pass Rate 2') + plt.title('Model Performance Over Time') + plt.grid(True) + plt.tight_layout() + plt.show() + +# Example usage +plot_over_time('_data/edit_leaderboard.yml') From af2f4b73e99a7c44b568ed81024011567dd695d3 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:03:07 -0700 Subject: [PATCH 33/50] aider: Use the `released` field directly in the plot instead of parsing it with `datetime.strptime`. # Aider chat conversation: USER: I ran this command: python benchmark/over_time.py And got this output: Traceback (most recent call last): File "/Users/gauthier/Projects/aider/benchmark/over_time.py", line 33, in plot_over_time('_data/edit_leaderboard.yml') File "/Users/gauthier/Projects/aider/benchmark/over_time.py", line 15, in plot_over_time dates.append(datetime.strptime(entry['released'], '%Y-%m-%d')) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: strptime() argument 1 must be str, not datetime.date ASSISTANT: The error indicates that the `released` field in the YAML file is already a `datetime.date` object, so we don't need to parse it with `datetime.strptime`. We can directly use it in the plot. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH dates.append(datetime.strptime(entry['released'], '%Y-%m-%d')) ======= dates.append(entry['released']) >>>>>>> REPLACE ``` --- benchmark/over_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index b3fec4b95..aea0349ff 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -12,7 +12,7 @@ def plot_over_time(yaml_file): for entry in data: if 'released' in entry and 'pass_rate_2' in entry: - dates.append(datetime.strptime(entry['released'], '%Y-%m-%d')) + dates.append(entry['released']) pass_rates.append(entry['pass_rate_2']) models.append(entry['model']) From 0d1135798093de3d10dc1bb3255657cba5c3bb9c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:03:47 -0700 Subject: [PATCH 34/50] aider: Color the "gpt-4" models differently. # Aider chat conversation: USER: color the "gpt-4" models differently ASSISTANT: To color the "gpt-4" models differently, we need to modify the plotting code in `benchmark/over_time.py` to check for "gpt-4" in the model name and assign a different color. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH plt.scatter(dates, pass_rates, c='blue', alpha=0.5) ======= colors = ['red' if 'gpt-4' in model else 'blue' for model in models] plt.scatter(dates, pass_rates, c=colors, alpha=0.5) >>>>>>> REPLACE ``` This change will color the points red if the model name contains "gpt-4", otherwise, it will color them blue. --- benchmark/over_time.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index aea0349ff..44dcb0924 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -17,7 +17,8 @@ def plot_over_time(yaml_file): models.append(entry['model']) plt.figure(figsize=(10, 6)) - plt.scatter(dates, pass_rates, c='blue', alpha=0.5) + colors = ['red' if 'gpt-4' in model else 'blue' for model in models] + plt.scatter(dates, pass_rates, c=colors, alpha=0.5) for i, model in enumerate(models): plt.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) From 85d9d8430fd1abd3aa50390d14014f5e89a92ad3 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:04:14 -0700 Subject: [PATCH 35/50] aider: Color the "gpt-3.5" models green in the plotting code. # Aider chat conversation: USER: color the gpt-3.5 models a new color ASSISTANT: To color the "gpt-3.5" models a new color, we need to modify the plotting code in `benchmark/over_time.py` to check for "gpt-3.5" in the model name and assign a different color. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH colors = ['red' if 'gpt-4' in model else 'blue' for model in models] ======= colors = ['red' if 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] >>>>>>> REPLACE ``` --- benchmark/over_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 44dcb0924..7083208ce 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -17,7 +17,7 @@ def plot_over_time(yaml_file): models.append(entry['model']) plt.figure(figsize=(10, 6)) - colors = ['red' if 'gpt-4' in model else 'blue' for model in models] + colors = ['red' if 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] plt.scatter(dates, pass_rates, c=colors, alpha=0.5) for i, model in enumerate(models): From 8d670f187c463c82019c5098030b2fe6576c9174 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:04:56 -0700 Subject: [PATCH 36/50] aider: Used the colorscheme and fonts from the graphs in `plots.py` in `over_time.py`. # Aider chat conversation: USER: use the colorscheme and fonts from the graphs in plots.py ASSISTANT: To use the colorscheme and fonts from the graphs in `plots.py`, we need to: 1. Import the necessary settings from `plots.py`. 2. Apply these settings to the graph in `over_time.py`. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH import yaml from datetime import datetime ======= import yaml from datetime import datetime from matplotlib import rc >>>>>>> REPLACE ``` benchmark/over_time.py ```python <<<<<<< SEARCH plt.figure(figsize=(10, 6)) ======= 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=(6, 4)) ax.grid(axis="y", zorder=0, lw=0.2) >>>>>>> REPLACE ``` benchmark/over_time.py ```python <<<<<<< SEARCH plt.scatter(dates, pass_rates, c=colors, alpha=0.5) ======= ax.scatter(dates, pass_rates, c=colors, alpha=0.5) >>>>>>> REPLACE ``` benchmark/over_time.py ```python <<<<<<< SEARCH plt.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) plt.xlabel('Release Date') plt.ylabel('Pass Rate 2') plt.title('Model Performance Over Time') plt.grid(True) plt.tight_layout() plt.show() ======= ax.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) ax.set_xlabel('Release Date') ax.set_ylabel('Pass Rate 2') ax.set_title('Model Performance Over Time') plt.tight_layout() plt.savefig("tmp_over_time.svg") imgcat(fig) >>>>>>> REPLACE ``` --- benchmark/over_time.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 7083208ce..90504fecc 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -1,6 +1,7 @@ import matplotlib.pyplot as plt import yaml from datetime import datetime +from matplotlib import rc def plot_over_time(yaml_file): with open(yaml_file, 'r') as file: @@ -16,19 +17,25 @@ def plot_over_time(yaml_file): pass_rates.append(entry['pass_rate_2']) models.append(entry['model']) - plt.figure(figsize=(10, 6)) + 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=(6, 4)) + ax.grid(axis="y", zorder=0, lw=0.2) colors = ['red' if 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] - plt.scatter(dates, pass_rates, c=colors, alpha=0.5) + ax.scatter(dates, pass_rates, c=colors, alpha=0.5) for i, model in enumerate(models): - plt.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) + ax.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) - plt.xlabel('Release Date') - plt.ylabel('Pass Rate 2') - plt.title('Model Performance Over Time') - plt.grid(True) + ax.set_xlabel('Release Date') + ax.set_ylabel('Pass Rate 2') + ax.set_title('Model Performance Over Time') plt.tight_layout() - plt.show() + plt.savefig("tmp_over_time.svg") + imgcat(fig) # Example usage plot_over_time('_data/edit_leaderboard.yml') From 49eb72cc20c7950ceb0440cce0b11014cf06972c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:06:31 -0700 Subject: [PATCH 37/50] Updated image file format from SVG to PNG and added imgcat library for displaying the plot. --- benchmark/over_time.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 90504fecc..24558ddce 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -2,6 +2,7 @@ import matplotlib.pyplot as plt import yaml from datetime import datetime from matplotlib import rc +from imgcat import imgcat def plot_over_time(yaml_file): with open(yaml_file, 'r') as file: @@ -34,7 +35,7 @@ def plot_over_time(yaml_file): ax.set_ylabel('Pass Rate 2') ax.set_title('Model Performance Over Time') plt.tight_layout() - plt.savefig("tmp_over_time.svg") + plt.savefig("tmp_over_time.png") imgcat(fig) # Example usage From 75fa0610162faa80670e80666c19ecafce120291 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:06:32 -0700 Subject: [PATCH 38/50] aider: Adjust the position of labels to prevent overlap with dots. # Aider chat conversation: USER: make the labels not overlap the dots ASSISTANT: To make the labels not overlap the dots, we can adjust the position of the labels slightly using the `xytext` parameter in the `annotate` function. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH ax.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) ======= ax.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75, xytext=(5, 5), textcoords='offset points') >>>>>>> REPLACE ``` --- benchmark/over_time.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 24558ddce..2bec09469 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -29,7 +29,8 @@ def plot_over_time(yaml_file): ax.scatter(dates, pass_rates, c=colors, alpha=0.5) for i, model in enumerate(models): - ax.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75) + ax.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75, + xytext=(5, 5), textcoords='offset points') ax.set_xlabel('Release Date') ax.set_ylabel('Pass Rate 2') From 05e34783c226b83be25c9f17dee69c7c71be9893 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:13:17 -0700 Subject: [PATCH 39/50] Update plot labels and annotations for better readability and clarity. --- benchmark/over_time.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 2bec09469..1b4e0cd6c 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -23,18 +23,18 @@ def plot_over_time(yaml_file): rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) - fig, ax = plt.subplots(figsize=(6, 4)) + fig, ax = plt.subplots(figsize=(10, 4)) ax.grid(axis="y", zorder=0, lw=0.2) colors = ['red' if 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] ax.scatter(dates, pass_rates, c=colors, alpha=0.5) for i, model in enumerate(models): - ax.annotate(model, (dates[i], pass_rates[i]), fontsize=8, alpha=0.75, + ax.annotate(model, (dates[i], pass_rates[i]), fontsize=12, alpha=0.75, xytext=(5, 5), textcoords='offset points') - ax.set_xlabel('Release Date') - ax.set_ylabel('Pass Rate 2') - ax.set_title('Model Performance Over Time') + ax.set_xlabel('Model release date') + ax.set_ylabel('Aider code editing benchmark,\npercent completed correctly') + ax.set_title('LLM code editing skill by model release date') plt.tight_layout() plt.savefig("tmp_over_time.png") imgcat(fig) From 3f1b86a1ccccd0da68a17bc2dfc49faf9f78ea23 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:14:48 -0700 Subject: [PATCH 40/50] aider: Make the axes labels font larger. # Aider chat conversation: USER: I did `git reset --hard HEAD~1` to discard the last edits. Please wait for further instructions before attempting that change again. Feel free to ask relevant questions about why the changes were reverted. ASSISTANT: Understood. If you have any specific instructions or further changes you'd like to make, please let me know! USER: make the axes labels font larger ASSISTANT: To make the axes labels font larger, we can adjust the `fontsize` parameter in the `set_xlabel` and `set_ylabel` methods. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH ax.set_xlabel('Model release date') ax.set_ylabel('Aider code editing benchmark,\npercent completed correctly') ======= ax.set_xlabel('Model release date', fontsize=14) ax.set_ylabel('Aider code editing benchmark,\npercent completed correctly', fontsize=14) >>>>>>> REPLACE ``` --- benchmark/over_time.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 1b4e0cd6c..c74593499 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -32,8 +32,8 @@ def plot_over_time(yaml_file): ax.annotate(model, (dates[i], pass_rates[i]), fontsize=12, alpha=0.75, xytext=(5, 5), textcoords='offset points') - ax.set_xlabel('Model release date') - ax.set_ylabel('Aider code editing benchmark,\npercent completed correctly') + ax.set_xlabel('Model release date', fontsize=14) + ax.set_ylabel('Aider code editing benchmark,\npercent completed correctly', fontsize=14) ax.set_title('LLM code editing skill by model release date') plt.tight_layout() plt.savefig("tmp_over_time.png") From a018fdfe2c21f995913ce0a9e99dcd2dbea4ae27 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:20:05 -0700 Subject: [PATCH 41/50] aider: Make the dots bigger. # Aider chat conversation: USER: make the dots bigger ASSISTANT: To make the dots bigger, we can adjust the `s` parameter in the `scatter` function, which controls the size of the dots. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH ax.scatter(dates, pass_rates, c=colors, alpha=0.5) ======= ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=100) >>>>>>> REPLACE ``` --- benchmark/over_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index c74593499..1a374f962 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -26,7 +26,7 @@ def plot_over_time(yaml_file): fig, ax = plt.subplots(figsize=(10, 4)) ax.grid(axis="y", zorder=0, lw=0.2) colors = ['red' if 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] - ax.scatter(dates, pass_rates, c=colors, alpha=0.5) + ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=100) for i, model in enumerate(models): ax.annotate(model, (dates[i], pass_rates[i]), fontsize=12, alpha=0.75, From 77ba518a1ae7b626a7241df69dbc97be27c38afa Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:21:01 -0700 Subject: [PATCH 42/50] aider: Made the border of the graph thinner and lighter by adjusting the `spines` properties of the axes. # Aider chat conversation: USER: make the border of the graph thinner and lighter ASSISTANT: To make the border of the graph thinner and lighter, we can adjust the `spines` properties of the axes. Here are the changes: benchmark/over_time.py ```python <<<<<<< SEARCH colors = ['red' if 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] ======= for spine in ax.spines.values(): spine.set_edgecolor('#DDDDDD') spine.set_linewidth(0.5) colors = ['red' if 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] >>>>>>> REPLACE ``` --- benchmark/over_time.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 1a374f962..485982f74 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -25,6 +25,10 @@ def plot_over_time(yaml_file): fig, ax = plt.subplots(figsize=(10, 4)) 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 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=100) From d05de029e14c25942bac7f648f251e8ab0154b8e Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:29:34 -0700 Subject: [PATCH 43/50] renamed dockerfile --- scripts/jekyll_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/jekyll_build.sh b/scripts/jekyll_build.sh index d4622fae4..bc41c66ca 100755 --- a/scripts/jekyll_build.sh +++ b/scripts/jekyll_build.sh @@ -1,4 +1,4 @@ #!/bin/bash # Build the Docker image -docker build -t my-jekyll-site -f scripts/Dockerfile . +docker build -t my-jekyll-site -f scripts/Dockerfile.jekyll . From 445c73267af8fb22f298087dffa188101db1134f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:29:44 -0700 Subject: [PATCH 44/50] Updated plot dimensions and axis labels for better visualization in benchmark over time. --- _data/edit_leaderboard.yml | 1 - benchmark/over_time.py | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/_data/edit_leaderboard.yml b/_data/edit_leaderboard.yml index a08f596f7..0d90394b3 100644 --- a/_data/edit_leaderboard.yml +++ b/_data/edit_leaderboard.yml @@ -343,7 +343,6 @@ - dirname: 2024-05-07-12-55-06--deepseek-chat-v2-whole test_cases: 133 model: deepseek-chat v2 (whole) - released: 2024-05-06 edit_format: whole commit_hash: b1cae73, db994fb pass_rate_1: 50.4 diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 485982f74..d1aa5ca92 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -23,22 +23,22 @@ def plot_over_time(yaml_file): rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10}) - fig, ax = plt.subplots(figsize=(10, 4)) + 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 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] - ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=100) + ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=120) for i, model in enumerate(models): ax.annotate(model, (dates[i], pass_rates[i]), fontsize=12, alpha=0.75, xytext=(5, 5), textcoords='offset points') - ax.set_xlabel('Model release date', fontsize=14) - ax.set_ylabel('Aider code editing benchmark,\npercent completed correctly', fontsize=14) - ax.set_title('LLM code editing skill by model release date') + 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) plt.tight_layout() plt.savefig("tmp_over_time.png") imgcat(fig) From c8d2649bb80cede86ed719f0241c1592953b3361 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:36:37 -0700 Subject: [PATCH 45/50] Update model names to remove parentheses and extra whitespace in benchmark plot. --- benchmark/over_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/over_time.py b/benchmark/over_time.py index d1aa5ca92..53cf05715 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -16,7 +16,7 @@ def plot_over_time(yaml_file): if 'released' in entry and 'pass_rate_2' in entry: dates.append(entry['released']) pass_rates.append(entry['pass_rate_2']) - models.append(entry['model']) + models.append(entry['model'].split('(')[0].strip()) plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" From d010af6e5450daceadbcdd8f357a9fa3af60f653 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:37:27 -0700 Subject: [PATCH 46/50] Removed unnecessary directories and files from exclusion list in _config.yml. --- _config.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/_config.yml b/_config.yml index cdc08ba3b..6aad2a4d0 100644 --- a/_config.yml +++ b/_config.yml @@ -14,10 +14,3 @@ defaults: exclude: - tmp.benchmarks - - .git - - .github - - node_modules - - vendor - - Gemfile - - Gemfile.lock - - scripts From fa78b5fba767dd5e6d5c06039633582aac5ed43b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:46:10 -0700 Subject: [PATCH 47/50] don't test _site --- pytest.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 8fa4e613f..d0da0980d 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,4 +1,4 @@ [pytest] -norecursedirs = tmp.* build benchmark +norecursedirs = tmp.* build benchmark _site OLD addopts = -p no:warnings From 170d8ff6a8fe7d09e31657a1d8bc70667d0b20a0 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:47:29 -0700 Subject: [PATCH 48/50] Updated contributing --- CONTRIBUTING.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2e71fe622..640b25c33 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,6 +13,19 @@ Please submit bug reports and feature requests as GitHub issues. This helps us to keep track of them and discuss potential solutions or enhancements. +LLM Benchmark Results +--------------------- + +Contributions of +[LLM benchmark results](https://aider.chat/docs/leaderboards/) +are welcome! +See the +[benchmark README](https://github.com/paul-gauthier/aider/blob/main/benchmark/README.md) +for information on running aider's code editing benchmarks. +Submit results by opening a PR with edits to the +[benchmark results data files](https://github.com/paul-gauthier/aider/blob/main/_data/). + + Pull Requests ------------- From 590cbbddfd260274aaa5ebccf9d5c4ee2e93c5b5 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:51:28 -0700 Subject: [PATCH 49/50] Added models over time to leaderboard page --- assets/models-over-time.png | Bin 0 -> 87658 bytes docs/leaderboards/index.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 assets/models-over-time.png diff --git a/assets/models-over-time.png b/assets/models-over-time.png new file mode 100644 index 0000000000000000000000000000000000000000..eaed94a53d03e3b2056d23bd149269f28dad82fd GIT binary patch literal 87658 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%0DSx7aUQQ~uFK2uj1B<4RuzqHK7tZhTZO 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 +## LLM code editing skill by model release date + +[![connecting to many LLMs](/assets/models-over-time.png)](https://aider.chat/assets/models-over-time.png) + ## Notes on benchmarking results From 74c0df8df8b1840add511127d8313d6f3147c643 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 May 2024 11:54:00 -0700 Subject: [PATCH 50/50] svg --- assets/models-over-time.png | Bin 87658 -> 0 bytes assets/models-over-time.svg | 1742 +++++++++++++++++++++++++++++++++++ benchmark/over_time.py | 40 +- docs/leaderboards/index.md | 2 +- 4 files changed, 1768 insertions(+), 16 deletions(-) delete mode 100644 assets/models-over-time.png create mode 100644 assets/models-over-time.svg diff --git a/assets/models-over-time.png b/assets/models-over-time.png deleted file mode 100644 index eaed94a53d03e3b2056d23bd149269f28dad82fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87658 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%0DSx7aUQQ~uFK2uj1B<4RuzqHK7tZhTZO zXYvZX3{2`O&Gzvq@%3%QykPaH&9@-&^{88pJC1M>q48VoNLaK2ub!+?hi4%T>7T$H zeH{3gG&!h}PSNf6>^XLoo?X*#Qt2U>uG>;a@G8l;@FdYF5caD#9Aj;^1Kui_olwr! ze7)5lIG)MM5CFuHe!AVkmw=B?b3a8aL4q!BXk5NKY@q&0F65CN4q?B_EQf}a91;Qo zo;}}od_&z%&dj9M1S3kKwz9^i2b}vQBqo!mF%1pFZoSM*nY4FuL|MYZxyPm~ZPd7d zUxQo*T;BDtF}ON+#@)VWQtv+rNKxBKv}*U^XHe-PMxqXM7sBJAMMsBHY<%lkfR)zU zu=|_3+*H3mH-@#Um8+HS%wZ_Hrs#f_Gz6qLzitzE00`a1dq|X)GEJp`fH-cIcDqt7 z?419Zs$67ZNOiK0YCktNqD74|)7e4eb^m3> z?&j)Sf2IVSs`)czF>=Mq7O3QXRO>Tm&RE8FD+Pd3%GKM0+5?x~A)u_)gr;!K>14g$durK|BJO9Z20ve`>jd>bey;BIvrJRA7+UlWU#Fl!3|N zDK=8a=>aRVaeHj5x8`u%?sJomckbQW{QNApUAuN6Z$J?$Q&$Y6VPfAqDw7>Ct3{?q z(ks5r-wS1M2CSrh?SY0E(hT6g0xD!Yk=jkWn>W1rdw2Li z{U9AjpUW-RIotnmDrQ#@vv4;dS%0P^(I~7i*zKJNipe`1$s9(BgBG&GY+45st1wL^ zZ?Mjt$xj~QJG$@0xW&saww$LuZ}c{;{Bu5~+axR_;wr3ugxuL@QZ8`y>d*4Qiep=_ zuLsAF2UFvhdC~i7rW65K65g^-5<$A;j3up;Vr5s8*Fj-o1EkY-!v+4)HSj*7Z$^j_ zlqaT-kX_@57d|@Y!5kg=6Vx9e7Exdw&LMsC5oU3?3BC>6pk*;x*73P3^mv)@u$L+A zmM3`4j&?&&Jjo-dp}uNHhlOsm_}cuy1Fy~ENvvx>6^D4%e{-{8@JVh1UFZxX6@0Kg z?9Sj*L=b{kJKz@M*Q2VZYP*O@J7!G%bYa))UQU>^Y#V=lfWz{%q^C^vN7jx!Hg-~= z_2&9Box72&yL+y^5)#AhL@8(>Z{`oT_#KG(8ojyH%R*jMp^JC4MN7_Z(kX*z+ zpOI-N8fI}dg35`j5#4Oo6z78zK=Ne!7MVk^G-=_v&_;l?VkCn&-l~Aylnjg*GkH5)KamPS z9cEA^bns3WQl`z#O?2G{!0&;~3=iqBxDQh-vd$cz0{w+?kBCa7XZ-Nt7GOT8y&A+9 zPDH{NYDSY2Ws2NHx1tiT?0%2F7_KRt`eEvlv=_scS?R>Sj;hdV*0|}gCHr19j@DE! z>P6W$`c=PM+g(;TFRY&1VYlN6tDt7sMD+`uZ*^n5f!^Iq`lnAX{yk{w#aeoL@hQqT zZw5~{IBc%;B=`C8U$Yr&Bh&QSycq{=(bX~yr)%k=qvOZaYR25TrnK0Bbg5*n*MMSp zmC39)!AZY={4unoJ9gavscVG{7OPb3%0MAS&?!TAglf{Q0E>L(;);@#+|DLs1+AbE z!$ix;XoOo~%&(BiC>x+xdp+{;>HQ)In?dzwjbL}pV&}Y&R3X}8&tXK5#Qbr)?LcI( z!i!uhI)Cx|B*Q16)k{j`ccO2l3M}3*-IkFkpt*8tM#Rw0CkKt#q5Pb70h8f zEDc~(tNTG+=AS1f_T&Eo4)5R?C4Ap#I4eA><@B9rfhEl;+vqO=J%;;OUVQoTrS-*? zePn*ak9mb{TjArOZI;a&$j!&;X7rJ`m6lOfCbP`f1bObOy{IT54v3QB-9~;+>d%sY7;C}MC&)xh4lb0d)?mTf>zSDH9 z|6$8xJKnGF$x5Wav<;e0+OIl~ShK^t>lC$Pw|pwk)b57r@AkI8cHY!a6#|{eEE&J8 zBx`P&vMpiN*BXpbMA`=?mUYjTBcoimZa%{fCWf7CmWN#@9|&Rt*qL^=oG_$4|6y-w z#zbIXKZ|R?cu&Tx)YiD`<4pf*Y=EkUbWq_F1HOE^XSCEhzr)V)Z4>l|7`O3QcW&sS z8BfhGAFA^E(p$57=@qXN_fQ!<8h+LI)Z4e3V+Rjhzrm||y?*s3?I~ZBI{jk5gS2wW zwdyBPvMx$UX2n@XgtuVeJ-#hVFM=5s>srKYwE&bBl*J_Rv8d zwh8XHT;=|%qRrdL$!5JKG)n)Rk}|Nobb#JT*UfjY7V15SQ8gPpu=`T;JEuEfC=@w8 zHthT1rWH2h#`Rv&{o>lXMWgLqPtMLrdfaktg^lqY-wuDsU_;>ZrnPmasan105nP(C)v?jsiV^+%>_$)%&^2^8*8&Hj1SE>b&n-9~X#F;0>sAk!@6#Xl2L68e zW4E>No?s+XTnrV83gRy`aE6P{l*J`5UZf}j$Q{lLK$kK;{;`;t05gVD=+f1^F^VrY zNo_T}lDN9L!unF%6(6fjd~i1CU4Hd3d-b0s)+m|~(WUYksV~8CZaVk{)2v;z*V;I& z5&t}}(1)TYoe5CTY1Ru;_u=Y2%J0tL9;?59yd~f@J}FY|5>7Ftu63sI!ZY^}rsOWD zq$}4_)0(hyK$vs&qk(}R*QjY}W4lIQDMCI<4>7@~xV%mY+|d8-+!!I+0~z}g*O$db z-kZx#4qEc1pI;28?ceiaVBw>hHkIF|*5}WA0u9!z`Eh&uPP3e|E7kNy7;iknTE6W_ zHqJ0UhQ1;r1InT_y?ln|BFPtX1Js}O=Yk4aOSPo$*fBh)v^eqZUuVyD!%s|&|Mtq! z#`EaCx3PBVJql|N>pXi`-vSd63l1329PFLy1PjytlXA%xd6dkuT7x0%ICR$@_bX1{ zn5-%k$XaUUZysqkAKG^QeDpopLCqS5{0!`^q+eVrmNFYnXk<(1S-*mdvaYtRe-tY@Ih}K9hHFUAW=+C#em;5FeDybXi*UWU{WsiDtzqr)5z-N& znN`1k^kwAaz?@yAW0cr-Fl|_cAci}yZg|r+HK5AjD`)`b#y_qN{gnb<#x+dTEwE;< zpWta`c;EfcFZVv%s{i!#rYlQTv*+e^J@4i9@!6q6@ktk_8x%ZjkQVSeJK^`m%8O*b zFNP;2vTuyd(*WiA^f8%woK}L?RxzEgCaw*f>4>95`PZ_pOxh&+o+x~Gu?nLcv$Oa6 z73PL$HuC6@KX3YKO8)B_olKKHlIG~_ zT^6%@oFoYjmZxe|=skDi&{hL?$Gmp@!*^{^3bpR6c< zsdUk}sAZNg#SEteyUmT8?}Bg$9lx(49b#j1Re+6ZcRGR)8)JnGw|xZb7|c= zBc1IO3c_WXkyJGDL3y{b0Xo>hk;&M4f%yW7N`3@Sy& z0D<-FoICCSHA~@gQ1y_1XTfx9mu)+BYHOJf(6M#`YIN?^(N0CUa@Nq4(0Z2zmuR`G z&-?TA4F6Jms~0E)8K)}gtfQlo`eysKZOyUJ6~yJ{&G#OU@%FDuFd6Y@C?^FQT3hI< zP^_F7Z}LB?=rd;=fE5x>TkWzV4*e5qVFg#-@s`0JJ(Zu}8KLF=wU}05=Dc}e zbv0oP+Tr6M76ch7DJk^QZGc$}U=y&rL`*7awbxy-{nyz^P4}~Yq9o`xqu5%?$_C*U zN>KRRIquBPJLu`PWp~6@6l_c&lW*Vt*r;ScpVWxI2D3Nj$cClBrPbO56KW_)H!ZsK zyD5k>2aT2kmPwWE#u)!~LYOWdeS8|%6_?NdJydW`>$EV~>E$KxF9#gV--x5MdF$5X z?Ck8!F-q{Qh3iYt-MK@DD*RYaX0+L?ehqYn)72i0qF>=r#KjE0STB`#*#>7=Bjj6nnbXpy+}PiLLd_{bbT zl3~w#+}SYn(~m3HwZlyBp7>yiJ1g@Zy>kihsaKc0H=&ee0axf#C#+MbQH8t4^zlYm z`uo2L$#9JUjHjW%B0QV`r1-o*Xo@vy@9%UIqk6{BRgZFw<(7m$|?<0MpkGMBURA4p{H(xBqe;w=6AM7|1(rKmr`~!iE33AUEdJNPPj5 z)PRIFH)e9LKKp2WfD%lvoQvB@}9pHu!rnfR9AP_=5+)P4PXq1`5p z4YK**(D=WOUX2z88Bin?U>q6&veH%obJoP!MY-ea&Yd;79Fp}^3T9;g`AI65A5~8R zL$U0BfncJ5jIirt2~WLxK}3AyEBMI@+T5YJAO3aATHIpu1eR`|e-^j>VzCu4TxU&j zI*eZy<#TQUdAV@mNhauAS|kcLL`^^cJkd~?o}g26m?FmK{BfYv_SL=6Kb^c6ozCVRi_Y00tg{=2?at$z*8R+7qQ)< z4P;y=b0Ywt#Z>5c{?u6#RiooPgFgxFuh?L^(x8Iq^Yu9wixw5B2W6n>z-Fg59rw$c zaZMUEO2&LiDpc5Iy#}@^a9=4QCmM-2Bz?VeV~j*jP?=OagjQAvI{Idd@lYa$c+iYO z;=*&>97va0hyAB<^RZoKSkddR=O!-$bGYqLal{y)Wxx4zGE3^1JndTf0}VHC>r8F! zt)>(|vdw=-V4ti1dK)j2!!CN4>H>h-@7f5xi|R{fBqa7f*J9YL-LDn0wYr95X>QoU zfBx~+-Q8~~#WT+ENr?lXFLp!z6&lKo z*vt44SWN0yYymJCG7#2G_cs_u!`%G@VHpw$9Drh@eYdmKtv&wZF{zt8ftfrOz88_! zwBLZ5Anf)Ob{Nn0fsAaV^UvyC!(UyR+gBTclwXQB0>-v&PuqR{Bfk-!SKhN&<9Gfe zL*_gG)sS?oG-oD|Mo#L7(YFA|%i<TL^~3ZQOqoJ~(pmzI`VZQsJ4mqu>XO%d_`iZU-|YTsxn!*VGy8Co$tX09z% zWT>!S+qdUaRTHkZ0N#>Yn5E={m?6@RJW>uB&7c2k!nK)jbi8}T*=4TKC%9PyY#!_$ zXWwJHE7Z#{OGR(`j1(0LmMuJ87M3*Y`%l1Jv{Fe`DG=ZfX!R9 zxWgc}aR$?uZXAs;0CKW|{S~*%bmxE0+~4Y@X>b=f*AApgEI8`X@q>^tCJm+>!Dg!- z5N!R0$v1A)5*gminL{ro2krVVAyA&ukCa^j4T>`Y|NCD!B_?0F09uW*iK`x^fnZPAYUbGrdoh_4WD8}CSr zm0cEP4S?tl2(EW{%s)w{Lum8)TYiG2N@<7^lrBT;68~M=L8yR+P4*CD7>Yw#{jn^j z35K!9C&!$_plTQE4>kQ&wj2ANDAC$7y6=DLrnXgj%X6x6Be}xNoPcK@()|N8W^wG` z9?SYH5N4j_$oR*tD08t6s}am}0I<7>uI`2U33dMYtS@}~;FOQ#;o$}6UJyHGFx_Uw z3ED_$p~Pm3eJi-iIxeJNUL#5qrfj|Ge2Z87^!3%X{-0sU&VI8gQL8>(zbp3S&ro7@;=gwi2YnvvYpfTj<+m~7eE$0NM%+-0jZ>dF{n-Awgt)+W4+#c{L^b?Rj$J9 zu3z&L4itQd7j#JK0M&2osS9dFcBSU`=)k9U}L_9DQa!MpLHGL^%BAsuN6Ww1*{ua?&I2?+PY7 zc&q&}&KK?wckgS#osKBf8~IDE!?n^`^mISr@{#JTXk1lLsR_>*NaqcPwGLS6DiB?? zU`hr1X7;Ywe{T2YZT7nqt`G^B5y9%eO>Vgjo8#NTUJOuZZNqtPlp=VMq%y+NJA6w9 zCcG>s_!7JnPEOXS(X;LCuTt!m;Tz3iepoZ+-=A6M-;1MA#{k-I@bEAS(GolZ%u6I_ z&>!hZ?&cnZs6jP}4UyO}^E8I(>$}+oic1WF9UyxlDhZp)`Hy!w&v%%y_DHw2bfgNd z)V>*yJPSX-QXT2+!s={;&^wIMZnU`nk-R8qA#4s%5T{3-eoqEdl64sI zIWCNp6)^2I0>;dFldJLRpM!Aq%~kFp^&54#IKDGQR-e+7*UVNn4m0}*t>be>)r#kS z5+_vmu-2?^?uSldqWN^pdd`c*iKzpHHE$KwkfCTjtG6O%ybX{iXAd_I=o(eKW*+oIC z^&Iw+W!p`Qs=^ij_tc{32EMH z%k;~(Gp{~uG}Ei4%NU)2<}gsGt>+E#~fd;*zQ0(c8Y7$jtDbLxM7;&qo&=#{kOi6lLEv=^jAWQ)*scU0n zg9~jls3V?-4yoB|waCiKn(pAR0sMC+{++wh^O4g`Snunkn1lqg_}e$pV$GsFS5 z(3$mfIJAjR> zvm(cgsU_2 zy9^v?T{x@KfHU(1HrRp=MAdqqhD5_p4bdM5_{L4clDV2s(0$7u>hF6 z4afh?{CT7XraVWoVyU4nr=^)LS8Bx18Rr#Z-c`${T9vGJm$Dx`=(Ujp)LW;YK{G>H zd@YP{PgT=-r-rWjQjMEsL`UBTwlw;~1btVrVPiJ#&WBXA@6n^~((|or)Tl9X%$Qrt zx~=1F$4+Z36f4O6;~qC{*REF#d@7(j1#{G^05PY5B&Mbx)N^eKbe4Wri~{NB91s44 zbub78PjAPpuqxM{au_gc3M4DQxgg+e%wl33L+DL2=~@ses4SYpESMI^il z>oz;We%Z&_Jg!pQoWq`RU$&ydlXYR#r9#1J|G_ssUlzij24?G?ll9<1Msbf>=r$8) z%ApD|n~22(Oh)fFUl?_W{p4D9^@M+5HOQ)kFByV}MHW=esln$c*!A zRgA!@5$G=S@mPpmAMd?h(|%LWC&4W!bmk8+>$ZcqgHNL#lixdZf{cx8fd^oIyWMn$ zx5N>2B33?EW%l*c|?oP~u}6DM0@&=kkphyDB-)99%{X&6EM^ci4EaJH-goSK?4 z8&H5YHYE1nvYbEcNSODdS3sr;eMg%w$L2UX+L1FwI6<*Cv0yEL^j5gnrkDEjoT$*d zFS{VO)T&sfJG_HXA_z;{Wg#it=eq5GSJ^qbb22zpShvI$sjFG7i)NR9yk#j_PQD`q zA-O^<-AlsUE%^BH?YPTM=bymI3ilgOwJ>94e-^J&CZ_PI#LNz&)X1H70StqP`c-$W zO+R<((z=5?0M%w^-o2YVahmG}iaPw7MB;@5>$(%ob_n?e=0O#=tk8W$={-&m`0$Gr zDVO7g#6&&d5^<+>%waT&ZlKDtqNi=J>}1lAOggKfR*hF5v|vAvU!*DH=yhpJm4S_A z82*VOk>_u$8HZmA^7C3$SjlJ*M34o%XUD`qA!939oG2F)%VH1Ky2%s>4C)#q*iUSk zQX?XQjqTB%T~9Esmt`F_RWwa9wabIUBO;E3oS*7Y%rff(^B!#*+7yc9@Rkye8$_KX z?Fz$9RsqV+8ilwNB(vd?B9M#JUlG>Dm*8TA$|ii+kiLC|q~zoCmIQ5d$Xs^7 zW@$f@<`lM|2LOT{y_iJ>|6tdI8gnuFz{PGuaB#3;8%tAD75quPNbtf~21_WVnw7VL zH5^>dIP(v0gpR2QJGr=64Uf|B3)NmN9Z2Mmho;!o*(ZnOxg;5h$8b9k_Ze7`#kT@`MK<#CqizWpSk4A2H81!3X2 zc7auQtEF3AsFR5Z&@qm0dA)Re;+j>8B)DNNVeN#XFladHjJnhXq)Ign z4P~vsI^fcQAES#)N+$fsefl&pQ+r-*wcgNwA!k;RSip?05A+Cbej^I~YrGUS&s{Up zS4LTkjk}j_uN7|MgMWS4tHCqZ(E@+^Rpx|Lr|Hu3Q#Ed9XIq6uM0Ak3Y^(kgO!w^5 zadhVfcRL>Jx1_&*4OoidPJ_Xdm%Y1Rml|20s|Cd6j;1^;JiN)<)~ZoHrYC|0JA_LE z1ljEqO86rosjZh6W>uH13$$%ZD5${GW?T2{)Tug&cm3$j>BT8~{>1cc7c_=mta_Kv z@#9f?dTmPSs}zW^xI6(FujJ;o(a_Kk$l%1ZOFIAwM+OZ66%enU@cgyf_;hyty%0Oy z;tQiYdl(+-n%$@H-Mdh@Xo0c)xg+Q?3?UKHa(rSLbJq_;aXmcr!*$yAvh=s<8$p)} zx9IFT*n3^qmxDR~Gl+{>+Ifo1h%v3uGN?K_I(8j@#Lr?#j~>TIe{d~r{d?1!QW{sG z4$>r3L%Lu{OP$s9;@yDkEv5}+?9#D!Z&gZ%WbSzHg--^A&t7P?fKKHhiXl1Q0Ba(( zfdb!`8(I}{(O{R7It1nGbbMaOd9P$EJiW2UPOcw*$o!nXr=9aN3Ka3Pei9{A&D^SBY4JUwO49~@Bg$!Bz5 z9*L!5VdV}$y-$a&hv4oJ&x{Z&l0^ z+i-ardryMNE8IZ8Wyefb2||pCKdkw|6s)qF94f##Gyw`}Zaz_-KPR0KN;g?0l6*OD z`uLuPRkN`2LZFFl;Gf+*o;j34l?B3(#vgOO4 z7Z!R!WX`)#l<3^w( zU&1JneJi6LuR!o6_m&iwZn+93XdU<4&)j8{uUVt0+WzVV9EjUzdq7D{UzDnK zv7*N`1ED2Qc@RljouZ=pMJY9M^k~15iN_{2AOlIpDEl=~if84C@L1sKPUkxEM~2~l zy%?Qtc(pdN-a^`Fj6+PmwmpC0!b}h+-oCHTiuSG>g6xtvKF30!1R**d2k#6?ym?*xboCUW!IlIUYH zAq#fz5}CdQS|7dODU4p0eSFe_B$ajZ8>CJ#@1~#$ODz}0tGGL_s^+?k+=iSra?7kQ zVbfcMLp#o9^q>>Th$QQr1mPO%PuY*6jq`g>P7sj>I%WV-=e46xLkNv z&A^?a0ArZ6pBX#IMTiUB2yJ#;tKQn$MzDUhdw9Kn^~#gLVu#!VhUiA>dVanCyYoj- znn=mZ+)#;w>xr&SNRd47Hv_LrcS?OJRx{YxDk1#jY}N+pASVvS8KEwjNN3@b=1{e+ zGrXKWckUKmLDN@$s!jHcuBEm`ck{2MOO~vUjqQhXsri#bjZJa(if!~niiL6afBjy+ zu3YKk)9OzXs@AEi)Z=)u`jEa&x{g;lJgpr$uXq29<2}}i!j~S`9q*_SUO@#jXFfeN z&}wP*-!o}rsC)a+JXihtr2H)g-3{(^F{qXI%4GW2S?x8HyIR&LU7QwrRwwUT?de6f z?Yq}$KB#e?P1>+94XfySKYp@pLzc>manRzWOIeas)vfr=0EEj^3cj^f64O;x!|4>L z8y0Sr45R~Flk?>k+s{1Q^!2OOBcHv=+m$%9x9X&XmLo@&mY#0dpowSN!X>ggTPX2l zzKhSofEg?-EIy^QTQ?o5jkLQc*(V)-r0(nME1Mo*v?~h>0yOVXWMt%)ZNiO&rMZNoLF_zsY0*!{N|sYs!Si&sovLmw+{JCd7|C$HB-XmhYy=`uZQzq zCAUXy!%7!Dj4Xqf`vmobVz#UKx)x`wBErL^loBby^S5vJzKdQ+hUsB0-R>}}i|!tG z7g;+mNp)%C>Pmx(J?)&VYMFO#Y|`~QtUfL^D2fqA9%T?-Ee#p*>>xf@akFs$NWf#F zjd4h02HEt$8aN8y9L{7%}3gUe694##@@WuVr1FLd=?-dc0!;nxa)LqL312_Iuq`L#PZl(aJbqy9ybDtg zR>Ze(YWC*){goX;UIhD8OL)v59*B7IgahM%Itq3ZxNF9XmqWzpKz9;bFfsBlu9J#9 zR+K!XO-)SHk>0Pvw^y%gT)qDK5-ge@3qFn=t6AS`^T>QFpWyEwau^7(n5-dG^hW`* z20-TfG|5PBn;prZ0t_LSfpT9V#4P5iO})6X0llF@jv6|?stmWFimyEMqcTXnxEHJx z9J#xq@2#LARrP+>F~1X|)*+-rI3FHVP(0J5a^|Xs5Rs+MSLoMT4^%Ldc{Iz=WTy+R z%iE|_nw=X;%RxZq*DGOs=}MVm>cEV%3RNErolr{jkz>d9ELD;_IPUZj3$`&Tb2lp% zP01L;_x$>9drPIMnVUB2tRKDkV!2nk^^6&nR*oFTjtS4Zm#e6#<*{lUHf8>R9G8WH zWk{O}lONwBeW)`E1unRmckURZRm@VtSl*B~%Q6y7(VI4YJ8FFhEO|ldUexp8t&QyX zm2RcjSlOMVYNN&%4(P>vc%@QS@mgbA2KCVhQVIPu1_-G0?PJ;SCsF1lZ*;O?f>fejq%`P&#&>;cyLT=HRx z)Yl*@Sta#P23IXSbFEdYR>{;GOgwt+SbXN%qG-O)<}bav*BP*?;kl*N+2l}hGOV`u z!EG1Lg>`u|W^dTgxUp7QedOy{*Ze&*eNUiGulnnjXs7XmV@Li$basYL9T>cBU0!;x z_3s|6e{gbrwpCJQ?;!(EPWGR8%WI@|zOF$~zXf|u2L+_s?-{&m>H4?v=g&Xqg-fjk zKH=286^)2uL*ns+@@cZS9`Av`e8~udVPS*H#%8jH`OJPr&!L{G8%#0jE7}2ftv*x2 zs}QmB{BB(dh>D65Fsi+8Y9?rr;jqyXZ-_W&zZ?i=pL3jbXPG~j0$VE-w{PEOb(r^E(z=+={1mJLgd>NTz|&J-(y`vJT1AZGXh}{ZdWDHu zjgA@Njp6#A9p&BdcIIjZs`nf;s3nc0K1BpTf(Lw_S(>2$H&h8i&5+xL*gkm5=1m@u zA=k?^iyZjK_D(ZHsbc{DhJhs3ell^~bNjk~zDD*Q=Q;KKyPshRmd@bS#kG(lXJ`$q znKgS-yFN3jk%K)L?#zH%wc+gKqFp6QyM$HAj@=ghLGsmU&_(%t> za06n^pIpM%R_uD`Uvg1sRiIO1#R?_Uz|5>Z+(0M@!^p}~n(>znzgPAkywhwV8BD)7 zq)zf37~9R*so;rVY1IQq2fX`{f1Yoo!n(jM=!ax&k<=nIwwxQ)7A?H6l$i z`%+0vXv&f$k|Gj9i*0CARAv~mFCi)wGG%#WPo`vIq$x`Jz0P>H-*No@_#Mah+aJ%& zGj-qhbzj%#bAHbA{eGYC(~=XHg@91uH}^b!$78eFgINVKCVTg5QvMG(u}ESq7!V2a z1Z1=-l}8tT+5Dex%^g?7MBxe3A5okOSkk}unu8JWD79lHLuVRwzW0$K9!C zL4NA@K+kK)>$7Zi80pxQe!rypr861u{^jTTg~D3=mx! zSq+8=-BO6jDt}LP{9$_if3Np$&((Y=tYZ!xst++1@9`Pf>Hwhpb8kh){(+!MpB#5a zxrzx60S8xtkychJWT@f`r>uv&#^#~_>26_}I5|C1NsCth@5d&9@TBzC)v252>^=G^ z>8hW>e@22k1(Dhu%Lyc9{w3r0^&gq`JEV#Hv_8JWN416&O8l|Ucs>uolI-T|vK{wN z&nOr){on5qqI)HvOUstJdauF7RQ{?ByYcPyEhb*jwYiJX=mZ_aQeepGuQSZ}7%(M; zmXx|9e;@GeZ+DGym>%#IgMH4}`ULUo)MbD@p-YjF2u$m=?z5i2vK--)y~logEaf%^ zjsd{Pi$pFeuK~l1nP3nXH*56hM(`t4s;~`I+f!_=etU&=lGvW8D&pwYMSf^&)TCkzYi5_&W{``Xp>iu%7Bm%b+(pT5>E#~JFh)>aK>P6ce$`w`yfpf z(&`L&n!if!_afxQ5On3!NlK*}<6>Xo6~V^dfEbhe4q4Dhxk{qc55S)0MNPs?8o@}a zT?meAckVQ&zOw{50ZkEFk16ICCj70);7jVu3~*|w1;#X*t)>5)4cc&L%7agWeWK(Q zWJ2y{XlUpJJUq8)51(T=H6JRc0%nH@CPq#?_uF}^tKs4i;L5bD#rdbyfC@(wn@$=H z0hN;gLvTq29SxyzPL47f?5rWll7Gd+YX>=u?c@F-i&!kk4Ld6@0EcCfazmV*o!4{9 z3M$SFK$!#lb)w zBeR$f-I=B%?7cRFkF##_G6DPY!yr=Nn_8EUBHhCSRiWSh46+8`uRgw9ck<2ha;*4d9AKgz)&wA|;) z4)7X7y&`b(#Kj92Cgm=X37}Q8S&NipY3!{D6S#GfkZ!4;aPwasdo2oMYISmybjb34PW`fE`r{)=m_m}cKdnNb%x^=bL zDmpbywiFf?8oB0VZ7w=S8}QwS4>M3bNI_5@-Kuc z0f>s~ON)wpQFw@MUAxxf{-jgux)5-%0*@`Ot2Tn}g##rkI=E?EnB7UCCC*Dq``V}* zSB$X@l355nZfb~|GD)A9zk+P2D{P~yTzc5?75!7%VGCkO))`ld)Xa8j%INJK;=_AI z7*5iEJn+h=f+pfraAm;(C!LQ6>swSUd-JIG_8OP|8Vb3~*6QaqW5}dA>lQH0v zx`QY-mxtu#?JebE^7e?OQ{yUiiaDeRJQ6cdREOYA5lcYWnK|#$(}S|76B;A|$g?9+ z)aZC5cxL>zu&{gS)-79hrIahVS{1_7KD|?Gj;4^O&~x?xzgk;! zrKz@gCxTBy1se6*?c3vgB5SYPd@-ms&yQVAaUtEM!tBy3CAO>DM;FztuAXx}pDD&p zDv62fQ_P(`HP(8a9i&9B{ahvxf{a*(9U(V+iKIkg1lgK+3y7r;#sVX$(;=(^(6o01 z<)Ig7+fctHf+7;Y#8m%oZmt#OKW1`5q4#_` zF1jZPCvThv%}@_s<Asz9IR?$h-uD*2T^^X4ckho<_r#Q>n5v>?I#>FIoUw$ zY$dcZT73S`pC&zPot;#{MbHCfw`6&p#KXF0>;y$a8v?xko<8-MHS3x8py6T(yE+w4 z?HjmX`NQbb%+~^__vXL{l#((OTc-5TF{v_j>Qs)&iH0k=ogES2FhP0qcm9P_>zMoYl&8kLej4pt)M#9}Ubntt*P1PD@PoIyfm4^?PG+SXu-hGZ_2-}K4_T?= z@2_ni_sG3OWB7r&qPEaWx2Dke^umL49yt z^80$ag+-Oe+t0pnkFM2gtgaF{)Nuc~Aam7k@L!NYj!ON!1?~^;-*y_-WNZ2KXP!@c zhW-|0uJ*6r&z-B(-|*#OSZ3~mCH7+`_}W=Vsq6pqDgsxpo7LFdZ+y7czy8yM2Nn(v zU*D?j`r3csl>h$g(~FMu$Tu|ne6+I4yJ}hS{iN15)2yQ!{OhIf-o07$^XO539G^3< zJ2q85vvspNXf3b1Gg&6xxc!*N>ez``22O~*-Gc~W~ORlHW z*^??pz4P`sgk|SxReo9(?Pv(*U4FF4I^5)+SLf;DW04bSaeWii_0`WGfwU}U%Oz=3I91yuxrqv?MVKc9%1FUX5w^k1;{V)->v;zlWAlg=rURSa$ zW~dpw+gX5 zE{#~`)uyr&V&6j?><*OX1S8Us&gAHuDR^xk<=@+2>ezI!^M8w2AiaNTV4?Ilr)`G&~Rq?mN0jU;T!O%NyfO`A5^ zx@otZC z{~?ak(9#Oi-5OPwyauf-UD$k%WzIEpId?JXjQ0Sd5$G0eeYpO{@8Yuv{g5?LNL^&a z+ngCQhSq%h=HVgj=QgLRUqk{R6@i=$B*=YH842;k%;#&Q?4V9f{QUeRJJzpLevMnQ z`CI6=?hy1gx~PB*{Tc%47PoO5@&IDirn4(|NAD)C9T4qxWJzFC}yONSN zF6Ey=11VtZBQ`B7N$K!nRf2ZNma2k(B(x3LT=jBqf<{PSm7$tzD9{TkgH|isg*Sq_ zE(6LH5j*|0FmAoxdD#yA_UFbS+kIYsdyf~>cq_HUF#C_a>b4{Q)9iYK@3((Uv%Z$! zvN>Ic`n+N6@#Dg4S~xjfIX9xK*U)<{GOT@RY-MvN`R{UekL9fsszQ5Oi ztKY+~+8FVCLZT7p3w+y-iJSP3IWtU_rOrI4p&8RK2?zo}kggOqLm;B3nEX8J{r$V> zsbyFXbI&@5TtxhrfeSXBKW`=v6+@bYzw8n;ygP(7l_9JY2N9)T!9!fB9#nsraeIQJ zYgr1IPbzOpx?`3e`tXVqXLru&-s9p7T_-x2d)C`;qHi6jKjskA&TM(8qea8YVKj;; zF?lV>qpqIbNNoQsWxOj0@fJXOnI?cmI{hsLurXG2y-}r4kYCaq)I=%Z7)G%Tvu_A8 zc!RvLTOX$sBS>OvYUY#MUvUMgxw#HP9cYCd_8zK2+u#F_=qR-3w3J4;~EzqoPGB!0Ls)_eRN7qoxm+uy{42j5kTFg?ADK7%b%PhB|@ zAFoEE!3ioDZpju?_n}OZ=mmddL@@1knczS3rb+ZVQ#U)<(D3vER#5?RztksBX2HE2 z`>Ti5?H{ww(IFBM5mBD3Y1N=%Lq3Fnr8;cw>A3N(x*IiFk1FexoracvpZ%RfjP9-j)yJP8g^~o!xl%mwtwZQRfqi|7x?c z85Wartx)D8^6~C#q=+N5Yy`v{?oK>$uc~r)#e#M_+TRlHMRJ^x()X#Eg_DVU6ojtw zg34@q`ckL~QEgSt21PW^}Ji~%Sq9OuNbesovtuiJSOG8|KpE_IyEcO?Y9ixuBLSQ!Ap@TBGmh<=?g;f#>(e0u2PT0_ydP*(6~O}yet?8DMyyRUtwV!FuA zHfup2a_6+p%IkyZiw_qC3!f!*AXz0KsBN|Fo<7^5Z4`wZGWOJauoDp+0x2j89fi9p z($dlxig#X417^h}Z__g}YD#H;`<~O7F=PB?@0)hPoLQ(90)(&@c!0?CPfDfRl}nDA zjO!3qSxU|?*a|R1WXPmE9y&}Xo;h>1d;y=0ssrdn%97$es-x3H`ml$8HFdwkLZx`VeSUSJs*lYUZ zU4@*^nkIsB?TjO%w9>m@=Q^d|g8rO@Peuva3ChCS(Z^eogsI2`t&k^%CVX~U; z;9hBCJEw09PxP@90z$|htkpIiJNDDzuj(Hw-%dJW<2tdWg!6v-dZi|96T5gWdDvGv z!+~T;p_)-2qSsawB68f!ekP;`(X^N=xwT$&J#}IUO=Hs0CJpU6a7v6nDKWQ#kEDXO zayha}g%bi05^>DA)gKSv`-x7zWq%rNF%T<-M_#FN{4s0q zylFHrlLqa1-DrdTmc!e|@}ea|LNYmz{t%WS-k#RT#)AKR(yA>nyUK55KYh9vNRD$% zo`zNvIHO5V1(x%#UFVx+>SAP@%aSxnZ(uN;7!=g1(#Sh}CHM_H&q}0T0ydRCPF}DB zS4T}w+gyS0f`Po%y5{a_-X91EoPS?_vu4d&D>uMJ<2}>^t>lOUR2`T-4Xbej?1Q@1 zMDE|;6TmEu)KC3hq<(Jr2XeWV(4eU~IrjP5ZQJ%hk(UOs-ekpJ3vDN*cSp<@r06h$ zMSaE94pw35Y0O}x1=~9R3J9Nzr)QMmPvee^=SW5-Gw=MZ84c+}wO`SuGPXk)`I+6( zQHmxyq&)zWIsJEE`cjj%-rlRt%5m+thL)`!+xT|-u+Z{-TZ5ZxEpK)byA=T0UbqFO zQOJkS0g8#m9e*x(B%?YlP&ABUCihkXA!iNRrPdU>w;bPtFESnHwLU8C-s36bQ1Y|9KM&5^PUX?)uiDH?$ zN2YuTQ5Rfzpw%Gnj$uvp%q)$w`hA`-C$!|r*LAOt^d5KU+s;&rneOV~AgRMHwXW6= z23@Hus?b;LOgN!6~1olFNg7!M*&au4gH;eXtqX*MWEz{4dqwje)fdWK*yClDEi;$PE?ulk5 zCAQhd;%?_?rr|A5V2M}I9FX1CKuX;3UxAtneOgzN$3h}!jt&k=D4um?U1u0@w}A21 z)@hsS-t0|sj(Po^)sxGqJyaB)%8bH(0yOw$?TyxIF>yCG7EN_38w_*x1K$cBD$sPS zeS5hzS-I#W)u5(id^oR|zWY2`H|bCll2Dl>mQg_i^atQJdNNwme}sb8ib4qqdq}6Z z9%%9@S=WO#v2%Z?)EzpkV=elA+~3*}dN%{5A2@K}E?qJ(8bvb(8Dph@VyGd&nBg6c zPs^!O2jy*aw~J>=;v~|MW~?N}b~hB31{8MLFDtQT z5alF^SKq#U*OP#9N}j-KgcEQ6^diuBK@26}lQ^+?50U(#US4#jCN3_{nR6d8MF5wM zT;c9-E+b@)583T!^EnDlBbpE?YMkvbKQapN6Y9@pzwUYHdS~xmsp zD!FYDUI7Rc{1EM`D)lT#uPh|*QZ#`%Z=d`^9;vE)z$+t|;%=-rD*uSAgTwviP>+qR z9=;ZR`N&J$^hwpveJf|5@g`?5tob6Go?89-8;st%!!%OuFG#{E*hmQ?`!}&K>iKFF zF!~LSEThxLVVTzKWXGRKwI6k1;!r$IiF+L`YKL5_=0^2M+jsvc3r5$>%xuyxBpR7# znky3z+qEZ*9CIup>qxzEqx<8*pqbhC>>VA$Nn>)(gq%HlRy+0E zFV-rTP{;;Xf}mo9(cswg7=ma$IYBQirEhm7h=ZZ$>C1F*CtijKoWrz(Y2;SSCN!2z zH@wqjV*`URAlYh40p9Q}dE3@-8rV#1p$510<~hYX9*sUBfmGv0#A7G?Qw6I01sw;j)<#7=+JuL+jP5a0@$2F}$U2RVI!MIAD zVby2PR``cth?bt08$BDoS=DTQ*Ns#L2NfO8RFgD^yRs4|uB$84GdE|xgl5`kr>~XI zj5fBSty|R4)w)V!D$QN2X^()&C3?xYkm(}ao)kqQ)k@h2pcB3`iyIDDuLO|<_M3DN zJop2054U~MwCh+Ynw^KNxK$={+CEB9j(N46`x;BF<%+Zp?WPnJ37ncsxGk9;WC3!&pnfIv9ekb^m>KiYEVZyZ>$tN?&_LlaIfB%D8v$aTl(? zy58WjPKJ^79W@`z=Tk|`K3`jas?uO4Ai5-7u>QaK)vk;8ZJ&Hrgg|{wO>dn{LE!^F zrYLNJ4P?fL`}2-SWlVUQ<(>YP)QuUSD0E&CE;Ai7&_xjdZ=Vt`7O|yPu0DJ?D0^@J zlBe+4+|lW~GmrDD1^H({$x(+kWJLlpS|6?fSQoHDc|n$NzTyOHUAYPwOmZLT?njfJ zuxlWL8Z@qpIPgtf{PldI|w3=aduWAW>x5Zto^bZ4 z{pj`|k-MUcOxILz?>I=aZQDjV!&>BwPj9fSPRGg8uct^uT9YPQjozA~=FK}p3xlGR zmzRSL-!^&+8_*m;P-SPzyVE_%Yr8$3##RCx2y?qk(x{?HvmuYp?eSOEXWW(|0ET2E zge)&!zgD&Qe2xe%9k7YdSnI;0;n32Q${-y=+2r(O><-?HT~BT93PwQ#^CnFd9Rx}MoMe>u%uSQiA;HwwD^#xOv0b=Be zTgZqEO0!Gei9HylgDOPiRmff8Tt!y^b12OOxkY{9R>z@>=V?|+e&08IB zvSC)AMoOX`zg>U8)ACM2*wcX?9;JV3l=zkTY+YtK?}lzz=F*`RP3asse@3;i^c+gE z_$d1PH!?V^1BA5zcr?dgt*OU3E}>3zlS~G@XXhbKF|riNkA7SEevWj05L{b-{aWoQ zgdP#G6XNqA@&dy&0Go(KEvwh9eUzEKM!8w#JK?VDow3?!H7Sz2bgau=CX>xbe-(vr zG<}r0rSHt1K5PD^HsUpDI=ZFBo_~jI+txr~Or^^D<$9k%3?7|1ct8Ko_J5PEB+q_~ z$Ra47gLYr!bK@UpD$;0ECj>~^1A0mw(yd>=7T6!9vie*WFaE{x5BfsPDu%eEHn7{< zw;mOe2w!MfUQbli0c`;O^+#fjbQZk~%^76;OMRURN6vXxpLLbntyOz<9#2|qb2%}q zPJL)E8QA3XWyLZlk0l2Y)(AZ{kGpW%ae}j=1X}s?&D>`8dA0B3wxTuCP^X;pe!DyT zl3y`E(!Mip-H$<=XP$|)in&VDn)p&+*jv=j&t={XT-}~7&L#vp(^fSNaZZTGWIVh% z?arS$%L93+b- zv9l%v=wg&8!Yrbn6zwAPriIJwLG_=>IdMhVCi6dky-U#g09mW-j9lQEceokz0(S9a z;40jbwA!}a40Jj_|J}=%{`h4n3brqmM%C3|!hMNMc9BEPvJ1ye7F{Dfh}e%gxlj4K zavTqih#5ZrcuojiAM#s;#-Js;-K43FbV<bBbKVNu|4V5_F%j-AON6)Jnxwk{Q zQ^>-nSG<1tvTMzOCB3R>o>f)oymi}s_U-7ABW*so4RwkP6Vy2^O;zd3ld-FQz0?fk zb{_}j4znI5<#p?KRzKs9qX5FYUmS2QP;)MN^;~mBcpcm7&<*l zQ9-FHzcVr`-j_|k`@!fa{5QxyHA#NRtG5DEt1;)!eRiq9SL9xt`E$|r7LdVMfy07Y zfp0XG`c?@-t}`xij>`i}zuHyL_na7bhEnwtbxazeXXK0-`(<^(E*)uARQ)z!!Jvkm zW(-zwR5S@snpkkOpqa1$8euNGJQaLG(FAJUQ_{VAcQJpeXF<2kG}K%(ImCiV6M|70 zsFCure~gsIc;)h}jS82Z=hTc-bm)H)z`&&QLrT85)1@XL@M9J|JPUL#UyRS)wR5Kq zLBW8|GgU=0ip4n(H%r8LGfNan=$XezlErbMP6Kxg%|UR}5f3bli~BX{dV}W~f4UH9 zOhT)%|I7xY4D4>EC!J|iZ13WweEih#iyH?R8rqz@cya6&dk*0nuwS~8eGu?f6-ioo zqa*hsXZ2~zU6@c}@+zKcgLG35*8mf}VyiEHOQW7HLV?EZHn?vX+@J;oR=Ob`rK1+n z5vy;<9!L5yN9SDl+WCK%RaCU0ikOmwIdSOXY`~dmI4wB3&m@f}SB+(%<(_|s_oB$i zZtNKTwGKatAi22c-~{5D+g5e@W%?T=zddl|(F?fLC@ zSjA`(a9V>l2s|M02lvH6P>RM~Pma4ASjSexk_ZV1L0Y~Aax$3Hc`KmS{OKtMEz7sL zqJlky$v_O}LJP=;SloT*-rU)>08(XNR*`8#tGFJ!09@MO?%Be}#|Lz5JY}aft&_GF zT7HQkur@}H7jyi$F;R6S;P(vzg*EFGS8(!eb=I8AqD8$ZQZb<-)HTNW&nV*-D~H}h z-Ru<5&@}W+B83S=mnSd=Y*1^ku(q65=OZ8f0#IsCDl-8$G&NX9>cS>Vm~qr~pD2z;5Dbo-8+j!#_0 zc%d<4e|dxchKT;-vrA^=vcW@4 + + + + + + + 2024-05-15T11:52:34.512395 + image/svg+xml + + + Matplotlib v3.8.4, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/benchmark/over_time.py b/benchmark/over_time.py index 53cf05715..33e80e67e 100644 --- a/benchmark/over_time.py +++ b/benchmark/over_time.py @@ -1,11 +1,11 @@ import matplotlib.pyplot as plt import yaml -from datetime import datetime -from matplotlib import rc from imgcat import imgcat +from matplotlib import rc + def plot_over_time(yaml_file): - with open(yaml_file, 'r') as file: + with open(yaml_file, "r") as file: data = yaml.safe_load(file) dates = [] @@ -13,10 +13,10 @@ def plot_over_time(yaml_file): models = [] for entry in data: - if 'released' in entry and 'pass_rate_2' in entry: - dates.append(entry['released']) - pass_rates.append(entry['pass_rate_2']) - models.append(entry['model'].split('(')[0].strip()) + if "released" in entry and "pass_rate_2" in entry: + dates.append(entry["released"]) + pass_rates.append(entry["pass_rate_2"]) + models.append(entry["model"].split("(")[0].strip()) plt.rcParams["hatch.linewidth"] = 0.5 plt.rcParams["hatch.color"] = "#444444" @@ -26,22 +26,32 @@ def plot_over_time(yaml_file): 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_edgecolor("#DDDDDD") spine.set_linewidth(0.5) - colors = ['red' if 'gpt-4' in model else 'green' if 'gpt-3.5' in model else 'blue' for model in models] + colors = [ + "red" if "gpt-4" in model else "green" if "gpt-3.5" in model else "blue" for model in models + ] ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=120) for i, model in enumerate(models): - ax.annotate(model, (dates[i], pass_rates[i]), fontsize=12, alpha=0.75, - xytext=(5, 5), textcoords='offset points') + ax.annotate( + model, + (dates[i], pass_rates[i]), + fontsize=12, + alpha=0.75, + xytext=(5, 5), + 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_title('LLM code editing skill by model release date', fontsize=20) + 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) plt.tight_layout() plt.savefig("tmp_over_time.png") + plt.savefig("tmp_over_time.svg") imgcat(fig) + # Example usage -plot_over_time('_data/edit_leaderboard.yml') +plot_over_time("_data/edit_leaderboard.yml") diff --git a/docs/leaderboards/index.md b/docs/leaderboards/index.md index 25dfc130e..d33cc6a54 100644 --- a/docs/leaderboards/index.md +++ b/docs/leaderboards/index.md @@ -187,7 +187,7 @@ Therefore, results are available for fewer models. ## LLM code editing skill by model release date -[![connecting to many LLMs](/assets/models-over-time.png)](https://aider.chat/assets/models-over-time.png) +[![connecting to many LLMs](/assets/models-over-time.svg)](https://aider.chat/assets/models-over-time.svg) ## Notes on benchmarking results