From b7f7204c4e0b777607def4e977baa34a21ee8735 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 14:29:53 -0700 Subject: [PATCH 01/40] copy --- aider/website/docs/more/analytics.md | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/website/docs/more/analytics.md b/aider/website/docs/more/analytics.md index ac5f7946e..61e90218b 100644 --- a/aider/website/docs/more/analytics.md +++ b/aider/website/docs/more/analytics.md @@ -1,6 +1,7 @@ --- parent: More info nav_order: 500 +description: Opt-in, anonymous, no personal info. --- # Analytics From 4c39e92773b8db4f3ad048e5a58802af8e744ba3 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 14:39:27 -0700 Subject: [PATCH 02/40] copy --- aider/website/docs/install/install.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/aider/website/docs/install/install.md b/aider/website/docs/install/install.md index 70a9b5754..f2dad3648 100644 --- a/aider/website/docs/install/install.md +++ b/aider/website/docs/install/install.md @@ -9,6 +9,10 @@ nav_order: 10 - TOC {:toc} +## Python version + +Aider currently works with python 3.9-3.12. + ## Install git Make sure you have git installed. From 42abdb0a4174fe86d7b5ec071ce40afd706a367f Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:43:25 -0700 Subject: [PATCH 03/40] feat: add compact file listing using rich Columns when pretty=True --- aider/io.py | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/aider/io.py b/aider/io.py index ae2967719..0261fcd11 100644 --- a/aider/io.py +++ b/aider/io.py @@ -700,17 +700,37 @@ class InputOutput: self.chat_history_file = None # Disable further attempts to write def format_files_for_input(self, rel_fnames, rel_read_only_fnames): - read_only_files = [] - for full_path in sorted(rel_read_only_fnames or []): - read_only_files.append(f"{full_path} (read only)") + if not self.pretty: + read_only_files = [] + for full_path in sorted(rel_read_only_fnames or []): + read_only_files.append(f"{full_path} (read only)") - editable_files = [] - for full_path in sorted(rel_fnames): - if full_path in rel_read_only_fnames: - continue - editable_files.append(f"{full_path}") + editable_files = [] + for full_path in sorted(rel_fnames): + if full_path in rel_read_only_fnames: + continue + editable_files.append(f"{full_path}") - return "\n".join(read_only_files + editable_files) + "\n" + return "\n".join(read_only_files + editable_files) + "\n" + + # Use rich Columns for pretty output + from rich.columns import Columns + from io import StringIO + + output = StringIO() + console = Console(file=output, force_terminal=False) + + read_only_files = [f"{f} (read only)" for f in sorted(rel_read_only_fnames or [])] + editable_files = [f for f in sorted(rel_fnames) if f not in rel_read_only_fnames] + + if read_only_files: + console.print(Columns(read_only_files)) + if editable_files: + if read_only_files: + console.print() + console.print(Columns(editable_files)) + + return output.getvalue() def get_rel_fname(fname, root): From b71a3148cffa936c9f6c76fd5a36dacc96185d7a Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:43:29 -0700 Subject: [PATCH 04/40] style: fix import order in io.py --- aider/io.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aider/io.py b/aider/io.py index 0261fcd11..b63a7c7a1 100644 --- a/aider/io.py +++ b/aider/io.py @@ -714,9 +714,10 @@ class InputOutput: return "\n".join(read_only_files + editable_files) + "\n" # Use rich Columns for pretty output - from rich.columns import Columns from io import StringIO + from rich.columns import Columns + output = StringIO() console = Console(file=output, force_terminal=False) From b9939d4bd944eb1687fea67192afea4f33db8e2a Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:45:31 -0700 Subject: [PATCH 05/40] refactor: improve file list display with section headers --- aider/io.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aider/io.py b/aider/io.py index b63a7c7a1..26abb291c 100644 --- a/aider/io.py +++ b/aider/io.py @@ -715,20 +715,21 @@ class InputOutput: # Use rich Columns for pretty output from io import StringIO - from rich.columns import Columns output = StringIO() console = Console(file=output, force_terminal=False) - read_only_files = [f"{f} (read only)" for f in sorted(rel_read_only_fnames or [])] + read_only_files = sorted(rel_read_only_fnames or []) editable_files = [f for f in sorted(rel_fnames) if f not in rel_read_only_fnames] if read_only_files: + console.print("Read only files:", style="bold") console.print(Columns(read_only_files)) if editable_files: if read_only_files: console.print() + console.print("Editable files:", style="bold") console.print(Columns(editable_files)) return output.getvalue() From 7a9988c06018535bbe115d35a6020a030be2a02e Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:45:35 -0700 Subject: [PATCH 06/40] style: fix linting issues in io.py --- aider/io.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/io.py b/aider/io.py index 26abb291c..89f43a7d7 100644 --- a/aider/io.py +++ b/aider/io.py @@ -715,6 +715,7 @@ class InputOutput: # Use rich Columns for pretty output from io import StringIO + from rich.columns import Columns output = StringIO() From c13536e64181c520341d0b3f3fb60bef17ddbf18 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:48:12 -0700 Subject: [PATCH 07/40] style: move rich.columns import to top of file --- aider/io.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aider/io.py b/aider/io.py index 89f43a7d7..04bd9f64b 100644 --- a/aider/io.py +++ b/aider/io.py @@ -15,6 +15,7 @@ from prompt_toolkit.shortcuts import CompleteStyle, PromptSession from prompt_toolkit.styles import Style from pygments.lexers import MarkdownLexer, guess_lexer_for_filename from pygments.token import Token +from rich.columns import Columns from rich.console import Console from rich.markdown import Markdown from rich.style import Style as RichStyle @@ -716,8 +717,6 @@ class InputOutput: # Use rich Columns for pretty output from io import StringIO - from rich.columns import Columns - output = StringIO() console = Console(file=output, force_terminal=False) From 72c1f25005c91ef8c4380f4ee4b21ed8aff6fd44 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 14:49:16 -0700 Subject: [PATCH 08/40] refactor: Move StringIO import to top of file --- aider/io.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/aider/io.py b/aider/io.py index 04bd9f64b..5e27a267a 100644 --- a/aider/io.py +++ b/aider/io.py @@ -3,6 +3,7 @@ import os from collections import defaultdict from dataclasses import dataclass from datetime import datetime +from io import StringIO from pathlib import Path from prompt_toolkit.completion import Completer, Completion, ThreadedCompleter @@ -714,9 +715,6 @@ class InputOutput: return "\n".join(read_only_files + editable_files) + "\n" - # Use rich Columns for pretty output - from io import StringIO - output = StringIO() console = Console(file=output, force_terminal=False) From 3794cf941f32ed57782fad714e67fdb66fbecef4 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 14:53:50 -0700 Subject: [PATCH 09/40] feat: add support for claude-3-5-sonnet-latest model --- aider/models.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/aider/models.py b/aider/models.py index 614ef8410..b48454787 100644 --- a/aider/models.py +++ b/aider/models.py @@ -298,6 +298,23 @@ MODEL_SETTINGS = [ cache_control=True, reminder="user", ), + ModelSettings( + "anthropic/claude-3-5-sonnet-latest", + "diff", + weak_model_name="anthropic/claude-3-haiku-20240307", + editor_model_name="anthropic/claude-3-5-sonnet-20241022", + editor_edit_format="editor-diff", + use_repo_map=True, + examples_as_sys_msg=True, + extra_params={ + "extra_headers": { + "anthropic-beta": ANTHROPIC_BETA_HEADER, + }, + "max_tokens": 8192, + }, + cache_control=True, + reminder="user", + ), ModelSettings( "claude-3-5-sonnet-20241022", "diff", From af7aaad903730c643f6dc566948df1bb32aed7ef Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 14:55:54 -0700 Subject: [PATCH 10/40] fix: handle RecursionError during tree traversal in linter --- aider/linter.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/aider/linter.py b/aider/linter.py index 6bee6df8c..471914072 100644 --- a/aider/linter.py +++ b/aider/linter.py @@ -221,7 +221,12 @@ def basic_lint(fname, code): tree = parser.parse(bytes(code, "utf-8")) - errors = traverse_tree(tree.root_node) + try: + errors = traverse_tree(tree.root_node) + except RecursionError: + print(f"Unable to lint {fname} due to RecursionError") + return + if not errors: return From ec40ff5987ea923d7f8932467e9c7e0a0ac98a37 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:57:44 -0700 Subject: [PATCH 11/40] feat: prevent adding image files with /read command --- aider/commands.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/aider/commands.py b/aider/commands.py index 89d261631..32c066471 100644 --- a/aider/commands.py +++ b/aider/commands.py @@ -1199,6 +1199,12 @@ class Commands: self.io.tool_error(f"Not a file or directory: {abs_path}") def _add_read_only_file(self, abs_path, original_name): + if is_image_file(original_name): + self.io.tool_error( + f"Cannot add image file {original_name} as read-only. Use /add for images instead." + ) + return + if abs_path in self.coder.abs_read_only_fnames: self.io.tool_error(f"{original_name} is already in the chat as a read-only file") return From 704350286cc84a72edab00e78e4046c572eeb818 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:58:23 -0700 Subject: [PATCH 12/40] feat: allow /read command to work with images for vision models --- aider/commands.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aider/commands.py b/aider/commands.py index 32c066471..9a8e899b8 100644 --- a/aider/commands.py +++ b/aider/commands.py @@ -1199,9 +1199,10 @@ class Commands: self.io.tool_error(f"Not a file or directory: {abs_path}") def _add_read_only_file(self, abs_path, original_name): - if is_image_file(original_name): + if is_image_file(original_name) and not self.coder.main_model.info.get("supports_vision"): self.io.tool_error( - f"Cannot add image file {original_name} as read-only. Use /add for images instead." + f"Cannot add image file {original_name} as the" + f" {self.coder.main_model.name} does not support images." ) return From 624f9122ab35e2b7e62db4e58e3f586a76c2326b Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:58:29 -0700 Subject: [PATCH 13/40] style: fix whitespace in commands.py --- aider/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/commands.py b/aider/commands.py index 9a8e899b8..0c5cec66b 100644 --- a/aider/commands.py +++ b/aider/commands.py @@ -1205,7 +1205,7 @@ class Commands: f" {self.coder.main_model.name} does not support images." ) return - + if abs_path in self.coder.abs_read_only_fnames: self.io.tool_error(f"{original_name} is already in the chat as a read-only file") return From 66b6788990ff20312ff8e2e3623bc9df43cac6b0 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:59:22 -0700 Subject: [PATCH 14/40] test: add test for image file handling in read command --- tests/basic/test_commands.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/basic/test_commands.py b/tests/basic/test_commands.py index 6a91eb19f..7288a8d6d 100644 --- a/tests/basic/test_commands.py +++ b/tests/basic/test_commands.py @@ -875,6 +875,34 @@ class TestCommands(TestCase): os.unlink(external_file1_path) os.unlink(external_file2_path) + def test_cmd_read_only_with_image_file(self): + with GitTemporaryDirectory() as repo_dir: + io = InputOutput(pretty=False, fancy_input=False, yes=False) + coder = Coder.create(self.GPT35, None, io) + commands = Commands(io, coder) + + # Create a test image file + test_file = Path(repo_dir) / "test_image.jpg" + test_file.write_text("Mock image content") + + # Test with non-vision model + commands.cmd_read_only(str(test_file)) + self.assertEqual(len(coder.abs_read_only_fnames), 0) + + # Test with vision model + vision_model = Model("gpt-4-vision-preview") + vision_coder = Coder.create(vision_model, None, io) + vision_commands = Commands(io, vision_coder) + + vision_commands.cmd_read_only(str(test_file)) + self.assertEqual(len(vision_coder.abs_read_only_fnames), 1) + self.assertTrue( + any( + os.path.samefile(str(test_file), fname) + for fname in vision_coder.abs_read_only_fnames + ) + ) + def test_cmd_read_only_with_glob_pattern(self): with GitTemporaryDirectory() as repo_dir: io = InputOutput(pretty=False, fancy_input=False, yes=False) From a459f0e130fa6e6fbcf2f4bfc23ebcba91f9ca37 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 14:59:46 -0700 Subject: [PATCH 15/40] test: add test for read-only command with image files --- tests/basic/test_commands.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/basic/test_commands.py b/tests/basic/test_commands.py index 7288a8d6d..f90552ad3 100644 --- a/tests/basic/test_commands.py +++ b/tests/basic/test_commands.py @@ -787,6 +787,34 @@ class TestCommands(TestCase): finally: os.unlink(external_file_path) + def test_cmd_read_only_with_image_file(self): + with GitTemporaryDirectory() as repo_dir: + io = InputOutput(pretty=False, fancy_input=False, yes=False) + coder = Coder.create(self.GPT35, None, io) + commands = Commands(io, coder) + + # Create a test image file + test_file = Path(repo_dir) / "test_image.jpg" + test_file.write_text("Mock image content") + + # Test with non-vision model + commands.cmd_read_only(str(test_file)) + self.assertEqual(len(coder.abs_read_only_fnames), 0) + + # Test with vision model + vision_model = Model("gpt-4-vision-preview") + vision_coder = Coder.create(vision_model, None, io) + vision_commands = Commands(io, vision_coder) + + vision_commands.cmd_read_only(str(test_file)) + self.assertEqual(len(vision_coder.abs_read_only_fnames), 1) + self.assertTrue( + any( + os.path.samefile(str(test_file), fname) + for fname in vision_coder.abs_read_only_fnames + ) + ) + def test_cmd_save_and_load_with_multiple_external_files(self): with ( tempfile.NamedTemporaryFile(mode="w", delete=False) as external_file1, From df478e1f8f8d321360e4f921ac6a8c0b0ef19c3d Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 14:59:52 -0700 Subject: [PATCH 16/40] copy --- aider/website/assets/sample-analytics.jsonl | 117 ++++++++++++++++++ .../website/docs/config/adv-model-settings.md | 19 +++ 2 files changed, 136 insertions(+) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 9fad95f73..4670a5f83 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -145,3 +145,120 @@ {"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "feeaed68-f237-48ad-ac13-807e1692cc40", "time": 1730400360} {"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "feeaed68-f237-48ad-ac13-807e1692cc40", "time": 1730405507} {"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "feeaed68-f237-48ad-ac13-807e1692cc40", "time": 1730405508} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730405785} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730405786} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730406699} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730406754} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730406756} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407580} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407592} +{"event": "model warning", "properties": {"main_model": "anthropic/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "anthropic/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407593} +{"event": "cli session", "properties": {"main_model": "anthropic/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "anthropic/REDACTED", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407596} +{"event": "message_send", "properties": {"main_model": "anthropic/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "anthropic/REDACTED", "edit_format": "whole", "prompt_tokens": 1218, "completion_tokens": 0, "total_tokens": 1218, "cost": 0.0, "total_cost": 0.0, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407601} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407713} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407713} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407784} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407784} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407812} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407812} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407847} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407848} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407963} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730407963} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730408020} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730408020} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730408030} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730408030} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730408070} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730408070} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730408244} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c22c476e-18e6-4a09-9b57-1002c91be450", "time": 1730408244} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408426} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408426} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408493} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408493} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408525} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408526} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408549} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408549} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408583} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408583} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408615} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408615} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408687} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408689} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408703} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408704} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408729} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408729} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408833} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408834} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408850} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408851} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408987} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730408987} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409038} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409038} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409073} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409073} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409129} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409129} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409149} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409149} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409207} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409368} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409368} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 3647, "completion_tokens": 211, "total_tokens": 3858, "cost": 0.014106, "total_cost": 0.014106, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409393} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409453} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409455} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409582} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409582} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409714} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409714} +{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409722} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409724} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409725} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409766} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409766} +{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730409782} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730410248} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730410250} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730410851} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730410852} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730410896} +{"event": "command_chat-mode", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730410902} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 6309, "completion_tokens": 904, "total_tokens": 7213, "cost": 0.032487, "total_cost": 0.032487, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730410958} +{"event": "command_code", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730410990} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9288, "completion_tokens": 448, "total_tokens": 9736, "cost": 0.034584000000000004, "total_cost": 0.067071, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411002} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411007} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411007} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411013} +{"event": "command_read-only", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411019} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 7880, "completion_tokens": 325, "total_tokens": 8205, "cost": 0.028515000000000002, "total_cost": 0.095586, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411067} +{"event": "command_code", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411120} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 10269, "completion_tokens": 375, "total_tokens": 10644, "cost": 0.036432, "total_cost": 0.132018, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411129} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411166} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411167} +{"event": "command_read-only", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411172} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411220} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411220} +{"event": "command_read-only", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411222} +{"event": "command_chat-mode", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411276} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 10770, "completion_tokens": 174, "total_tokens": 10944, "cost": 0.03492, "total_cost": 0.166938, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411291} +{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411314} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411351} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411422} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411423} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411552} +{"event": "model warning", "properties": {"main_model": "anthropic/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "anthropic/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411554} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411577} +{"event": "model warning", "properties": {"main_model": "anthropic/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "anthropic/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411578} +{"event": "cli session", "properties": {"main_model": "anthropic/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "anthropic/REDACTED", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411580} +{"event": "message_send", "properties": {"main_model": "anthropic/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "anthropic/REDACTED", "edit_format": "diff", "prompt_tokens": 2749, "completion_tokens": 52, "total_tokens": 2801, "cost": 0.0, "total_cost": 0.0, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411584} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411627} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411751} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411839} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411842} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14351, "completion_tokens": 440, "total_tokens": 14791, "cost": 0.049653, "total_cost": 0.216591, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411862} +{"event": "command_undo", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411880} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14896, "completion_tokens": 266, "total_tokens": 15162, "cost": 0.048678, "total_cost": 0.265269, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411902} diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index bd292611e..18901f51a 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -490,6 +490,25 @@ cog.out("```\n") use_system_prompt: true use_temperature: true weak_model_name: anthropic/claude-3-haiku-20240307 +- cache_control: true + caches_by_default: false + edit_format: diff + editor_edit_format: editor-diff + editor_model_name: anthropic/claude-3-5-sonnet-20241022 + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31 + max_tokens: 8192 + lazy: false + name: anthropic/claude-3-5-sonnet-latest + reminder: user + send_undo_reply: false + streaming: true + use_repo_map: true + use_system_prompt: true + use_temperature: true + weak_model_name: anthropic/claude-3-haiku-20240307 - cache_control: true caches_by_default: false edit_format: diff From d1b25b9a7239a7ab53f236e673fc45efca7e7c74 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 15:00:21 -0700 Subject: [PATCH 17/40] fix: remove duplicate test_cmd_read_only_with_image_file method --- tests/basic/test_commands.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/tests/basic/test_commands.py b/tests/basic/test_commands.py index f90552ad3..7288a8d6d 100644 --- a/tests/basic/test_commands.py +++ b/tests/basic/test_commands.py @@ -787,34 +787,6 @@ class TestCommands(TestCase): finally: os.unlink(external_file_path) - def test_cmd_read_only_with_image_file(self): - with GitTemporaryDirectory() as repo_dir: - io = InputOutput(pretty=False, fancy_input=False, yes=False) - coder = Coder.create(self.GPT35, None, io) - commands = Commands(io, coder) - - # Create a test image file - test_file = Path(repo_dir) / "test_image.jpg" - test_file.write_text("Mock image content") - - # Test with non-vision model - commands.cmd_read_only(str(test_file)) - self.assertEqual(len(coder.abs_read_only_fnames), 0) - - # Test with vision model - vision_model = Model("gpt-4-vision-preview") - vision_coder = Coder.create(vision_model, None, io) - vision_commands = Commands(io, vision_coder) - - vision_commands.cmd_read_only(str(test_file)) - self.assertEqual(len(vision_coder.abs_read_only_fnames), 1) - self.assertTrue( - any( - os.path.samefile(str(test_file), fname) - for fname in vision_coder.abs_read_only_fnames - ) - ) - def test_cmd_save_and_load_with_multiple_external_files(self): with ( tempfile.NamedTemporaryFile(mode="w", delete=False) as external_file1, From 401967c27f3908b518bd0961b68a9eb808995994 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 15:01:26 -0700 Subject: [PATCH 18/40] refactor: convert browser flag to boolean argument --- aider/args.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/args.py b/aider/args.py index 5d2e841ab..752360189 100644 --- a/aider/args.py +++ b/aider/args.py @@ -701,7 +701,7 @@ def get_parser(default_config_files, git_root): ) group.add_argument( "--gui", - "--browser", + "--browser", # ai turn into a boolean! action="store_true", help="Run aider in your browser", default=False, From 27711010a0813618de75c5709845e2e27dd2de4c Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 15:01:29 -0700 Subject: [PATCH 19/40] refactor: update --gui/--browser to use BooleanOptionalAction --- aider/args.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aider/args.py b/aider/args.py index 752360189..c02254e49 100644 --- a/aider/args.py +++ b/aider/args.py @@ -701,9 +701,9 @@ def get_parser(default_config_files, git_root): ) group.add_argument( "--gui", - "--browser", # ai turn into a boolean! - action="store_true", - help="Run aider in your browser", + "--browser", + action=argparse.BooleanOptionalAction, + help="Run aider in your browser (default: False)", default=False, ) group.add_argument( From 0c4e4a123a36b2ad812d56cd6aed4ace0a16329f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 15:31:58 -0700 Subject: [PATCH 20/40] pin pillow<11 to avoid regressing streamlit to ancient 1.22 --- requirements.txt | 16 +++++----- requirements/requirements-browser.txt | 43 ++++++++------------------- requirements/requirements-dev.txt | 4 +-- requirements/requirements-help.txt | 10 +++---- requirements/requirements.in | 4 ++- 5 files changed, 30 insertions(+), 47 deletions(-) diff --git a/requirements.txt b/requirements.txt index 15ebf1078..b77960136 100644 --- a/requirements.txt +++ b/requirements.txt @@ -70,7 +70,7 @@ httpcore==1.0.6 # via httpx httpx==0.27.2 # via openai -huggingface-hub==0.26.1 +huggingface-hub==0.26.2 # via tokenizers idna==3.10 # via @@ -86,7 +86,7 @@ importlib-resources==6.4.5 # via -r requirements/requirements.in jinja2==3.1.4 # via litellm -jiter==0.6.1 +jiter==0.7.0 # via openai json5==0.9.25 # via -r requirements/requirements.in @@ -96,7 +96,7 @@ jsonschema==4.23.0 # litellm jsonschema-specifications==2024.10.1 # via jsonschema -litellm==1.50.4 +litellm==1.51.2 # via -r requirements/requirements.in markdown-it-py==3.0.0 # via rich @@ -120,7 +120,7 @@ numpy==1.26.4 # via # -r requirements/requirements.in # scipy -openai==1.52.2 +openai==1.53.0 # via litellm packaging==24.1 # via @@ -132,7 +132,7 @@ pathspec==0.12.1 # grep-ast pexpect==4.9.0 # via -r requirements/requirements.in -pillow==11.0.0 +pillow==10.4.0 # via -r requirements/requirements.in posthog==3.7.0 # via -r requirements/requirements.in @@ -187,7 +187,7 @@ requests==2.32.3 # tiktoken rich==13.9.3 # via -r requirements/requirements.in -rpds-py==0.20.0 +rpds-py==0.20.1 # via # jsonschema # referencing @@ -217,7 +217,7 @@ tokenizers==0.19.1 # via # -r requirements/requirements.in # litellm -tqdm==4.66.5 +tqdm==4.66.6 # via # huggingface-hub # openai @@ -239,7 +239,7 @@ urllib3==2.2.3 # requests wcwidth==0.2.13 # via prompt-toolkit -yarl==1.16.0 +yarl==1.17.1 # via aiohttp zipp==3.20.2 # via importlib-metadata diff --git a/requirements/requirements-browser.txt b/requirements/requirements-browser.txt index a5a3950c7..3fd0c8b60 100644 --- a/requirements/requirements-browser.txt +++ b/requirements/requirements-browser.txt @@ -4,7 +4,7 @@ # # pip-compile --output-file=requirements/requirements-browser.txt requirements/requirements-browser.in # -altair==4.2.2 +altair==5.4.1 # via streamlit attrs==24.2.0 # via @@ -27,8 +27,6 @@ click==8.1.7 # via # -c requirements/../requirements.txt # streamlit -entrypoints==0.4 - # via altair gitdb==4.0.11 # via # -c requirements/../requirements.txt @@ -41,10 +39,6 @@ idna==3.10 # via # -c requirements/../requirements.txt # requests -importlib-metadata==7.2.1 - # via - # -c requirements/../requirements.txt - # streamlit jinja2==3.1.4 # via # -c requirements/../requirements.txt @@ -70,29 +64,28 @@ mdurl==0.1.2 # via # -c requirements/../requirements.txt # markdown-it-py +narwhals==1.12.1 + # via altair numpy==1.26.4 # via # -c requirements/../requirements.txt - # altair # pandas - # pyarrow # pydeck # streamlit packaging==24.1 # via # -c requirements/../requirements.txt - # streamlit -pandas==2.2.3 - # via # altair # streamlit -pillow==11.0.0 +pandas==2.2.3 + # via streamlit +pillow==10.4.0 # via # -c requirements/../requirements.txt # streamlit -protobuf==3.20.3 +protobuf==5.28.3 # via streamlit -pyarrow==17.0.0 +pyarrow==18.0.0 # via streamlit pydeck==0.9.1 # via streamlit @@ -100,13 +93,10 @@ pygments==2.18.0 # via # -c requirements/../requirements.txt # rich -pympler==1.1 - # via streamlit python-dateutil==2.9.0.post0 # via # -c requirements/../requirements.txt # pandas - # streamlit pytz==2024.2 # via pandas referencing==0.35.1 @@ -122,7 +112,7 @@ rich==13.9.3 # via # -c requirements/../requirements.txt # streamlit -rpds-py==0.20.0 +rpds-py==0.20.1 # via # -c requirements/../requirements.txt # jsonschema @@ -135,33 +125,24 @@ smmap==5.0.1 # via # -c requirements/../requirements.txt # gitdb -streamlit==1.22.0 +streamlit==1.39.0 # via -r requirements/requirements-browser.in -tenacity==8.5.0 +tenacity==9.0.0 # via streamlit toml==0.10.2 # via streamlit -toolz==1.0.0 - # via altair tornado==6.4.1 # via streamlit typing-extensions==4.12.2 # via # -c requirements/../requirements.txt + # altair # streamlit tzdata==2024.2 # via pandas -tzlocal==5.2 - # via streamlit urllib3==2.2.3 # via # -c requirements/../requirements.txt # requests -validators==0.34.0 - # via streamlit watchdog==4.0.2 # via -r requirements/requirements-browser.in -zipp==3.20.2 - # via - # -c requirements/../requirements.txt - # importlib-metadata diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 9dcd23c6c..00f8dde99 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -104,7 +104,7 @@ pandas==2.2.3 # via -r requirements/requirements-dev.in pathos==0.3.3 # via lox -pillow==11.0.0 +pillow==10.4.0 # via # -c requirements/../requirements.txt # matplotlib @@ -194,7 +194,7 @@ urllib3==2.2.3 # via # -c requirements/../requirements.txt # requests -virtualenv==20.27.0 +virtualenv==20.27.1 # via pre-commit wheel==0.44.0 # via pip-tools diff --git a/requirements/requirements-help.txt b/requirements/requirements-help.txt index 83804923b..2a5a6406d 100644 --- a/requirements/requirements-help.txt +++ b/requirements/requirements-help.txt @@ -82,7 +82,7 @@ httpx==0.27.2 # via # -c requirements/../requirements.txt # llama-index-core -huggingface-hub[inference]==0.26.1 +huggingface-hub[inference]==0.26.2 # via # -c requirements/../requirements.txt # llama-index-embeddings-huggingface @@ -104,7 +104,7 @@ joblib==1.4.2 # via # nltk # scikit-learn -llama-index-core==0.11.20 +llama-index-core==0.11.21 # via # -r requirements/requirements-help.in # llama-index-embeddings-huggingface @@ -147,7 +147,7 @@ packaging==24.1 # huggingface-hub # marshmallow # transformers -pillow==11.0.0 +pillow==10.4.0 # via # -c requirements/../requirements.txt # llama-index-core @@ -219,7 +219,7 @@ tokenizers==0.19.1 # transformers torch==2.2.2 # via sentence-transformers -tqdm==4.66.5 +tqdm==4.66.6 # via # -c requirements/../requirements.txt # huggingface-hub @@ -251,7 +251,7 @@ wrapt==1.16.0 # via # deprecated # llama-index-core -yarl==1.16.0 +yarl==1.17.1 # via # -c requirements/../requirements.txt # aiohttp diff --git a/requirements/requirements.in b/requirements/requirements.in index a1a88cba9..6e1ba07ef 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -17,7 +17,6 @@ sounddevice soundfile beautifulsoup4 PyYAML -Pillow diff-match-patch pypandoc litellm @@ -57,3 +56,6 @@ numpy<2 # Going past this makes dependencies unresolvable # Seems to be caused by sentence-transformers tokenizers==0.19.1 + +# streamlit 1.39.0 depends on this, as far back as 1.22 which is ancient and doesn't have chat ui +Pillow<11 From 392162ae8441738928e0f8f7338f04e54cb32fc0 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 15:33:17 -0700 Subject: [PATCH 21/40] copy --- aider/website/assets/sample-analytics.jsonl | 31 +++++++++++++++++++++ aider/website/assets/sample.aider.conf.yml | 2 +- aider/website/assets/sample.env | 2 +- aider/website/docs/config/aider_conf.md | 2 +- aider/website/docs/config/dotenv.md | 2 +- aider/website/docs/config/options.md | 7 +++-- 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 4670a5f83..426acd39e 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -262,3 +262,34 @@ {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14351, "completion_tokens": 440, "total_tokens": 14791, "cost": 0.049653, "total_cost": 0.216591, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411862} {"event": "command_undo", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411880} {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14896, "completion_tokens": 266, "total_tokens": 15162, "cost": 0.048678, "total_cost": 0.265269, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411902} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411941} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 27430, "completion_tokens": 608, "total_tokens": 28038, "cost": 0.09141, "total_cost": 0.35667899999999997, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411960} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 27414, "completion_tokens": 506, "total_tokens": 27920, "cost": 0.089832, "total_cost": 0.446511, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730411984} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 28297, "completion_tokens": 343, "total_tokens": 28640, "cost": 0.090036, "total_cost": 0.536547, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412019} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412065} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412068} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412073} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412073} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412074} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9491, "completion_tokens": 158, "total_tokens": 9649, "cost": 0.030843000000000002, "total_cost": 0.56739, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412084} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412095} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412095} +{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412096} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412186} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412187} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412189} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412300} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412301} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412302} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412321} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412321} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730412322} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413528} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413531} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413534} +{"event": "command_chat-mode", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413538} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 8811, "completion_tokens": 309, "total_tokens": 9120, "cost": 0.031068000000000002, "total_cost": 0.031068000000000002, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413585} +{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413632} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 15950, "completion_tokens": 330, "total_tokens": 16280, "cost": 0.05280000000000001, "total_cost": 0.08386800000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413669} +{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413704} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 18174, "completion_tokens": 292, "total_tokens": 18466, "cost": 0.058902, "total_cost": 0.14277, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413719} diff --git a/aider/website/assets/sample.aider.conf.yml b/aider/website/assets/sample.aider.conf.yml index ab7c8a98b..56b05d35e 100644 --- a/aider/website/assets/sample.aider.conf.yml +++ b/aider/website/assets/sample.aider.conf.yml @@ -350,7 +350,7 @@ ## Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory) #config: xxx -## Run aider in your browser +## Run aider in your browser (default: False) #gui: false ## Enable/disable suggesting shell commands (default: True) diff --git a/aider/website/assets/sample.env b/aider/website/assets/sample.env index 3daf35b00..9b787dc9f 100644 --- a/aider/website/assets/sample.env +++ b/aider/website/assets/sample.env @@ -333,7 +333,7 @@ ## Specify the encoding for input and output (default: utf-8) #AIDER_ENCODING=utf-8 -## Run aider in your browser +## Run aider in your browser (default: False) #AIDER_GUI=false ## Enable/disable suggesting shell commands (default: True) diff --git a/aider/website/docs/config/aider_conf.md b/aider/website/docs/config/aider_conf.md index 98cc532e8..ef6abbf4a 100644 --- a/aider/website/docs/config/aider_conf.md +++ b/aider/website/docs/config/aider_conf.md @@ -406,7 +406,7 @@ cog.outl("```") ## Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory) #config: xxx -## Run aider in your browser +## Run aider in your browser (default: False) #gui: false ## Enable/disable suggesting shell commands (default: True) diff --git a/aider/website/docs/config/dotenv.md b/aider/website/docs/config/dotenv.md index 0cc735577..d7e1735e5 100644 --- a/aider/website/docs/config/dotenv.md +++ b/aider/website/docs/config/dotenv.md @@ -375,7 +375,7 @@ cog.outl("```") ## Specify the encoding for input and output (default: utf-8) #AIDER_ENCODING=utf-8 -## Run aider in your browser +## Run aider in your browser (default: False) #AIDER_GUI=false ## Enable/disable suggesting shell commands (default: True) diff --git a/aider/website/docs/config/options.md b/aider/website/docs/config/options.md index 7d89db873..5131631fc 100644 --- a/aider/website/docs/config/options.md +++ b/aider/website/docs/config/options.md @@ -69,7 +69,8 @@ usage: aider [-h] [--openai-api-key] [--anthropic-api-key] [--model] [--install-main-branch] [--upgrade] [--apply] [--yes-always] [-v] [--show-repo-map] [--show-prompts] [--exit] [--message] [--message-file] [--load] - [--encoding] [-c] [--gui] + [--encoding] [-c] + [--gui | --no-gui | --browser | --no-browser] [--suggest-shell-commands | --no-suggest-shell-commands] [--fancy-input | --no-fancy-input] [--voice-format] [--voice-language] @@ -631,12 +632,14 @@ Aliases: - `--config CONFIG_FILE` ### `--gui` -Run aider in your browser +Run aider in your browser (default: False) Default: False Environment variable: `AIDER_GUI` Aliases: - `--gui` + - `--no-gui` - `--browser` + - `--no-browser` ### `--suggest-shell-commands` Enable/disable suggesting shell commands (default: True) From 91bc8cddf3c59574141ff435eda07b6ada141185 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 16:02:33 -0700 Subject: [PATCH 22/40] fix: add dependency constraints between requirements files --- scripts/pip-compile.sh | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/scripts/pip-compile.sh b/scripts/pip-compile.sh index 0f0ae77b9..0538c579c 100755 --- a/scripts/pip-compile.sh +++ b/scripts/pip-compile.sh @@ -3,16 +3,41 @@ # exit when any command fails set -e +# First compile the base requirements pip-compile \ requirements/requirements.in \ --output-file=requirements.txt \ $1 -for SUFFIX in dev help browser playwright; do +# Then compile each additional requirements file in sequence, +# using the previous requirements as constraints +pip-compile \ + requirements/requirements-dev.in \ + --output-file=requirements/requirements-dev.txt \ + --constraint=requirements.txt \ + $1 - pip-compile \ - requirements/requirements-${SUFFIX}.in \ - --output-file=requirements/requirements-${SUFFIX}.txt \ - $1 -done +pip-compile \ + requirements/requirements-help.in \ + --output-file=requirements/requirements-help.txt \ + --constraint=requirements.txt \ + --constraint=requirements/requirements-dev.txt \ + $1 + +pip-compile \ + requirements/requirements-browser.in \ + --output-file=requirements/requirements-browser.txt \ + --constraint=requirements.txt \ + --constraint=requirements/requirements-dev.txt \ + --constraint=requirements/requirements-help.txt \ + $1 + +pip-compile \ + requirements/requirements-playwright.in \ + --output-file=requirements/requirements-playwright.txt \ + --constraint=requirements.txt \ + --constraint=requirements/requirements-dev.txt \ + --constraint=requirements/requirements-help.txt \ + --constraint=requirements/requirements-browser.txt \ + $1 From 5b9fe6fee08a8a38d9f343680beeb3e286da3aef Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 31 Oct 2024 16:03:12 -0700 Subject: [PATCH 23/40] refactor: convert pip-compile script to use loop for requirements compilation --- scripts/pip-compile.sh | 42 ++++++++++++------------------------------ 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/scripts/pip-compile.sh b/scripts/pip-compile.sh index 0538c579c..9d8a8ff3c 100755 --- a/scripts/pip-compile.sh +++ b/scripts/pip-compile.sh @@ -9,35 +9,17 @@ pip-compile \ --output-file=requirements.txt \ $1 -# Then compile each additional requirements file in sequence, -# using the previous requirements as constraints -pip-compile \ - requirements/requirements-dev.in \ - --output-file=requirements/requirements-dev.txt \ - --constraint=requirements.txt \ - $1 +# Then compile each additional requirements file in sequence +SUFFIXES=(dev help browser playwright) +CONSTRAINTS="--constraint=requirements.txt" -pip-compile \ - requirements/requirements-help.in \ - --output-file=requirements/requirements-help.txt \ - --constraint=requirements.txt \ - --constraint=requirements/requirements-dev.txt \ - $1 - -pip-compile \ - requirements/requirements-browser.in \ - --output-file=requirements/requirements-browser.txt \ - --constraint=requirements.txt \ - --constraint=requirements/requirements-dev.txt \ - --constraint=requirements/requirements-help.txt \ - $1 - -pip-compile \ - requirements/requirements-playwright.in \ - --output-file=requirements/requirements-playwright.txt \ - --constraint=requirements.txt \ - --constraint=requirements/requirements-dev.txt \ - --constraint=requirements/requirements-help.txt \ - --constraint=requirements/requirements-browser.txt \ - $1 +for SUFFIX in "${SUFFIXES[@]}"; do + pip-compile \ + requirements/requirements-${SUFFIX}.in \ + --output-file=requirements/requirements-${SUFFIX}.txt \ + ${CONSTRAINTS} \ + $1 + # Add this file as a constraint for the next iteration + CONSTRAINTS+=" --constraint=requirements/requirements-${SUFFIX}.txt" +done From d8e1e823e742933ca5594488b4cf8802a1df7d3f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 31 Oct 2024 16:04:37 -0700 Subject: [PATCH 24/40] update deps with chained constraints --- requirements/requirements-browser.txt | 77 ++++++++++++++++++++++-- requirements/requirements-dev.txt | 22 ++++++- requirements/requirements-help.txt | 54 ++++++++++++++++- requirements/requirements-playwright.txt | 7 ++- 4 files changed, 151 insertions(+), 9 deletions(-) diff --git a/requirements/requirements-browser.txt b/requirements/requirements-browser.txt index 3fd0c8b60..538b5dc9b 100644 --- a/requirements/requirements-browser.txt +++ b/requirements/requirements-browser.txt @@ -2,13 +2,15 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --output-file=requirements/requirements-browser.txt requirements/requirements-browser.in +# pip-compile --constraint=requirements.txt --constraint=requirements/requirements-dev.txt --constraint=requirements/requirements-help.txt --output-file=requirements/requirements-browser.txt requirements/requirements-browser.in # altair==5.4.1 # via streamlit attrs==24.2.0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-help.txt # jsonschema # referencing blinker==1.8.2 @@ -17,71 +19,108 @@ cachetools==5.5.0 # via streamlit certifi==2024.8.30 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # requests charset-normalizer==3.4.0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # requests click==8.1.7 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # streamlit gitdb==4.0.11 # via + # -c requirements.txt # -c requirements/../requirements.txt # gitpython gitpython==3.1.43 # via + # -c requirements.txt # -c requirements/../requirements.txt # streamlit idna==3.10 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # requests jinja2==3.1.4 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # altair # pydeck jsonschema==4.23.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # altair jsonschema-specifications==2024.10.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # jsonschema markdown-it-py==3.0.0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # rich markupsafe==3.0.2 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # jinja2 mdurl==0.1.2 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # markdown-it-py narwhals==1.12.1 # via altair numpy==1.26.4 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # pandas # pydeck # streamlit packaging==24.1 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # altair # streamlit pandas==2.2.3 - # via streamlit + # via + # -c requirements/requirements-dev.txt + # streamlit pillow==10.4.0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # streamlit protobuf==5.28.3 # via streamlit @@ -91,58 +130,84 @@ pydeck==0.9.1 # via streamlit pygments==2.18.0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # rich python-dateutil==2.9.0.post0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # pandas pytz==2024.2 - # via pandas + # via + # -c requirements/requirements-dev.txt + # pandas referencing==0.35.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # jsonschema # jsonschema-specifications requests==2.32.3 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # streamlit rich==13.9.3 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # streamlit rpds-py==0.20.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # jsonschema # referencing six==1.16.0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # python-dateutil smmap==5.0.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # gitdb streamlit==1.39.0 # via -r requirements/requirements-browser.in -tenacity==9.0.0 - # via streamlit +tenacity==8.5.0 + # via + # -c requirements/requirements-help.txt + # streamlit toml==0.10.2 # via streamlit tornado==6.4.1 # via streamlit typing-extensions==4.12.2 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # altair # streamlit tzdata==2024.2 - # via pandas + # via + # -c requirements/requirements-dev.txt + # pandas urllib3==2.2.3 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # requests watchdog==4.0.2 # via -r requirements/requirements-browser.in diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 00f8dde99..945efbf95 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --output-file=requirements/requirements-dev.txt requirements/requirements-dev.in +# pip-compile --constraint=requirements.txt --output-file=requirements/requirements-dev.txt requirements/requirements-dev.in # alabaster==1.0.0 # via sphinx @@ -12,16 +12,19 @@ build==1.2.2.post1 # via pip-tools certifi==2024.8.30 # via + # -c requirements.txt # -c requirements/../requirements.txt # requests cfgv==3.4.0 # via pre-commit charset-normalizer==3.4.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # requests click==8.1.7 # via + # -c requirements.txt # -c requirements/../requirements.txt # pip-tools # typer @@ -45,6 +48,7 @@ docutils==0.21.2 # sphinx-rtd-theme filelock==3.16.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # virtualenv fonttools==4.54.1 @@ -53,6 +57,7 @@ identify==2.6.1 # via pre-commit idna==3.10 # via + # -c requirements.txt # -c requirements/../requirements.txt # requests imagesize==1.4.1 @@ -63,6 +68,7 @@ iniconfig==2.0.0 # via pytest jinja2==3.1.4 # via + # -c requirements.txt # -c requirements/../requirements.txt # sphinx kiwisolver==1.4.7 @@ -71,16 +77,19 @@ lox==0.12.0 # via -r requirements/requirements-dev.in markdown-it-py==3.0.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # rich markupsafe==3.0.2 # via + # -c requirements.txt # -c requirements/../requirements.txt # jinja2 matplotlib==3.9.2 # via -r requirements/requirements-dev.in mdurl==0.1.2 # via + # -c requirements.txt # -c requirements/../requirements.txt # markdown-it-py multiprocess==0.70.17 @@ -89,12 +98,14 @@ nodeenv==1.9.1 # via pre-commit numpy==1.26.4 # via + # -c requirements.txt # -c requirements/../requirements.txt # contourpy # matplotlib # pandas packaging==24.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # build # matplotlib @@ -106,6 +117,7 @@ pathos==0.3.3 # via lox pillow==10.4.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # matplotlib pip-tools==7.4.1 @@ -122,6 +134,7 @@ pre-commit==4.0.1 # via -r requirements/requirements-dev.in pygments==2.18.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # rich # sphinx @@ -135,6 +148,7 @@ pytest==8.3.3 # via -r requirements/requirements-dev.in python-dateutil==2.9.0.post0 # via + # -c requirements.txt # -c requirements/../requirements.txt # matplotlib # pandas @@ -142,14 +156,17 @@ pytz==2024.2 # via pandas pyyaml==6.0.2 # via + # -c requirements.txt # -c requirements/../requirements.txt # pre-commit requests==2.32.3 # via + # -c requirements.txt # -c requirements/../requirements.txt # sphinx rich==13.9.3 # via + # -c requirements.txt # -c requirements/../requirements.txt # typer semver==3.0.2 @@ -158,6 +175,7 @@ shellingham==1.5.4 # via typer six==1.16.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # python-dateutil snowballstemmer==2.2.0 @@ -186,12 +204,14 @@ typer==0.12.5 # via -r requirements/requirements-dev.in typing-extensions==4.12.2 # via + # -c requirements.txt # -c requirements/../requirements.txt # typer tzdata==2024.2 # via pandas urllib3==2.2.3 # via + # -c requirements.txt # -c requirements/../requirements.txt # requests virtualenv==20.27.1 diff --git a/requirements/requirements-help.txt b/requirements/requirements-help.txt index 2a5a6406d..cbaa2e0a1 100644 --- a/requirements/requirements-help.txt +++ b/requirements/requirements-help.txt @@ -2,46 +2,58 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --output-file=requirements/requirements-help.txt requirements/requirements-help.in +# pip-compile --constraint=requirements.txt --constraint=requirements/requirements-dev.txt --output-file=requirements/requirements-help.txt requirements/requirements-help.in # aiohappyeyeballs==2.4.3 # via + # -c requirements.txt # -c requirements/../requirements.txt # aiohttp aiohttp==3.10.10 # via + # -c requirements.txt # -c requirements/../requirements.txt # huggingface-hub # llama-index-core aiosignal==1.3.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # aiohttp annotated-types==0.7.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # pydantic anyio==4.6.2.post1 # via + # -c requirements.txt # -c requirements/../requirements.txt # httpx attrs==24.2.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # aiohttp certifi==2024.8.30 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # httpcore # httpx # requests charset-normalizer==3.4.0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # requests click==8.1.7 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # nltk dataclasses-json==0.6.7 # via llama-index-core @@ -51,17 +63,21 @@ dirtyjson==1.0.8 # via llama-index-core filelock==3.16.1 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # huggingface-hub # torch # transformers frozenlist==1.5.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # aiohttp # aiosignal fsspec==2024.10.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # huggingface-hub # llama-index-core @@ -72,18 +88,22 @@ greenlet==3.0.3 # sqlalchemy h11==0.14.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # httpcore httpcore==1.0.6 # via + # -c requirements.txt # -c requirements/../requirements.txt # httpx httpx==0.27.2 # via + # -c requirements.txt # -c requirements/../requirements.txt # llama-index-core huggingface-hub[inference]==0.26.2 # via + # -c requirements.txt # -c requirements/../requirements.txt # llama-index-embeddings-huggingface # sentence-transformers @@ -91,14 +111,18 @@ huggingface-hub[inference]==0.26.2 # transformers idna==3.10 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # anyio # httpx # requests # yarl jinja2==3.1.4 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # torch joblib==1.4.2 # via @@ -112,7 +136,9 @@ llama-index-embeddings-huggingface==0.3.1 # via -r requirements/requirements-help.in markupsafe==3.0.2 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # jinja2 marshmallow==3.23.0 # via dataclasses-json @@ -120,6 +146,7 @@ mpmath==1.3.0 # via sympy multidict==6.1.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # aiohttp # yarl @@ -129,6 +156,7 @@ nest-asyncio==1.6.0 # via llama-index-core networkx==3.2.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # llama-index-core # torch @@ -136,49 +164,63 @@ nltk==3.9.1 # via llama-index-core numpy==1.26.4 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # llama-index-core # scikit-learn # scipy # transformers packaging==24.1 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # huggingface-hub # marshmallow # transformers pillow==10.4.0 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # llama-index-core # sentence-transformers propcache==0.2.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # yarl pydantic==2.9.2 # via + # -c requirements.txt # -c requirements/../requirements.txt # llama-index-core pydantic-core==2.23.4 # via + # -c requirements.txt # -c requirements/../requirements.txt # pydantic pyyaml==6.0.2 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # huggingface-hub # llama-index-core # transformers regex==2024.9.11 # via + # -c requirements.txt # -c requirements/../requirements.txt # nltk # tiktoken # transformers requests==2.32.3 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # huggingface-hub # llama-index-core # tiktoken @@ -189,6 +231,7 @@ scikit-learn==1.5.2 # via sentence-transformers scipy==1.13.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # scikit-learn # sentence-transformers @@ -196,6 +239,7 @@ sentence-transformers==3.2.1 # via llama-index-embeddings-huggingface sniffio==1.3.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # anyio # httpx @@ -211,16 +255,19 @@ threadpoolctl==3.5.0 # via scikit-learn tiktoken==0.8.0 # via + # -c requirements.txt # -c requirements/../requirements.txt # llama-index-core tokenizers==0.19.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # transformers torch==2.2.2 # via sentence-transformers tqdm==4.66.6 # via + # -c requirements.txt # -c requirements/../requirements.txt # huggingface-hub # llama-index-core @@ -231,7 +278,9 @@ transformers==4.44.2 # via sentence-transformers typing-extensions==4.12.2 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # huggingface-hub # llama-index-core # pydantic @@ -245,7 +294,9 @@ typing-inspect==0.9.0 # llama-index-core urllib3==2.2.3 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-dev.txt # requests wrapt==1.16.0 # via @@ -253,5 +304,6 @@ wrapt==1.16.0 # llama-index-core yarl==1.17.1 # via + # -c requirements.txt # -c requirements/../requirements.txt # aiohttp diff --git a/requirements/requirements-playwright.txt b/requirements/requirements-playwright.txt index 0d92718fd..6e63e4666 100644 --- a/requirements/requirements-playwright.txt +++ b/requirements/requirements-playwright.txt @@ -2,10 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --output-file=requirements/requirements-playwright.txt requirements/requirements-playwright.in +# pip-compile --constraint=requirements.txt --constraint=requirements/requirements-browser.txt --constraint=requirements/requirements-dev.txt --constraint=requirements/requirements-help.txt --output-file=requirements/requirements-playwright.txt requirements/requirements-playwright.in # greenlet==3.0.3 # via + # -c requirements/requirements-help.txt # -r requirements/requirements-playwright.in # playwright playwright==1.47.0 @@ -14,5 +15,9 @@ pyee==12.0.0 # via playwright typing-extensions==4.12.2 # via + # -c requirements.txt # -c requirements/../requirements.txt + # -c requirements/requirements-browser.txt + # -c requirements/requirements-dev.txt + # -c requirements/requirements-help.txt # pyee From 789535cb855412fbe16200ecc0ae9a12a4dcc807 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 08:12:11 -0700 Subject: [PATCH 25/40] feat: disable spinner animation when stdout is not a tty --- aider/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/utils.py b/aider/utils.py index 2d533896d..f6d13239f 100644 --- a/aider/utils.py +++ b/aider/utils.py @@ -266,7 +266,7 @@ def run_install(cmd): return False, output - +#ai don't display the spinner if stdout isn't a tty! class Spinner: spinner_chars = itertools.cycle(["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]) From 93639039d4ba8983ef8fdb6c0c5e92f4e9606f1e Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Fri, 1 Nov 2024 08:12:13 -0700 Subject: [PATCH 26/40] feat: disable spinner when stdout is not a tty --- aider/utils.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/aider/utils.py b/aider/utils.py index f6d13239f..20abe7fe9 100644 --- a/aider/utils.py +++ b/aider/utils.py @@ -266,7 +266,6 @@ def run_install(cmd): return False, output -#ai don't display the spinner if stdout isn't a tty! class Spinner: spinner_chars = itertools.cycle(["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]) @@ -275,8 +274,12 @@ class Spinner: self.start_time = time.time() self.last_update = 0 self.visible = False + self.is_tty = sys.stdout.isatty() def step(self): + if not self.is_tty: + return + current_time = time.time() if not self.visible and current_time - self.start_time >= 0.5: self.visible = True @@ -292,7 +295,7 @@ class Spinner: print(f"\r{self.text} {next(self.spinner_chars)}\r{self.text} ", end="", flush=True) def end(self): - if self.visible: + if self.visible and self.is_tty: print("\r" + " " * (len(self.text) + 3)) From d67d319b31356b4fd0972dcbec40f6e27ea0eea8 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Fri, 1 Nov 2024 08:12:17 -0700 Subject: [PATCH 27/40] style: fix whitespace and line spacing issues --- aider/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aider/utils.py b/aider/utils.py index 20abe7fe9..4cf45b6dd 100644 --- a/aider/utils.py +++ b/aider/utils.py @@ -266,6 +266,7 @@ def run_install(cmd): return False, output + class Spinner: spinner_chars = itertools.cycle(["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]) @@ -279,7 +280,7 @@ class Spinner: def step(self): if not self.is_tty: return - + current_time = time.time() if not self.visible and current_time - self.start_time >= 0.5: self.visible = True From c098354a67ad4ad9332f315b993072349081599e Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:03:44 -0700 Subject: [PATCH 28/40] copy --- HISTORY.md | 2 +- aider/website/docs/usage/commands.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index a190321c4..95754fea9 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -15,7 +15,7 @@ - New `--no-fancy-input` switch disables prompt toolkit input, now still available with `--no-pretty`. - Properly support all o1 models, regardless of provider. - Improved handling of API errors, especially when accessing the weak model. -- Aider wrote 70% of the code in this release. +- Aider wrote 68% of the code in this release. ### Aider v0.60.1 diff --git a/aider/website/docs/usage/commands.md b/aider/website/docs/usage/commands.md index b8970693c..bc5da3e23 100644 --- a/aider/website/docs/usage/commands.md +++ b/aider/website/docs/usage/commands.md @@ -69,6 +69,8 @@ The interactive prompt is built with [prompt-toolkit](https://github.com/prompt- ### Emacs +- `Up Arrow` : Scroll back through previously sent messages. +- `Down Arrow` : Scroll forward through previously sent messages. - `Ctrl-A` : Move cursor to the start of the line. - `Ctrl-B` : Move cursor back one character. - `Ctrl-D` : Delete the character under the cursor. @@ -85,6 +87,8 @@ The interactive prompt is built with [prompt-toolkit](https://github.com/prompt- To use vi/vim keybindings, run aider with the `--vim` switch. +- `Up Arrow` : Scroll back through previously sent messages. +- `Down Arrow` : Scroll forward through previously sent messages. - `Esc` : Switch to command mode. - `i` : Switch to insert mode. - `a` : Move cursor one character to the right and switch to insert mode. From 66ad186eddc03fce0d6940d6eb11bb1ee81f84bb Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:04:55 -0700 Subject: [PATCH 29/40] start /save commands with /drop --- aider/commands.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/commands.py b/aider/commands.py index 0c5cec66b..45d19c1b8 100644 --- a/aider/commands.py +++ b/aider/commands.py @@ -1297,6 +1297,7 @@ class Commands: try: with open(args.strip(), "w", encoding=self.io.encoding) as f: + f.write("/drop\n") # Write commands to add editable files for fname in sorted(self.coder.abs_fnames): rel_fname = self.coder.get_rel_fname(fname) From 929aeb22bf9089aa6d903172d27ea0dbe2450129 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:08:56 -0700 Subject: [PATCH 30/40] refactor: Update check_and_open_urls to handle exceptions with user-friendly messages --- aider/coders/base_coder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 168b1d1ca..0113f3350 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -790,6 +790,7 @@ class Coder: self.num_reflections += 1 message = self.reflected_message + # ai: have this take the exception, not the string; based on the exception type offer a simple english explanation for what went wrong (usually placing blame on the API provider); then offer to open any URLs as is done currently! def check_and_open_urls(self, text: str) -> List[str]: """Check text for URLs and offer to open them in a browser.""" From b2bcca967f7cfe4d1adc04f3dd265a88460fd622 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Fri, 1 Nov 2024 09:08:57 -0700 Subject: [PATCH 31/40] refactor: update check_and_open_urls to handle exceptions with friendly messages --- aider/coders/base_coder.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 0113f3350..af4faff05 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -790,9 +790,26 @@ class Coder: self.num_reflections += 1 message = self.reflected_message - # ai: have this take the exception, not the string; based on the exception type offer a simple english explanation for what went wrong (usually placing blame on the API provider); then offer to open any URLs as is done currently! - def check_and_open_urls(self, text: str) -> List[str]: - """Check text for URLs and offer to open them in a browser.""" + def check_and_open_urls(self, exc: Exception) -> List[str]: + """Check exception for URLs and offer to open them in a browser, with user-friendly error explanation.""" + text = str(exc) + friendly_msg = None + + if isinstance(exc, (openai.APITimeoutError, openai.APIConnectionError)): + friendly_msg = "The API provider is having connectivity issues. Please try again in a moment." + elif isinstance(exc, openai.RateLimitError): + friendly_msg = "The API provider's rate limits have been exceeded. Please wait a moment before trying again." + elif isinstance(exc, openai.InternalServerError): + friendly_msg = "The API provider is experiencing internal issues. Please try again later." + elif isinstance(exc, openai.BadRequestError): + friendly_msg = "The request was invalid. This might be due to the API provider changing their API." + elif isinstance(exc, openai.AuthenticationError): + friendly_msg = "There was an issue with your API authentication. Please check your API key." + + if friendly_msg: + self.io.tool_error(f"{friendly_msg}\nTechnical details: {text}") + else: + self.io.tool_error(text) url_pattern = re.compile(r"(https?://[^\s/$.?#].[^\s]*)") urls = list(set(url_pattern.findall(text))) # Use set to remove duplicates From 3b2f1f1e664d331d0ccfa79fa56584ed4f7fcdb3 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Fri, 1 Nov 2024 09:09:03 -0700 Subject: [PATCH 32/40] style: format long error messages with line breaks --- aider/coders/base_coder.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index af4faff05..76968afe2 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -796,15 +796,26 @@ class Coder: friendly_msg = None if isinstance(exc, (openai.APITimeoutError, openai.APIConnectionError)): - friendly_msg = "The API provider is having connectivity issues. Please try again in a moment." + friendly_msg = ( + "The API provider is having connectivity issues. Please try again in a moment." + ) elif isinstance(exc, openai.RateLimitError): - friendly_msg = "The API provider's rate limits have been exceeded. Please wait a moment before trying again." + friendly_msg = ( + "The API provider's rate limits have been exceeded. Please wait a moment before" + " trying again." + ) elif isinstance(exc, openai.InternalServerError): - friendly_msg = "The API provider is experiencing internal issues. Please try again later." + friendly_msg = ( + "The API provider is experiencing internal issues. Please try again later." + ) elif isinstance(exc, openai.BadRequestError): - friendly_msg = "The request was invalid. This might be due to the API provider changing their API." + friendly_msg = ( + "The request was invalid. This might be due to the API provider changing their API." + ) elif isinstance(exc, openai.AuthenticationError): - friendly_msg = "There was an issue with your API authentication. Please check your API key." + friendly_msg = ( + "There was an issue with your API authentication. Please check your API key." + ) if friendly_msg: self.io.tool_error(f"{friendly_msg}\nTechnical details: {text}") From bfa9dce1e04e4c0e0b8f95295d6059be91de334c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:12:49 -0700 Subject: [PATCH 33/40] refactor: improve API error messages and display format --- aider/coders/base_coder.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 76968afe2..0f0d9dd1c 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -797,28 +797,28 @@ class Coder: if isinstance(exc, (openai.APITimeoutError, openai.APIConnectionError)): friendly_msg = ( - "The API provider is having connectivity issues. Please try again in a moment." + "There is a problem connecting to the API provider." ) elif isinstance(exc, openai.RateLimitError): friendly_msg = ( - "The API provider's rate limits have been exceeded. Please wait a moment before" - " trying again." + "The API provider's rate limits have been exceeded. Check with your provider or wait awhile and retry." ) elif isinstance(exc, openai.InternalServerError): friendly_msg = ( - "The API provider is experiencing internal issues. Please try again later." + "The API provider seems to be down or overloaded. Please try again later." ) elif isinstance(exc, openai.BadRequestError): friendly_msg = ( - "The request was invalid. This might be due to the API provider changing their API." + "The API provider refused the request as invalid?" ) elif isinstance(exc, openai.AuthenticationError): friendly_msg = ( - "There was an issue with your API authentication. Please check your API key." + "The API provider refused your authentication. Please check that you are using a valid API key." ) if friendly_msg: - self.io.tool_error(f"{friendly_msg}\nTechnical details: {text}") + self.io.tool_warning(text) + self.io.tool_error(f"{friendly_msg}") else: self.io.tool_error(text) From 78a8d19ac537b079c735add55027d37776fd6e71 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Fri, 1 Nov 2024 09:12:50 -0700 Subject: [PATCH 34/40] fix: pass exception objects directly to check_and_open_urls --- aider/coders/base_coder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 0f0d9dd1c..fc92b3c58 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1192,7 +1192,7 @@ class Coder: retry_delay *= 2 if retry_delay > RETRY_TIMEOUT: self.mdstream = None - self.check_and_open_urls(err_msg) + self.check_and_open_urls(err) break self.io.tool_output(f"Retrying in {retry_delay:.1f} seconds...") time.sleep(retry_delay) @@ -1224,7 +1224,7 @@ class Coder: except (openai.APIError, openai.APIStatusError) as err: self.mdstream = None self.io.tool_error(str(err)) - self.check_and_open_urls(str(err)) + self.check_and_open_urls(err) except Exception as err: lines = traceback.format_exception(type(err), err, err.__traceback__) self.io.tool_warning("".join(lines)) From f53f5927df506c246136f5afff23806bb15d16ed Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:20:31 -0700 Subject: [PATCH 35/40] Show friendly API error messages --- aider/coders/base_coder.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index fc92b3c58..1beed7a45 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -791,29 +791,32 @@ class Coder: message = self.reflected_message def check_and_open_urls(self, exc: Exception) -> List[str]: - """Check exception for URLs and offer to open them in a browser, with user-friendly error explanation.""" + import openai + + """Check exception for URLs, offer to open in a browser, with user-friendly error msgs.""" text = str(exc) friendly_msg = None if isinstance(exc, (openai.APITimeoutError, openai.APIConnectionError)): friendly_msg = ( - "There is a problem connecting to the API provider." + "There is a problem connecting to the API provider. Please try again later or check" + " your model settings." ) elif isinstance(exc, openai.RateLimitError): friendly_msg = ( - "The API provider's rate limits have been exceeded. Check with your provider or wait awhile and retry." + "The API provider's rate limits have been exceeded. Check with your provider or" + " wait awhile and retry." ) elif isinstance(exc, openai.InternalServerError): friendly_msg = ( "The API provider seems to be down or overloaded. Please try again later." ) elif isinstance(exc, openai.BadRequestError): - friendly_msg = ( - "The API provider refused the request as invalid?" - ) + friendly_msg = "The API provider refused the request as invalid?" elif isinstance(exc, openai.AuthenticationError): friendly_msg = ( - "The API provider refused your authentication. Please check that you are using a valid API key." + "The API provider refused your authentication. Please check that you are using a" + " valid API key." ) if friendly_msg: @@ -1182,18 +1185,15 @@ class Coder: break except retry_exceptions() as err: # Print the error and its base classes - err_msg = str(err) - # base_classes = [] - # for cls in err.__class__.__mro__: # Skip the class itself - # base_classes.append(cls.__name__) - # if base_classes: - # err_msg += f"\nBase classes: {' -> '.join(base_classes)}" - self.io.tool_error(err_msg) + # for cls in err.__class__.__mro__: dump(cls.__name__) + retry_delay *= 2 if retry_delay > RETRY_TIMEOUT: self.mdstream = None self.check_and_open_urls(err) break + err_msg = str(err) + self.io.tool_error(err_msg) self.io.tool_output(f"Retrying in {retry_delay:.1f} seconds...") time.sleep(retry_delay) continue @@ -1222,9 +1222,10 @@ class Coder: dict(role="assistant", content=self.multi_response_content, prefix=True) ) except (openai.APIError, openai.APIStatusError) as err: + # for cls in err.__class__.__mro__: dump(cls.__name__) self.mdstream = None - self.io.tool_error(str(err)) self.check_and_open_urls(err) + break except Exception as err: lines = traceback.format_exception(type(err), err, err.__traceback__) self.io.tool_warning("".join(lines)) From ebc9a30cc6d1676cd426f8dd2cdde78191a7cae2 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:23:37 -0700 Subject: [PATCH 36/40] copy --- HISTORY.md | 4 ++ aider/website/HISTORY.md | 6 ++- aider/website/assets/sample-analytics.jsonl | 54 +++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 95754fea9..c06f63b0a 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,7 +13,11 @@ - Bugfix for when diff mode flexibly handles the model using the wrong filename. - Displays filenames in sorted order for `/add` and `/read-only`. - New `--no-fancy-input` switch disables prompt toolkit input, now still available with `--no-pretty`. +- Override browser config with `--no-browser` or `--no-gui`. +- Offer to open documentation URLs when errors occur. - Properly support all o1 models, regardless of provider. +- Improved layout of filenames above input prompt. +- Better handle corrupted repomap tags cache. - Improved handling of API errors, especially when accessing the weak model. - Aider wrote 68% of the code in this release. diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index f5ed93f46..44a137cb4 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -31,9 +31,13 @@ cog.out(text) - Bugfix for when diff mode flexibly handles the model using the wrong filename. - Displays filenames in sorted order for `/add` and `/read-only`. - New `--no-fancy-input` switch disables prompt toolkit input, now still available with `--no-pretty`. +- Override browser config with `--no-browser` or `--no-gui`. +- Offer to open documentation URLs when errors occur. - Properly support all o1 models, regardless of provider. +- Improved layout of filenames above input prompt. +- Better handle corrupted repomap tags cache. - Improved handling of API errors, especially when accessing the weak model. -- Aider wrote 70% of the code in this release. +- Aider wrote 68% of the code in this release. ### Aider v0.60.1 diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 426acd39e..7a6d56aa0 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -293,3 +293,57 @@ {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 15950, "completion_tokens": 330, "total_tokens": 16280, "cost": 0.05280000000000001, "total_cost": 0.08386800000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413669} {"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413704} {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 18174, "completion_tokens": 292, "total_tokens": 18466, "cost": 0.058902, "total_cost": 0.14277, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413719} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413935} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413935} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730413937} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730414047} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730414048} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730414048} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730414048} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730414050} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730415697} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730415697} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 3293, "completion_tokens": 439, "total_tokens": 3732, "cost": 0.016464, "total_cost": 0.016464, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730415752} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 3960, "completion_tokens": 517, "total_tokens": 4477, "cost": 0.019635, "total_cost": 0.036099, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730415790} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730415930} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730415931} +{"event": "command_drop", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730473870} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730473873} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 4607, "completion_tokens": 97, "total_tokens": 4704, "cost": 0.015276, "total_cost": 0.5826659999999999, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730473888} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730473908} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730473916} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 5842, "completion_tokens": 604, "total_tokens": 6446, "cost": 0.026586, "total_cost": 0.6092519999999999, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730473929} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730474024} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730474025} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730474027} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477197} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477206} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477229} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 18098, "completion_tokens": 632, "total_tokens": 18730, "cost": 0.063774, "total_cost": 0.6730259999999999, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477334} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 18968, "completion_tokens": 219, "total_tokens": 19187, "cost": 0.060189000000000006, "total_cost": 0.733215, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477568} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477576} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477576} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19375, "completion_tokens": 91, "total_tokens": 19466, "cost": 0.05949, "total_cost": 0.792705, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477578} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19587, "completion_tokens": 158, "total_tokens": 19745, "cost": 0.061131, "total_cost": 0.853836, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477585} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20082, "completion_tokens": 294, "total_tokens": 20376, "cost": 0.064656, "total_cost": 0.9184920000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477595} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477605} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477606} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477636} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477636} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477655} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477656} +{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 37070, "completion_tokens": 0, "total_tokens": 37070, "cost": 0.005560499999999993, "total_cost": 0.005560499999999993, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477731} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477733} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477733} +{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 2022, "completion_tokens": 0, "total_tokens": 2022, "cost": 0.00030329999999999995, "total_cost": 0.00030329999999999995, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477738} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477767} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477767} +{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 674, "completion_tokens": 0, "total_tokens": 674, "cost": 0.00010109999999999999, "total_cost": 0.00010109999999999999, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477770} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477789} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477789} +{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 674, "completion_tokens": 0, "total_tokens": 674, "cost": 0.00010109999999999999, "total_cost": 0.00010109999999999999, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477792} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477822} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477822} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477834} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477835} +{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 4044, "completion_tokens": 0, "total_tokens": 4044, "cost": 0.0006066, "total_cost": 0.0006066, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477852} From 9e18fc55d3502b9cb7929ec08aaaed3ed22e9413 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:38:46 -0700 Subject: [PATCH 37/40] version bump to 0.61.0 --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index 380d10743..95b0c1a49 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ try: from aider.__version__ import __version__ except Exception: - __version__ = "0.60.2.dev" + __version__ = "0.61.0" __all__ = [__version__] From 305b4fee87ab3b5116415309bdc37d28ad65f5f0 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:40:02 -0700 Subject: [PATCH 38/40] set version to 0.61.1.dev --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index 95b0c1a49..699ff523f 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ try: from aider.__version__ import __version__ except Exception: - __version__ = "0.61.0" + __version__ = "0.61.1.dev" __all__ = [__version__] From 6a0380b8c0489141504770935e8864869f02087b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 09:46:27 -0700 Subject: [PATCH 39/40] copy --- HISTORY.md | 2 +- aider/website/HISTORY.md | 2 +- aider/website/_data/blame.yml | 76 +++++++++++++++++++++ aider/website/assets/sample-analytics.jsonl | 5 ++ 4 files changed, 83 insertions(+), 2 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index c06f63b0a..302e3ac15 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,7 +1,7 @@ # Release history -### main branch +### Aider v0.61.0 - Load and save aider slash-commands to files: - `/save ` command will make a file of `/add` and `/read-only` commands that recreate the current file context in the chat. diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index 44a137cb4..57b7ab99d 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -19,7 +19,7 @@ cog.out(text) -### main branch +### Aider v0.61.0 - Load and save aider slash-commands to files: - `/save ` command will make a file of `/add` and `/read-only` commands that recreate the current file context in the chat. diff --git a/aider/website/_data/blame.yml b/aider/website/_data/blame.yml index bfe40b68e..66fadfeaf 100644 --- a/aider/website/_data/blame.yml +++ b/aider/website/_data/blame.yml @@ -2819,3 +2819,79 @@ fry69: 18 start_tag: v0.59.0 total_lines: 285 +- aider_percentage: 67.61 + aider_total: 860 + end_date: '2024-11-01' + end_tag: v0.61.0 + file_counts: + aider/__init__.py: + Paul Gauthier: 1 + aider/analytics.py: + Paul Gauthier: 75 + Paul Gauthier (aider): 89 + aider/args.py: + Paul Gauthier: 5 + Paul Gauthier (aider): 29 + aider/coders/base_coder.py: + Paul Gauthier: 56 + Paul Gauthier (aider): 43 + aider/coders/editblock_coder.py: + Paul Gauthier: 14 + aider/commands.py: + Paul Gauthier: 14 + Paul Gauthier (aider): 86 + aider/io.py: + Paul Gauthier: 12 + Paul Gauthier (aider): 32 + aider/linter.py: + Paul Gauthier: 6 + aider/main.py: + Paul Gauthier: 48 + Paul Gauthier (aider): 10 + aider/models.py: + Paul Gauthier: 54 + Paul Gauthier (aider): 63 + kAIto47802: 4 + aider/repomap.py: + Paul Gauthier: 12 + Paul Gauthier (aider): 52 + aider/sendchat.py: + Paul Gauthier: 23 + Paul Gauthier (aider): 23 + aider/urls.py: + Paul Gauthier: 2 + aider/utils.py: + Paul Gauthier (aider): 6 + scripts/issues.py: + Paul Gauthier (aider): 13 + scripts/pip-compile.sh: + Paul Gauthier (aider): 13 + scripts/update-docs.sh: + Paul Gauthier: 1 + Paul Gauthier (aider): 5 + tests/basic/test_analytics.py: + Paul Gauthier: 1 + Paul Gauthier (aider): 99 + tests/basic/test_commands.py: + Konstantin L: 34 + Paul Gauthier: 45 + Paul Gauthier (aider): 267 + tests/basic/test_io.py: + Paul Gauthier: 2 + Paul Gauthier (aider): 4 + tests/basic/test_main.py: + Paul Gauthier (aider): 3 + tests/basic/test_models.py: + Paul Gauthier: 3 + Paul Gauthier (aider): 9 + tests/basic/test_sanity_check_repo.py: + Paul Gauthier (aider): 6 + tests/basic/test_sendchat.py: + Paul Gauthier (aider): 8 + grand_total: + Konstantin L: 34 + Paul Gauthier: 374 + Paul Gauthier (aider): 860 + kAIto47802: 4 + start_tag: v0.60.0 + total_lines: 1272 diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 7a6d56aa0..a125eb78e 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -347,3 +347,8 @@ {"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477834} {"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477835} {"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 4044, "completion_tokens": 0, "total_tokens": 4044, "cost": 0.0006066, "total_cost": 0.0006066, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730477852} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730478267} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730478268} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730478719} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730479180} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730479181} From 0022c1a67e2b1bef61ccac61fb6fdea8a834e4b9 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 1 Nov 2024 11:26:39 -0700 Subject: [PATCH 40/40] copy --- aider/website/_posts/2024-05-24-self-assembly.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/aider/website/_posts/2024-05-24-self-assembly.md b/aider/website/_posts/2024-05-24-self-assembly.md index 66fd36b27..4ccb9af96 100644 --- a/aider/website/_posts/2024-05-24-self-assembly.md +++ b/aider/website/_posts/2024-05-24-self-assembly.md @@ -12,6 +12,10 @@ nav_exclude: true [![self assembly](/assets/self-assembly.jpg)](https://aider.chat/assets/self-assembly.jpg) +{: .note } +This article is quite out dated. For current statistics, see +[aider's release history](/HISTORY.html). + The [aider git repo](https://github.com/Aider-AI/aider) currently contains about 4K commits and 14K lines of code.