From d8e9da35d65cd668532b4d70a5f4788854e9571b Mon Sep 17 00:00:00 2001
From: Chad Phillips
Date: Sun, 3 Nov 2024 20:17:23 -0500
Subject: [PATCH 001/407] add /editor command
Opens an editor for constructing a user prompt, using the currently defined chat mode.
The editor is determined as follows:
Look for the following environment variables, in order:
1. AIDER_EDITOR
2. VISUAL
3. EDITOR
If none of these are defined, use the following defaults:
Windows: notepad
OS X: vim
*nix: vi
If an editor is not found, a RuntimeError is raised.
Any arguments passed after the /editor command are inserted as content.
The temporary file used for editing has an .md extension, which can be leveraged for syntax highlighting.
NOTE: The editor used MUST block the process until the editor is closed -- the default editors all do this.
---
aider/commands.py | 7 +++
aider/editor.py | 146 ++++++++++++++++++++++++++++++++++++++++++++++
aider/io.py | 15 +++--
3 files changed, 162 insertions(+), 6 deletions(-)
create mode 100644 aider/editor.py
diff --git a/aider/commands.py b/aider/commands.py
index 45d19c1b8..b11fdf2c4 100644
--- a/aider/commands.py
+++ b/aider/commands.py
@@ -1357,6 +1357,13 @@ class Commands:
report_github_issue(issue_text, title=title, confirm=False)
+ def cmd_editor(self, initial_content=""):
+ "Open an editor to write a prompt"
+ from aider.editor import pipe_editor
+ user_input = pipe_editor(initial_content, suffix="md")
+ self.io.display_user_input(user_input)
+ self._generic_chat_command(user_input, self.coder.edit_format)
+
def expand_subdir(file_path):
if file_path.is_file():
diff --git a/aider/editor.py b/aider/editor.py
new file mode 100644
index 000000000..a6cbc0522
--- /dev/null
+++ b/aider/editor.py
@@ -0,0 +1,146 @@
+"""
+Editor module for handling system text editor interactions.
+
+This module provides functionality to:
+- Discover and launch the system's configured text editor
+- Create and manage temporary files for editing
+- Handle editor preferences from environment variables
+- Support cross-platform editor operations
+"""
+
+import os
+import tempfile
+import subprocess
+import platform
+import shlex
+from rich.console import Console
+
+SYSTEM = platform.system()
+
+DEFAULT_EDITOR_NIX = "vi"
+DEFAULT_EDITOR_OS_X = "vim"
+DEFAULT_EDITOR_WINDOWS = "notepad"
+
+console = Console()
+
+
+def print_status_message(success: bool, message: str, style: str | None = None) -> None:
+ """
+ Print a status message with appropriate styling.
+
+ :param success: Whether the operation was successful
+ :param message: The message to display
+ :param style: Optional style override. If None, uses green for success and red for failure
+ """
+ if style is None:
+ style = "bold green" if success else "bold red"
+ console.print(message, style=style)
+ print("")
+
+
+def write_temp_file(input_data: str = "", suffix: str | None = None, prefix: str | None = None, dir: str | None = None) -> str:
+ """
+ Create a temporary file with the given input data.
+
+ :param input_data: Content to write to the temporary file
+ :param suffix: Optional file extension (without the dot)
+ :param prefix: Optional prefix for the temporary filename
+ :param dir: Optional directory to create the file in
+ :return: Path to the created temporary file
+ :raises: OSError if file creation or writing fails
+ """
+ kwargs = {"prefix": prefix, "dir": dir}
+ if suffix:
+ kwargs["suffix"] = f".{suffix}"
+ fd, filepath = tempfile.mkstemp(**kwargs)
+ try:
+ with os.fdopen(fd, 'w') as f:
+ f.write(input_data)
+ except Exception:
+ os.close(fd)
+ raise
+ return filepath
+
+
+def get_environment_editor(default: str | None = None) -> str | None:
+ """
+ Fetches the preferred editor from the environment variables.
+
+ This function checks the following environment variables in order to
+ determine the user's preferred editor:
+
+ - AIDER_EDITOR
+ - VISUAL
+ - EDITOR
+
+ :param default: The default editor to return if no environment variable is set.
+ :type default: str or None
+ :return: The preferred editor as specified by environment variables or the default value.
+ :rtype: str or None
+ """
+ editor = os.environ.get("AIDER_EDITOR", os.environ.get("VISUAL", os.environ.get("EDITOR", default)))
+ return editor
+
+
+def discover_editor() -> list[str]:
+ """
+ Discovers and returns the appropriate editor command as a list of arguments.
+
+ Handles cases where the editor command includes arguments, including quoted arguments
+ with spaces (e.g. 'vim -c "set noswapfile"').
+
+ :return: A list of command parts ready for subprocess execution
+ :rtype: list[str]
+ """
+ if SYSTEM == "Windows":
+ default_editor = DEFAULT_EDITOR_WINDOWS
+ elif SYSTEM == "Darwin":
+ default_editor = DEFAULT_EDITOR_OS_X
+ else:
+ default_editor = DEFAULT_EDITOR_NIX
+ editor = get_environment_editor(default_editor)
+ try:
+ return shlex.split(editor)
+ except ValueError as e:
+ raise RuntimeError(f"Invalid editor command format '{editor}': {e}")
+
+
+def file_editor(filepath: str) -> None:
+ """
+ Open the specified file in the system's configured editor.
+
+ This function blocks until the editor is closed.
+
+ :param filepath: Path to the file to edit
+ :type filepath: str
+ :raises RuntimeError: If the editor command is invalid
+ """
+ command_parts = discover_editor()
+ command_parts.append(filepath)
+ subprocess.call(command_parts)
+
+
+def pipe_editor(input_data: str = "", suffix: str | None = None) -> str:
+ """
+ Opens the system editor with optional input data and returns the edited content.
+
+ This function creates a temporary file with the provided input data, opens it in
+ the system editor, waits for the user to make changes and close the editor, then
+ reads and returns the modified content. The temporary file is deleted afterwards.
+
+ :param input_data: Initial content to populate the editor with
+ :type input_data: str
+ :param suffix: Optional file extension for the temporary file (e.g. '.txt', '.md')
+ :type suffix: str or None
+ :return: The edited content after the editor is closed
+ :rtype: str
+ """
+ filepath = write_temp_file(input_data, suffix)
+ file_editor(filepath)
+ with open(filepath, "r") as f:
+ output_data = f.read()
+ try:
+ os.remove(filepath)
+ except PermissionError:
+ print_status_message(False, f"WARNING: Unable to delete temporary file {filepath!r}. You may need to delete it manually.")
+ return output_data
diff --git a/aider/io.py b/aider/io.py
index 5e27a267a..cbde836a5 100644
--- a/aider/io.py
+++ b/aider/io.py
@@ -457,14 +457,17 @@ class InputOutput:
log_file.write(f"{role.upper()} {timestamp}\n")
log_file.write(content + "\n")
+ def display_user_input(self, inp):
+ if self.pretty and self.user_input_color:
+ style = dict(style=self.user_input_color)
+ else:
+ style = dict()
+
+ self.console.print(Text(inp), **style)
+
def user_input(self, inp, log_only=True):
if not log_only:
- if self.pretty and self.user_input_color:
- style = dict(style=self.user_input_color)
- else:
- style = dict()
-
- self.console.print(Text(inp), **style)
+ self.display_user_input(inp)
prefix = "####"
if inp:
From a7f59a2e2b56618ddcf828090b54b01ebab1defb Mon Sep 17 00:00:00 2001
From: malkoG
Date: Mon, 4 Nov 2024 12:38:27 +0900
Subject: [PATCH 002/407] Add tags.scm for dart
---
aider/queries/tree-sitter-dart-tags.scm | 91 +++++++++++++++++++++++++
1 file changed, 91 insertions(+)
create mode 100644 aider/queries/tree-sitter-dart-tags.scm
diff --git a/aider/queries/tree-sitter-dart-tags.scm b/aider/queries/tree-sitter-dart-tags.scm
new file mode 100644
index 000000000..1aacad0de
--- /dev/null
+++ b/aider/queries/tree-sitter-dart-tags.scm
@@ -0,0 +1,91 @@
+(class_definition
+ name: (identifier) @name.definition.class) @definition.class
+
+(method_signature
+ (function_signature)) @definition.method
+
+(type_alias
+ (type_identifier) @name.definition.type) @definition.type
+
+(method_signature
+ (getter_signature
+ name: (identifier) @name.definition.method)) @definition.method
+
+(method_signature
+ (setter_signature
+ name: (identifier) @name.definition.method)) @definition.method
+
+(method_signature
+ (function_signature
+ name: (identifier) @name.definition.method)) @definition.method
+
+(method_signature
+ (factory_constructor_signature
+ (identifier) @name.definition.method)) @definition.method
+
+(method_signature
+ (constructor_signature
+ name: (identifier) @name.definition.method)) @definition.method
+
+(method_signature
+ (operator_signature)) @definition.method
+
+(method_signature) @definition.method
+
+(mixin_declaration
+ (mixin)
+ (identifier) @name.definition.mixin) @definition.mixin
+
+(extension_declaration
+ name: (identifier) @name.definition.extension) @definition.extension
+
+(enum_declaration
+ name: (identifier) @name.definition.enum) @definition.enum
+
+(function_signature
+ name: (identifier) @name.definition.function) @definition.function
+
+(new_expression
+ (type_identifier) @name.reference.class) @reference.class
+
+(initialized_variable_definition
+ name: (identifier)
+ value: (identifier) @name.reference.class
+ value: (selector
+ "!"?
+ (argument_part
+ (arguments
+ (argument)*))?)?) @reference.class
+
+(assignment_expression
+ left: (assignable_expression
+ (identifier)
+ (unconditional_assignable_selector
+ "."
+ (identifier) @name.reference.call))) @reference.call
+
+(assignment_expression
+ left: (assignable_expression
+ (identifier)
+ (conditional_assignable_selector
+ "?."
+ (identifier) @name.reference.call))) @reference.call
+
+((identifier) @name
+ (selector
+ "!"?
+ (conditional_assignable_selector
+ "?." (identifier) @name.reference.call)?
+ (unconditional_assignable_selector
+ "."? (identifier) @name.reference.call)?
+ (argument_part
+ (arguments
+ (argument)*))?)*
+ (cascade_section
+ (cascade_selector
+ (identifier)) @name.reference.call
+ (argument_part
+ (arguments
+ (argument)*))?)?) @reference.call
+
+
From a8a3e2401be1469766de8b2da799c29f8b740fd1 Mon Sep 17 00:00:00 2001
From: malkoG
Date: Mon, 4 Nov 2024 13:22:22 +0900
Subject: [PATCH 003/407] Update languages.md for dart support
---
aider/website/docs/languages.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/website/docs/languages.md b/aider/website/docs/languages.md
index ac91ab537..ac8d53a10 100644
--- a/aider/website/docs/languages.md
+++ b/aider/website/docs/languages.md
@@ -62,6 +62,7 @@ cog.out(get_supported_languages_md())
| cpp | .cc | ✓ | ✓ |
| cpp | .cpp | ✓ | ✓ |
| css | .css | | ✓ |
+| dart | .dart | ✓ | |
| dockerfile | .dockerfile | | ✓ |
| dot | .dot | | ✓ |
| elisp | .el | ✓ | ✓ |
From 8801fda972e45d26e0d3b004e7aa9dee67cb57a4 Mon Sep 17 00:00:00 2001
From: Chad Phillips
Date: Mon, 4 Nov 2024 10:10:37 -0600
Subject: [PATCH 004/407] formatting fixes
---
aider/commands.py | 1 +
aider/editor.py | 36 +++++++++++++++++++++++++-----------
2 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/aider/commands.py b/aider/commands.py
index b11fdf2c4..0c76e5fd4 100644
--- a/aider/commands.py
+++ b/aider/commands.py
@@ -1360,6 +1360,7 @@ class Commands:
def cmd_editor(self, initial_content=""):
"Open an editor to write a prompt"
from aider.editor import pipe_editor
+
user_input = pipe_editor(initial_content, suffix="md")
self.io.display_user_input(user_input)
self._generic_chat_command(user_input, self.coder.edit_format)
diff --git a/aider/editor.py b/aider/editor.py
index a6cbc0522..fbed5ee4f 100644
--- a/aider/editor.py
+++ b/aider/editor.py
@@ -9,10 +9,11 @@ This module provides functionality to:
"""
import os
-import tempfile
-import subprocess
import platform
import shlex
+import subprocess
+import tempfile
+
from rich.console import Console
SYSTEM = platform.system()
@@ -24,7 +25,7 @@ DEFAULT_EDITOR_WINDOWS = "notepad"
console = Console()
-def print_status_message(success: bool, message: str, style: str | None = None) -> None:
+def print_status_message(success, message, style=None):
"""
Print a status message with appropriate styling.
@@ -38,7 +39,12 @@ def print_status_message(success: bool, message: str, style: str | None = None)
print("")
-def write_temp_file(input_data: str = "", suffix: str | None = None, prefix: str | None = None, dir: str | None = None) -> str:
+def write_temp_file(
+ input_data="",
+ suffix=None,
+ prefix=None,
+ dir=None,
+):
"""
Create a temporary file with the given input data.
@@ -54,7 +60,7 @@ def write_temp_file(input_data: str = "", suffix: str | None = None, prefix: str
kwargs["suffix"] = f".{suffix}"
fd, filepath = tempfile.mkstemp(**kwargs)
try:
- with os.fdopen(fd, 'w') as f:
+ with os.fdopen(fd, "w") as f:
f.write(input_data)
except Exception:
os.close(fd)
@@ -62,7 +68,7 @@ def write_temp_file(input_data: str = "", suffix: str | None = None, prefix: str
return filepath
-def get_environment_editor(default: str | None = None) -> str | None:
+def get_environment_editor(default=None):
"""
Fetches the preferred editor from the environment variables.
@@ -78,11 +84,13 @@ def get_environment_editor(default: str | None = None) -> str | None:
:return: The preferred editor as specified by environment variables or the default value.
:rtype: str or None
"""
- editor = os.environ.get("AIDER_EDITOR", os.environ.get("VISUAL", os.environ.get("EDITOR", default)))
+ editor = os.environ.get(
+ "AIDER_EDITOR", os.environ.get("VISUAL", os.environ.get("EDITOR", default))
+ )
return editor
-def discover_editor() -> list[str]:
+def discover_editor():
"""
Discovers and returns the appropriate editor command as a list of arguments.
@@ -105,7 +113,7 @@ def discover_editor() -> list[str]:
raise RuntimeError(f"Invalid editor command format '{editor}': {e}")
-def file_editor(filepath: str) -> None:
+def file_editor(filepath):
"""
Open the specified file in the system's configured editor.
@@ -120,7 +128,7 @@ def file_editor(filepath: str) -> None:
subprocess.call(command_parts)
-def pipe_editor(input_data: str = "", suffix: str | None = None) -> str:
+def pipe_editor(input_data="", suffix=None):
"""
Opens the system editor with optional input data and returns the edited content.
@@ -142,5 +150,11 @@ def pipe_editor(input_data: str = "", suffix: str | None = None) -> str:
try:
os.remove(filepath)
except PermissionError:
- print_status_message(False, f"WARNING: Unable to delete temporary file {filepath!r}. You may need to delete it manually.")
+ print_status_message(
+ False,
+ (
+ f"WARNING: Unable to delete temporary file {filepath!r}. You may need to delete it"
+ " manually."
+ ),
+ )
return output_data
From 266350b8ce93d30e88a48030ed31779dbf45c6fd Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 14 Nov 2024 06:48:33 -0800
Subject: [PATCH 005/407] fix: Handle potential git errors in git_ignored_file
method
---
aider/repo.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/repo.py b/aider/repo.py
index 83cb914de..6a3f666e9 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -334,6 +334,7 @@ class GitRepo:
def git_ignored_file(self, path):
if not self.repo:
return
+ #ai try/except for git errors!
if self.repo.ignored(path):
return True
From 94c3957d92b51bedf5d90b4c6a6a14f6e8fba071 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 14 Nov 2024 06:48:35 -0800
Subject: [PATCH 006/407] fix: Add error handling for git.ignored() method
---
aider/repo.py | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/aider/repo.py b/aider/repo.py
index 6a3f666e9..3445a1848 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -334,9 +334,11 @@ class GitRepo:
def git_ignored_file(self, path):
if not self.repo:
return
- #ai try/except for git errors!
- if self.repo.ignored(path):
- return True
+ try:
+ if self.repo.ignored(path):
+ return True
+ except ANY_GIT_ERROR:
+ return False
def ignored_file(self, fname):
self.refresh_aider_ignore()
From d8a5bc3ae9fca9c804da6d217b0ea2914f2937c5 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 14 Nov 2024 06:53:21 -0800
Subject: [PATCH 007/407] Revert "Merge branch 'issue2283'"
This reverts commit e1a1e43c3a15bc96120deb9620bb9357b5d59fa8, reversing
changes made to c538817b61defb10a8813cf82ba6572dd0d28986.
---
aider/coders/base_coder.py | 24 +++++++++++-------------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py
index ebd36a941..53d0e4051 100755
--- a/aider/coders/base_coder.py
+++ b/aider/coders/base_coder.py
@@ -1245,19 +1245,10 @@ class Coder:
else:
content = ""
- if not interrupted:
- add_rel_files_message = self.check_for_file_mentions(content)
- if add_rel_files_message:
- if self.reflected_message:
- self.reflected_message += "\n\n" + add_rel_files_message
- else:
- self.reflected_message = add_rel_files_message
- return
-
- try:
- self.reply_completed()
- except KeyboardInterrupt:
- interrupted = True
+ try:
+ self.reply_completed()
+ except KeyboardInterrupt:
+ interrupted = True
if interrupted:
content += "\n^C KeyboardInterrupt"
@@ -1308,6 +1299,13 @@ class Coder:
self.update_cur_messages()
return
+ add_rel_files_message = self.check_for_file_mentions(content)
+ if add_rel_files_message:
+ if self.reflected_message:
+ self.reflected_message += "\n\n" + add_rel_files_message
+ else:
+ self.reflected_message = add_rel_files_message
+
def reply_completed(self):
pass
From 503a9a0038d611be5e1406936abf46b0e4ab1ec7 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 14 Nov 2024 06:55:05 -0800
Subject: [PATCH 008/407] version bump to 0.63.1
---
aider/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/__init__.py b/aider/__init__.py
index be5c29480..76826b6b6 100644
--- a/aider/__init__.py
+++ b/aider/__init__.py
@@ -1,6 +1,6 @@
try:
from aider.__version__ import __version__
except Exception:
- __version__ = "0.63.1.dev"
+ __version__ = "0.63.1"
__all__ = [__version__]
From 66f94d21410b03ef66fb21c36a3160042ba20d34 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 14 Nov 2024 06:56:43 -0800
Subject: [PATCH 009/407] set version to 0.63.2.dev
---
aider/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/__init__.py b/aider/__init__.py
index 76826b6b6..a10d8afc7 100644
--- a/aider/__init__.py
+++ b/aider/__init__.py
@@ -1,6 +1,6 @@
try:
from aider.__version__ import __version__
except Exception:
- __version__ = "0.63.1"
+ __version__ = "0.63.2.dev"
__all__ = [__version__]
From e0c1b2458c4f9ec2a057f9e48899b42812e5daa2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Luis=20Di=20Biase?=
Date: Thu, 14 Nov 2024 12:27:12 -0300
Subject: [PATCH 010/407] fix: typo pytest filename
---
CONTRIBUTING.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d304420b1..648256e10 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -187,8 +187,8 @@ pytest
You can also run specific test files or test cases by providing the file path or test name:
```
-pytest aider/tests/test_coder.py
-pytest aider/tests/test_coder.py::TestCoder::test_specific_case
+pytest tests/basic/test_coder.py
+pytest tests/basic/test_coder.py::TestCoder::test_specific_case
```
#### Continuous Integration
From 6b792de802018160f521319f7ddadc5dd6d3c794 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 14 Nov 2024 15:15:23 -0800
Subject: [PATCH 011/407] copy
---
.../docs/troubleshooting/edit-errors.md | 29 ++++++++++---------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/aider/website/docs/troubleshooting/edit-errors.md b/aider/website/docs/troubleshooting/edit-errors.md
index 73f3f4a7c..973983679 100644
--- a/aider/website/docs/troubleshooting/edit-errors.md
+++ b/aider/website/docs/troubleshooting/edit-errors.md
@@ -19,7 +19,19 @@ LLM edits that are "almost" correctly formatted.
But sometimes the LLM just won't cooperate.
In these cases, here are some things you might try.
-## Use a capable model
+## Don't add too many files
+
+Many LLMs now have very large context windows,
+but filling them with irrelevant code or conversation
+can confuse the model.
+
+- Don't add too many files to the chat, *just* add the files you think need to be edited.
+Aider also sends the LLM a [map of your entire git repo](https://aider.chat/docs/repomap.html), so other relevant code will be included automatically.
+- Use `/drop` to remove files from the chat session which aren't needed for the task at hand. This will reduce distractions and may help the LLM produce properly formatted edits.
+- Use `/clear` to remove the conversation history, again to help the LLM focus.
+- Use `/tokens` to see how many tokens you are using for each message.
+
+## Use a more capable model
If possible try using GPT-4o, Claude 3.5 Sonnet or Claude 3 Opus,
as they are the strongest and most capable models.
@@ -33,9 +45,9 @@ so editing errors are probably unavoidable.
Local models which have been quantized are even more likely to have problems
because they are not capable enough to follow aider's system prompts.
-## Try the whole format
+## Try the whole edit format
-Run aider with `--edit-format whole` if the model is using a different edit format.
+Run aider with `--edit-format whole` if were using a different edit format.
You can see which edit format it is using in the announce lines:
```
@@ -43,17 +55,6 @@ Aider v0.50.2-dev
Models: claude-3-5-sonnet-20240620 with ♾️ diff edit format
```
-## Reduce distractions
-
-Many LLMs now have very large context windows,
-but filling them with irrelevant code or conversation
-can confuse the model.
-
-- Don't add too many files to the chat, *just* add the files you think need to be edited.
-Aider also sends the LLM a [map of your entire git repo](https://aider.chat/docs/repomap.html), so other relevant code will be included automatically.
-- Use `/drop` to remove files from the chat session which aren't needed for the task at hand. This will reduce distractions and may help the LLM produce properly formatted edits.
-- Use `/clear` to remove the conversation history, again to help the LLM focus.
-- Use `/tokens` to see how many tokens you are using for each message.
## More help
From 805deb1002b5fd4b08c6ec0d94547bda3d9ab2bf Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 14 Nov 2024 15:18:45 -0800
Subject: [PATCH 012/407] feat: Add comment to expand read-only directory files
---
aider/main.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/main.py b/aider/main.py
index a604c5f64..0bd3668ad 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -541,6 +541,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
all_files = args.files + (args.file or [])
fnames = [str(Path(fn).resolve()) for fn in all_files]
read_only_fnames = [str(Path(fn).resolve()) for fn in (args.read or [])]
+ #ai expand any of the read_only_fnames which are dirs to be all the files under them!
if len(all_files) > 1:
good = True
for fname in all_files:
From 2681a41abb3d777a32f824a39030233611eee113 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 14 Nov 2024 15:18:47 -0800
Subject: [PATCH 013/407] refactor: Expand read-only file paths to include all
files in directories
---
aider/main.py | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/aider/main.py b/aider/main.py
index 0bd3668ad..8a1c7cac1 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -540,7 +540,13 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
all_files = args.files + (args.file or [])
fnames = [str(Path(fn).resolve()) for fn in all_files]
- read_only_fnames = [str(Path(fn).resolve()) for fn in (args.read or [])]
+ read_only_fnames = []
+ for fn in (args.read or []):
+ path = Path(fn).resolve()
+ if path.is_dir():
+ read_only_fnames.extend(str(f) for f in path.rglob('*') if f.is_file())
+ else:
+ read_only_fnames.append(str(path))
#ai expand any of the read_only_fnames which are dirs to be all the files under them!
if len(all_files) > 1:
good = True
From 3c26ced8db76c69e2b8e0ad21a8b13d5d61d0dbe Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 14 Nov 2024 15:18:54 -0800
Subject: [PATCH 014/407] style: Apply linter formatting to main.py
---
aider/main.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/aider/main.py b/aider/main.py
index 8a1c7cac1..0a5f029e7 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -541,13 +541,13 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
all_files = args.files + (args.file or [])
fnames = [str(Path(fn).resolve()) for fn in all_files]
read_only_fnames = []
- for fn in (args.read or []):
+ for fn in args.read or []:
path = Path(fn).resolve()
if path.is_dir():
- read_only_fnames.extend(str(f) for f in path.rglob('*') if f.is_file())
+ read_only_fnames.extend(str(f) for f in path.rglob("*") if f.is_file())
else:
read_only_fnames.append(str(path))
- #ai expand any of the read_only_fnames which are dirs to be all the files under them!
+ # ai expand any of the read_only_fnames which are dirs to be all the files under them!
if len(all_files) > 1:
good = True
for fname in all_files:
From e82b2c12b4cee7b5cfb9256b6c6b1a5d1f77d3e2 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 14 Nov 2024 15:27:40 -0800
Subject: [PATCH 015/407] cleanup
---
aider/main.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/main.py b/aider/main.py
index 0a5f029e7..39556c60a 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -547,7 +547,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
read_only_fnames.extend(str(f) for f in path.rglob("*") if f.is_file())
else:
read_only_fnames.append(str(path))
- # ai expand any of the read_only_fnames which are dirs to be all the files under them!
+
if len(all_files) > 1:
good = True
for fname in all_files:
From 38a5405c65b55c8a6c74ca824bd427cd678e4a8a Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 14 Nov 2024 15:30:49 -0800
Subject: [PATCH 016/407] copy
---
aider/website/docs/scripting.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/aider/website/docs/scripting.md b/aider/website/docs/scripting.md
index d4ee51c9e..df9533af0 100644
--- a/aider/website/docs/scripting.md
+++ b/aider/website/docs/scripting.md
@@ -95,3 +95,6 @@ io = InputOutput(yes=True)
coder = Coder.create(model=model, fnames=fnames, io=io)
```
+{: .note }
+The scripting API is not officially supported or documented and may
+change without warning.
From 0ce5a94c1561668050877e5851a0ef5b177ddfa6 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Fri, 15 Nov 2024 05:29:29 -0800
Subject: [PATCH 017/407] bumped deps
---
requirements.txt | 26 ++++++++++++++------------
requirements/requirements-browser.txt | 12 ++++++------
requirements/requirements-dev.txt | 16 ++++++++--------
requirements/requirements-help.txt | 17 ++++++++++-------
4 files changed, 38 insertions(+), 33 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index b77960136..7f66363be 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,7 +6,7 @@
#
aiohappyeyeballs==2.4.3
# via aiohttp
-aiohttp==3.10.10
+aiohttp==3.11.2
# via litellm
aiosignal==1.3.1
# via aiohttp
@@ -86,9 +86,9 @@ importlib-resources==6.4.5
# via -r requirements/requirements.in
jinja2==3.1.4
# via litellm
-jiter==0.7.0
+jiter==0.7.1
# via openai
-json5==0.9.25
+json5==0.9.28
# via -r requirements/requirements.in
jsonschema==4.23.0
# via
@@ -96,7 +96,7 @@ jsonschema==4.23.0
# litellm
jsonschema-specifications==2024.10.1
# via jsonschema
-litellm==1.51.2
+litellm==1.52.8
# via -r requirements/requirements.in
markdown-it-py==3.0.0
# via rich
@@ -120,9 +120,9 @@ numpy==1.26.4
# via
# -r requirements/requirements.in
# scipy
-openai==1.53.0
+openai==1.54.4
# via litellm
-packaging==24.1
+packaging==24.2
# via
# -r requirements/requirements.in
# huggingface-hub
@@ -139,7 +139,9 @@ posthog==3.7.0
prompt-toolkit==3.0.48
# via -r requirements/requirements.in
propcache==0.2.0
- # via yarl
+ # via
+ # aiohttp
+ # yarl
psutil==6.1.0
# via -r requirements/requirements.in
ptyprocess==0.7.0
@@ -176,7 +178,7 @@ referencing==0.35.1
# via
# jsonschema
# jsonschema-specifications
-regex==2024.9.11
+regex==2024.11.6
# via tiktoken
requests==2.32.3
# via
@@ -185,9 +187,9 @@ requests==2.32.3
# mixpanel
# posthog
# tiktoken
-rich==13.9.3
+rich==13.9.4
# via -r requirements/requirements.in
-rpds-py==0.20.1
+rpds-py==0.21.0
# via
# jsonschema
# referencing
@@ -217,7 +219,7 @@ tokenizers==0.19.1
# via
# -r requirements/requirements.in
# litellm
-tqdm==4.66.6
+tqdm==4.67.0
# via
# huggingface-hub
# openai
@@ -241,5 +243,5 @@ wcwidth==0.2.13
# via prompt-toolkit
yarl==1.17.1
# via aiohttp
-zipp==3.20.2
+zipp==3.21.0
# via importlib-metadata
diff --git a/requirements/requirements-browser.txt b/requirements/requirements-browser.txt
index 538b5dc9b..abe36be8c 100644
--- a/requirements/requirements-browser.txt
+++ b/requirements/requirements-browser.txt
@@ -13,7 +13,7 @@ attrs==24.2.0
# -c requirements/requirements-help.txt
# jsonschema
# referencing
-blinker==1.8.2
+blinker==1.9.0
# via streamlit
cachetools==5.5.0
# via streamlit
@@ -92,7 +92,7 @@ mdurl==0.1.2
# -c requirements/../requirements.txt
# -c requirements/requirements-dev.txt
# markdown-it-py
-narwhals==1.12.1
+narwhals==1.13.5
# via altair
numpy==1.26.4
# via
@@ -103,7 +103,7 @@ numpy==1.26.4
# pandas
# pydeck
# streamlit
-packaging==24.1
+packaging==24.2
# via
# -c requirements.txt
# -c requirements/../requirements.txt
@@ -157,13 +157,13 @@ requests==2.32.3
# -c requirements/requirements-dev.txt
# -c requirements/requirements-help.txt
# streamlit
-rich==13.9.3
+rich==13.9.4
# via
# -c requirements.txt
# -c requirements/../requirements.txt
# -c requirements/requirements-dev.txt
# streamlit
-rpds-py==0.20.1
+rpds-py==0.21.0
# via
# -c requirements.txt
# -c requirements/../requirements.txt
@@ -180,7 +180,7 @@ smmap==5.0.1
# -c requirements.txt
# -c requirements/../requirements.txt
# gitdb
-streamlit==1.39.0
+streamlit==1.40.1
# via -r requirements/requirements-browser.in
tenacity==8.5.0
# via
diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt
index 945efbf95..7cb36de5c 100644
--- a/requirements/requirements-dev.txt
+++ b/requirements/requirements-dev.txt
@@ -32,7 +32,7 @@ codespell==2.3.0
# via -r requirements/requirements-dev.in
cogapp==3.4.1
# via -r requirements/requirements-dev.in
-contourpy==1.3.0
+contourpy==1.3.1
# via matplotlib
cycler==0.12.1
# via matplotlib
@@ -51,9 +51,9 @@ filelock==3.16.1
# -c requirements.txt
# -c requirements/../requirements.txt
# virtualenv
-fonttools==4.54.1
+fonttools==4.55.0
# via matplotlib
-identify==2.6.1
+identify==2.6.2
# via pre-commit
idna==3.10
# via
@@ -103,7 +103,7 @@ numpy==1.26.4
# contourpy
# matplotlib
# pandas
-packaging==24.1
+packaging==24.2
# via
# -c requirements.txt
# -c requirements/../requirements.txt
@@ -164,7 +164,7 @@ requests==2.32.3
# -c requirements.txt
# -c requirements/../requirements.txt
# sphinx
-rich==13.9.3
+rich==13.9.4
# via
# -c requirements.txt
# -c requirements/../requirements.txt
@@ -184,7 +184,7 @@ sphinx==8.1.3
# via
# sphinx-rtd-theme
# sphinxcontrib-jquery
-sphinx-rtd-theme==3.0.1
+sphinx-rtd-theme==3.0.2
# via lox
sphinxcontrib-applehelp==2.0.0
# via sphinx
@@ -200,7 +200,7 @@ sphinxcontrib-qthelp==2.0.0
# via sphinx
sphinxcontrib-serializinghtml==2.0.0
# via sphinx
-typer==0.12.5
+typer==0.13.0
# via -r requirements/requirements-dev.in
typing-extensions==4.12.2
# via
@@ -216,7 +216,7 @@ urllib3==2.2.3
# requests
virtualenv==20.27.1
# via pre-commit
-wheel==0.44.0
+wheel==0.45.0
# via pip-tools
# The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/requirements-help.txt b/requirements/requirements-help.txt
index cbaa2e0a1..5795c843b 100644
--- a/requirements/requirements-help.txt
+++ b/requirements/requirements-help.txt
@@ -9,7 +9,7 @@ aiohappyeyeballs==2.4.3
# -c requirements.txt
# -c requirements/../requirements.txt
# aiohttp
-aiohttp==3.10.10
+aiohttp==3.11.2
# via
# -c requirements.txt
# -c requirements/../requirements.txt
@@ -69,6 +69,8 @@ filelock==3.16.1
# huggingface-hub
# torch
# transformers
+filetype==1.2.0
+ # via llama-index-core
frozenlist==1.5.0
# via
# -c requirements.txt
@@ -128,7 +130,7 @@ joblib==1.4.2
# via
# nltk
# scikit-learn
-llama-index-core==0.11.21
+llama-index-core==0.11.23
# via
# -r requirements/requirements-help.in
# llama-index-embeddings-huggingface
@@ -140,7 +142,7 @@ markupsafe==3.0.2
# -c requirements/../requirements.txt
# -c requirements/requirements-dev.txt
# jinja2
-marshmallow==3.23.0
+marshmallow==3.23.1
# via dataclasses-json
mpmath==1.3.0
# via sympy
@@ -171,7 +173,7 @@ numpy==1.26.4
# scikit-learn
# scipy
# transformers
-packaging==24.1
+packaging==24.2
# via
# -c requirements.txt
# -c requirements/../requirements.txt
@@ -190,6 +192,7 @@ propcache==0.2.0
# via
# -c requirements.txt
# -c requirements/../requirements.txt
+ # aiohttp
# yarl
pydantic==2.9.2
# via
@@ -209,7 +212,7 @@ pyyaml==6.0.2
# huggingface-hub
# llama-index-core
# transformers
-regex==2024.9.11
+regex==2024.11.6
# via
# -c requirements.txt
# -c requirements/../requirements.txt
@@ -235,7 +238,7 @@ scipy==1.13.1
# -c requirements/../requirements.txt
# scikit-learn
# sentence-transformers
-sentence-transformers==3.2.1
+sentence-transformers==3.3.0
# via llama-index-embeddings-huggingface
sniffio==1.3.1
# via
@@ -265,7 +268,7 @@ tokenizers==0.19.1
# transformers
torch==2.2.2
# via sentence-transformers
-tqdm==4.66.6
+tqdm==4.67.0
# via
# -c requirements.txt
# -c requirements/../requirements.txt
From b254afa4982e9449a1479094d3f7614b367cb7fd Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Fri, 15 Nov 2024 05:33:59 -0800
Subject: [PATCH 018/407] refactor: Modify model metadata file loading to
prioritize resource file
---
aider/main.py | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/aider/main.py b/aider/main.py
index 39556c60a..9a27645bf 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -332,14 +332,16 @@ def load_dotenv_files(git_root, dotenv_fname, encoding="utf-8"):
def register_litellm_models(git_root, model_metadata_fname, io, verbose=False):
- model_metatdata_files = generate_search_path_list(
- ".aider.model.metadata.json", git_root, model_metadata_fname
- )
+ model_metatdata_files = []
# Add the resource file path
resource_metadata = importlib_resources.files("aider.resources").joinpath("model-metadata.json")
model_metatdata_files.append(str(resource_metadata))
+ model_metatdata_files += generate_search_path_list(
+ ".aider.model.metadata.json", git_root, model_metadata_fname
+ )
+
try:
model_metadata_files_loaded = models.register_litellm_models(model_metatdata_files)
if len(model_metadata_files_loaded) > 0 and verbose:
From d4d5d15e183ad97d8753ccf31a815bc57f38297d Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Fri, 15 Nov 2024 06:14:15 -0800
Subject: [PATCH 019/407] fix: Handle missing litellm_provider in fuzzy model
matching
---
aider/models.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index 57d5599c6..a5ea14320 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -1167,7 +1167,10 @@ def fuzzy_match_models(name):
model = model.lower()
if attrs.get("mode") != "chat":
continue
- provider = (attrs["litellm_provider"] + "/").lower()
+ provider = attrs.get("litellm_provider", "").lower()
+ if not provider:
+ continue
+ provider += "/"
if model.startswith(provider):
fq_model = model
From c127f8f2f062fd5dbb413f2d67446eb0f2064bdf Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Fri, 15 Nov 2024 07:37:14 -0800
Subject: [PATCH 020/407] chore: Update HISTORY.md with v0.63.1 and v0.63.2
release notes
---
HISTORY.md | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/HISTORY.md b/HISTORY.md
index bbbf1b826..11ec57c23 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,6 +1,20 @@
# Release history
+### Aider v0.63.2
+
+- Fixed bug in fuzzy model name matching when litellm provider info is missing.
+- Modified model metadata file loading to prioritize resource file.
+- Updated dependency versions.
+- Aider wrote 55% of the code in this release.
+
+### Aider v0.63.1
+
+- Fixed bug in git ignored file handling.
+- Improved error handling for git operations.
+- Updated test paths in documentation.
+- Aider wrote 55% of the code in this release.
+
### Aider v0.63.0
- Support for Qwen 2.5 Coder 32B.
From 0bf17a48f72de15d9af9a50a2b5c73bb7a6501d4 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Fri, 15 Nov 2024 07:42:17 -0800
Subject: [PATCH 021/407] copy
---
HISTORY.md | 10 +-
aider/website/HISTORY.md | 12 +
aider/website/assets/sample-analytics.jsonl | 306 ++++++++++----------
3 files changed, 169 insertions(+), 159 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index 11ec57c23..8d6c42eeb 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,19 +1,17 @@
# Release history
-### Aider v0.63.2
+### main branch
- Fixed bug in fuzzy model name matching when litellm provider info is missing.
-- Modified model metadata file loading to prioritize resource file.
-- Updated dependency versions.
-- Aider wrote 55% of the code in this release.
+- Modified model metadata file loading to allow override of resource file.
+- Allow recursive loading of dirs using `--read`.
+- Updated dependency versions to pick up litellm fix for ollama models.
### Aider v0.63.1
- Fixed bug in git ignored file handling.
- Improved error handling for git operations.
-- Updated test paths in documentation.
-- Aider wrote 55% of the code in this release.
### Aider v0.63.0
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index b7f80fdb4..e87e9106f 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -23,6 +23,18 @@ cog.out(text)
+### main branch
+
+- Fixed bug in fuzzy model name matching when litellm provider info is missing.
+- Modified model metadata file loading to allow override of resource file.
+- Allow recursive loading of dirs using `--read`.
+- Updated dependency versions to pick up litellm fix for ollama models.
+
+### Aider v0.63.1
+
+- Fixed bug in git ignored file handling.
+- Improved error handling for git operations.
+
### Aider v0.63.0
- Support for Qwen 2.5 Coder 32B.
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index fb23cf33b..ae00d0056 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,156 +1,3 @@
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560039}
-{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "prompt_tokens": 638, "completion_tokens": 25, "total_tokens": 663, "cost": 0.0001107, "total_cost": 0.0001107, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560043}
-{"event": "command_exit", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560044}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560239}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560239}
-{"event": "command_add", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560263}
-{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20240620", "prompt_tokens": 15025, "completion_tokens": 462, "total_tokens": 15487, "cost": 0.052005, "total_cost": 0.052005, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560308}
-{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20240620", "prompt_tokens": 16242, "completion_tokens": 269, "total_tokens": 16511, "cost": 0.052761, "total_cost": 0.104766, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560334}
-{"event": "command_exit", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560339}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560733}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560733}
-{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "prompt_tokens": 638, "completion_tokens": 25, "total_tokens": 663, "cost": 0.0001107, "total_cost": 0.0001107, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560737}
-{"event": "command_exit", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "52b5cc12-f16d-45f3-b30c-95ab4ae904ee", "time": 1723560765}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723560805}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723560805}
-{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "prompt_tokens": 638, "completion_tokens": 25, "total_tokens": 663, "cost": 0.0001107, "total_cost": 0.0001107, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723560812}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "8f9e4550-33c4-4417-b152-e35ace897f13", "time": 1723560903}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "8f9e4550-33c4-4417-b152-e35ace897f13", "time": 1723560903}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "bc3e1ea0-29a7-43ef-85fd-94694f8acebb", "time": 1723560920}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "bc3e1ea0-29a7-43ef-85fd-94694f8acebb", "time": 1723560920}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723560994}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723560994}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561016}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561017}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561046}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561046}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561049}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561049}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "6547b0bb-4248-4d40-8269-dc59e9624e0f", "time": 1723561234}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "6547b0bb-4248-4d40-8269-dc59e9624e0f", "time": 1723561235}
-{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "prompt_tokens": 638, "completion_tokens": 25, "total_tokens": 663, "cost": 0.0001107, "total_cost": 0.0001107, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": "6547b0bb-4248-4d40-8269-dc59e9624e0f", "time": 1723561241}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561304}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561304}
-{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "prompt_tokens": 638, "completion_tokens": 25, "total_tokens": 663, "cost": 0.0001107, "total_cost": 0.0001107, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561307}
-{"event": "command_exit", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561665}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561679}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561841}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561841}
-{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20240620", "prompt_tokens": 12148, "completion_tokens": 269, "total_tokens": 12417, "cost": 0.040479, "total_cost": 0.040479, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561858}
-{"event": "command_undo", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723561925}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723568624}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723568624}
-{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20240620", "prompt_tokens": 14217, "completion_tokens": 217, "total_tokens": 14434, "cost": 0.045906, "total_cost": 0.045906, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.49.2-dev"}, "user_id": null, "time": 1723568667}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev"}, "user_id": null, "time": 1723579444}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev"}, "user_id": null, "time": 1723579445}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev"}, "user_id": null, "time": 1723579738}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev"}, "user_id": null, "time": 1723579738}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723579757}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723579757}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723579779}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723579940}
-{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723579940}
-{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 638, "completion_tokens": 25, "total_tokens": 663, "cost": 0.0001107, "total_cost": 0.0001107, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723579944}
-{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 673, "completion_tokens": 28, "total_tokens": 701, "cost": 0.00011775, "total_cost": 0.00022845, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723579948}
-{"event": "command_exit", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723579952}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723584128}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723584128}
-{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20240620", "edit_format": "diff", "prompt_tokens": 3461, "completion_tokens": 289, "total_tokens": 3750, "cost": 0.014718, "total_cost": 0.014718, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723584158}
-{"event": "command_diff", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723584162}
-{"event": "command_exit", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723584173}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723593477}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723593477}
-{"event": "command_chat-mode", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723593516}
-{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20240620", "edit_format": "ask", "prompt_tokens": 9262, "completion_tokens": 223, "total_tokens": 9485, "cost": 0.031131000000000002, "total_cost": 0.031131000000000002, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723593580}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723593593}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723593593}
-{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20240620", "edit_format": "ask", "prompt_tokens": 2054, "completion_tokens": 370, "total_tokens": 2424, "cost": 0.011712, "total_cost": 0.011712, "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.1-dev", "$lib": "posthog-python", "$lib_version": "3.5.0", "$geoip_disable": true}, "user_id": "5218a941-50b3-405f-9f75-1bf42b282b6b", "time": 1723593607}
-{"event": "launched", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.2-dev"}, "user_id": "cbbee83e-62da-4629-9a3c-04d37a26f7a7", "time": 1723832819}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20240620", "python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.2-dev"}, "user_id": "cbbee83e-62da-4629-9a3c-04d37a26f7a7", "time": 1723832821}
-{"event": "command_exit", "properties": {"python_version": "3.12.4", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.50.2-dev"}, "user_id": "cbbee83e-62da-4629-9a3c-04d37a26f7a7", "time": 1723832823}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316502}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316502}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316583}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316586}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316586}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316589}
-{"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": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316644}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316645}
-{"event": "command_settings", "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": "1f30456a-1f79-4f19-9720-fb0b8a304b0a", "time": 1730316661}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317188}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317189}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317192}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317294}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317294}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317302}
-{"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": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317724}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317725}
-{"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": "3645b476-b3d5-46d6-aa89-864bf75dfb5b", "time": 1730317726}
-{"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": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317730}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317730}
-{"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": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317731}
-{"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": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317749}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317749}
-{"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": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317751}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317753}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317753}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730317754}
-{"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": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730318254}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "092dd9f6-5445-42cd-b90c-a9e456b37a74", "time": 1730318254}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318258}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318259}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318260}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318328}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.60.2.dev13+g9e7995b7", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318328}
-{"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", "$lib": "posthog-python", "$lib_version": "3.7.0", "$geoip_disable": true}, "user_id": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318331}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318336}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318337}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318367}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318367}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318371}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318373}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318373}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318398}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318398}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318403}
-{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318404}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318407}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318451}
-{"event": "cli session", "properties": {"main_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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318451}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730318455}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730319350}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730319838}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730319839}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323755}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323810}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323820}
-{"event": "cli session", "properties": {"main_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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323821}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323824}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323831}
-{"event": "cli session", "properties": {"main_model": "some/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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323851}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323974}
-{"event": "model warning", "properties": {"main_model": "some/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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323975}
-{"event": "cli session", "properties": {"main_model": "some/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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730323985}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730324000}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730324063}
-{"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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730337491}
-{"event": "cli session", "properties": {"main_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": "5e16241e-8c66-479e-9954-1fbee80560a3", "time": 1730337491}
-{"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": "cd4d7b34-79ca-4ffe-9fba-7557dbeb8a88", "time": 1730394556}
-{"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": "cd4d7b34-79ca-4ffe-9fba-7557dbeb8a88", "time": 1730394556}
-{"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": "cd4d7b34-79ca-4ffe-9fba-7557dbeb8a88", "time": 1730394558}
-{"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": 1730400360}
-{"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}
@@ -998,3 +845,156 @@
{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731533483}
{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731533488}
{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731533491}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731533590}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731533590}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.0"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731533800}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.0"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731533801}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731534026}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731534286}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731534286}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731538829}
+{"event": "message_send", "properties": {"main_model": "gpt-4o-2024-08-06", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o-2024-08-06", "edit_format": "diff", "prompt_tokens": 2288, "completion_tokens": 12, "total_tokens": 2300, "cost": 0.005840000000000001, "total_cost": 0.005840000000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731538833}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731538842}
+{"event": "message_send", "properties": {"main_model": "gpt-4o-2024-08-06", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o-2024-08-06", "edit_format": "diff", "prompt_tokens": 2288, "completion_tokens": 12, "total_tokens": 2300, "cost": 0.005840000000000001, "total_cost": 0.005840000000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731538845}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731538883}
+{"event": "message_send", "properties": {"main_model": "gpt-4o-2024-08-06", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o-2024-08-06", "edit_format": "diff", "prompt_tokens": 2288, "completion_tokens": 34, "total_tokens": 2322, "cost": 0.00606, "total_cost": 0.00606, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731538887}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543603}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543661}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543662}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543783}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543784}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543787}
+{"event": "command_ask", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543808}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 3462, "completion_tokens": 184, "total_tokens": 3646, "cost": 0.013146, "total_cost": 0.013146, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543813}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 5748, "completion_tokens": 93, "total_tokens": 5841, "cost": 0.018639, "total_cost": 0.031785, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543828}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543916}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731543916}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731595683}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731595685}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731595699}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 6345, "completion_tokens": 165, "total_tokens": 6510, "cost": 0.02151, "total_cost": 0.02151, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731595711}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731596065}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731596065}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731596179}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731596180}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611485}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611487}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611501}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611503}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611507}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611562}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611564}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611573}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611575}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611582}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611584}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611626}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611628}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611667}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611668}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611706}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-1.5-flash-8b-exp-0827", "weak_model": "gemini/gemini-1.5-flash-8b-exp-0827", "editor_model": "gemini/gemini-1.5-flash-8b-exp-0827", "edit_format": "whole", "prompt_tokens": 594, "completion_tokens": 18, "total_tokens": 612, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611708}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-1.5-flash-8b-exp-0827", "weak_model": "gemini/gemini-1.5-flash-8b-exp-0827", "editor_model": "gemini/gemini-1.5-flash-8b-exp-0827", "edit_format": "whole", "prompt_tokens": 628, "completion_tokens": 18, "total_tokens": 646, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611709}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-1.5-flash-8b-exp-0827", "weak_model": "gemini/gemini-1.5-flash-8b-exp-0827", "editor_model": "gemini/gemini-1.5-flash-8b-exp-0827", "edit_format": "whole", "prompt_tokens": 662, "completion_tokens": 27, "total_tokens": 689, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611709}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611984}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731611986}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731616617}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731616619}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731616970}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731616973}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731620395}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731620439}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731620442}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731621334}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731621336}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731621350}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731621352}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731624550}
+{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731624552}
+{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "diff", "prompt_tokens": 4769, "completion_tokens": 48, "total_tokens": 4817, "cost": 0.00086706, "total_cost": 0.00086706, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731624556}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731624557}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731624559}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625587}
+{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "diff", "prompt_tokens": 8673, "completion_tokens": 2046, "total_tokens": 10719, "cost": 0.0019294199999999998, "total_cost": 0.0027964799999999996, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625715}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625717}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625718}
+{"event": "command_read-only", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625721}
+{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625754}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625777}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625779}
+{"event": "command_tokens", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625785}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625791}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625792}
+{"event": "command_read-only", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625796}
+{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625797}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625986}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625988}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731625994}
+{"event": "command_drop", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626182}
+{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626185}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626222}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626223}
+{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626229}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626264}
+{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626271}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626272}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9823, "completion_tokens": 203, "total_tokens": 10026, "cost": 0.032514, "total_cost": 0.054024, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626324}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626346}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626348}
+{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626349}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626419}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731626419}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731627336}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731627339}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639542}
+{"event": "model warning", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639544}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639553}
+{"event": "model warning", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639554}
+{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639562}
+{"event": "message_send", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole", "prompt_tokens": 594, "completion_tokens": 8, "total_tokens": 602, "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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639606}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639615}
+{"event": "model warning", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639617}
+{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639623}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639689}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731639698}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731641191}
+{"event": "model warning", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731641193}
+{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731641196}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731647898}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731648009}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731648011}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677431}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677431}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677485}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677535}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677567}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677610}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677621}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677634}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677746}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731677746}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731678074}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731678076}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9091, "completion_tokens": 555, "total_tokens": 9646, "cost": 0.035598000000000005, "total_cost": 0.035598000000000005, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731678118}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9902, "completion_tokens": 595, "total_tokens": 10497, "cost": 0.038631, "total_cost": 0.074229, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731678197}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731678388}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731678390}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731679897}
+{"event": "model warning", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731679899}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731680025}
+{"event": "model warning", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731680026}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731680050}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731680110}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731680111}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731680112}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731680116}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731684213}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731684215}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731684870}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731684872}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731684885}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 25812, "completion_tokens": 274, "total_tokens": 26086, "cost": 0.08154600000000001, "total_cost": 0.08154600000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731684937}
+{"event": "command_undo", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731684982}
+{"event": "command_clear", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685007}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685009}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 32268, "completion_tokens": 408, "total_tokens": 32676, "cost": 0.102924, "total_cost": 0.18447000000000002, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685032}
From 7f48f3d01dac118687727725f62ee84fe71f26a7 Mon Sep 17 00:00:00 2001
From: mw
Date: Fri, 15 Nov 2024 15:04:25 -0800
Subject: [PATCH 022/407] Added write_text exponential backoff to
Discord thread ID: 1306776889762906123
Resolve issue where Aider fails to write multiple, consecutive changes to a single file due to Visual Studio briefly locking a file for writing after it was edited. Presumably VS is doing some sort of processing, such as for IntelliSense, behind the scenes. This solution is applicable to other, similar editor/IDE behaviors.
---
aider/io.py | 29 +++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/aider/io.py b/aider/io.py
index 193b44599..0aaa9583b 100644
--- a/aider/io.py
+++ b/aider/io.py
@@ -333,14 +333,31 @@ class InputOutput:
self.tool_error("Use --encoding to set the unicode encoding.")
return
- def write_text(self, filename, content):
+ def write_text(self, filename, content, max_retries=5, initial_delay=0.1):
+ """
+ Writes content to a file, retrying with progressive backoff if the file is locked.
+
+ :param filename: Path to the file to write.
+ :param content: Content to write to the file.
+ :param max_retries: Maximum number of retries if a file lock is encountered.
+ :param initial_delay: Initial delay (in seconds) before the first retry.
+ """
if self.dry_run:
return
- try:
- with open(str(filename), "w", encoding=self.encoding) as f:
- f.write(content)
- except OSError as err:
- self.tool_error(f"Unable to write file {filename}: {err}")
+
+ delay = initial_delay
+ for attempt in range(max_retries):
+ try:
+ with open(str(filename), "w", encoding=self.encoding) as f:
+ f.write(content)
+ return # Successfully wrote the file
+ except OSError as err:
+ if attempt < max_retries - 1:
+ time.sleep(delay)
+ delay *= 2 # Exponential backoff
+ else:
+ self.tool_error(f"Unable to write file {filename} after {max_retries} attempts: {err}")
+ raise
def rule(self):
if self.pretty:
From f7de2234f2111efb9a03ce5aafc29ee2d5372b30 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Fri, 15 Nov 2024 16:23:21 -0800
Subject: [PATCH 023/407] fix: Handle different OSError types in write_text
method
---
aider/io.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/aider/io.py b/aider/io.py
index 0aaa9583b..0d7dd0dd4 100644
--- a/aider/io.py
+++ b/aider/io.py
@@ -351,13 +351,16 @@ class InputOutput:
with open(str(filename), "w", encoding=self.encoding) as f:
f.write(content)
return # Successfully wrote the file
- except OSError as err:
+ except PermissionError as err:
if attempt < max_retries - 1:
time.sleep(delay)
delay *= 2 # Exponential backoff
else:
self.tool_error(f"Unable to write file {filename} after {max_retries} attempts: {err}")
raise
+ except OSError as err:
+ self.tool_error(f"Unable to write file {filename}: {err}")
+ raise
def rule(self):
if self.pretty:
From 76c7c2562cd3fa0c66925243bd15df2a72dd8db4 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Fri, 15 Nov 2024 16:23:26 -0800
Subject: [PATCH 024/407] style: Format code with linter for improved
readability
---
aider/io.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/aider/io.py b/aider/io.py
index 0d7dd0dd4..b20496b27 100644
--- a/aider/io.py
+++ b/aider/io.py
@@ -356,7 +356,9 @@ class InputOutput:
time.sleep(delay)
delay *= 2 # Exponential backoff
else:
- self.tool_error(f"Unable to write file {filename} after {max_retries} attempts: {err}")
+ self.tool_error(
+ f"Unable to write file {filename} after {max_retries} attempts: {err}"
+ )
raise
except OSError as err:
self.tool_error(f"Unable to write file {filename}: {err}")
From bdafa842bdd6ce2922177c49deb7f1388495e6cc Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Fri, 15 Nov 2024 16:23:37 -0800
Subject: [PATCH 025/407] fix: Add missing time import for time.sleep() in
write_text method
---
aider/io.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/io.py b/aider/io.py
index b20496b27..db59bec47 100644
--- a/aider/io.py
+++ b/aider/io.py
@@ -1,5 +1,6 @@
import base64
import os
+import time
import webbrowser
from collections import defaultdict
from dataclasses import dataclass
From ee0987f33149464f9e11b7bd7d15f35924279469 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 06:57:04 -0800
Subject: [PATCH 026/407] feat: Update HISTORY.md with recent changes since
v0.63.1
---
HISTORY.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/HISTORY.md b/HISTORY.md
index 8d6c42eeb..b864b3134 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -7,6 +7,10 @@
- Modified model metadata file loading to allow override of resource file.
- Allow recursive loading of dirs using `--read`.
- Updated dependency versions to pick up litellm fix for ollama models.
+- Added exponential backoff retry when writing files to handle editor file locks.
+- Fixed bug in git ignored file handling.
+- Improved error handling for file writes and git operations.
+- Updated Qwen 2.5 Coder 32B model configuration.
### Aider v0.63.1
From eae3f04c830a2390adf4531682c1b04f3a5cf9a1 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 06:57:35 -0800
Subject: [PATCH 027/407] copy
---
HISTORY.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index b864b3134..e9ebb908f 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -8,8 +8,6 @@
- Allow recursive loading of dirs using `--read`.
- Updated dependency versions to pick up litellm fix for ollama models.
- Added exponential backoff retry when writing files to handle editor file locks.
-- Fixed bug in git ignored file handling.
-- Improved error handling for file writes and git operations.
- Updated Qwen 2.5 Coder 32B model configuration.
### Aider v0.63.1
From 569370109abc134a46641371c08e85abd54db020 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 07:11:46 -0800
Subject: [PATCH 028/407] copy
---
aider/website/HISTORY.md | 2 +
aider/website/assets/sample-analytics.jsonl | 92 ++++++++++-----------
2 files changed, 48 insertions(+), 46 deletions(-)
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index e87e9106f..44f8da599 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -29,6 +29,8 @@ cog.out(text)
- Modified model metadata file loading to allow override of resource file.
- Allow recursive loading of dirs using `--read`.
- Updated dependency versions to pick up litellm fix for ollama models.
+- Added exponential backoff retry when writing files to handle editor file locks.
+- Updated Qwen 2.5 Coder 32B model configuration.
### Aider v0.63.1
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index ae00d0056..37deaed69 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,49 +1,3 @@
-{"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}
@@ -998,3 +952,49 @@
{"event": "command_clear", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685007}
{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685009}
{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 32268, "completion_tokens": 408, "total_tokens": 32676, "cost": 0.102924, "total_cost": 0.18447000000000002, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685032}
+{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685344}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685350}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685394}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685440}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685442}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685479}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685479}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685812}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731685814}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731686099}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731686101}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731686115}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731686144}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731686146}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731686197}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731690839}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731690841}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731695537}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 0, "total_tokens": 407, "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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731695539}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731706837}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 10, "total_tokens": 417, "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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731706845}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716555}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716557}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716560}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 8857, "completion_tokens": 331, "total_tokens": 9188, "cost": 0.031536, "total_cost": 0.031536, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716599}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9983, "completion_tokens": 103, "total_tokens": 10086, "cost": 0.031494, "total_cost": 0.06303, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716615}
+{"event": "command_ask", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716633}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 7943, "completion_tokens": 206, "total_tokens": 8149, "cost": 0.026919, "total_cost": 0.089949, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716638}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716702}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731716703}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941651}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941653}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941660}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 10465, "completion_tokens": 246, "total_tokens": 10711, "cost": 0.035085, "total_cost": 0.035085, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941710}
+{"event": "command_undo", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941775}
+{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941781}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941788}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941790}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14575, "completion_tokens": 0, "total_tokens": 14575, "cost": 0.043725, "total_cost": 0.043725, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941794}
+{"event": "command_clear", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941797}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941798}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19682, "completion_tokens": 0, "total_tokens": 19682, "cost": 0.059046, "total_cost": 0.102771, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941801}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941803}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941805}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941806}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19577, "completion_tokens": 394, "total_tokens": 19971, "cost": 0.064641, "total_cost": 0.064641, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941822}
From d7a195706f0dbbe75a3459be4281d58c8087e26b Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 07:29:05 -0800
Subject: [PATCH 029/407] version bump to 0.63.2
---
aider/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/__init__.py b/aider/__init__.py
index a10d8afc7..90dd6fd3c 100644
--- a/aider/__init__.py
+++ b/aider/__init__.py
@@ -1,6 +1,6 @@
try:
from aider.__version__ import __version__
except Exception:
- __version__ = "0.63.2.dev"
+ __version__ = "0.63.2"
__all__ = [__version__]
From abf804cf10fad5192d33d7d0bc4df2e64edaddaa Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 07:30:21 -0800
Subject: [PATCH 030/407] set version to 0.63.3.dev
---
aider/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/__init__.py b/aider/__init__.py
index 90dd6fd3c..23925b316 100644
--- a/aider/__init__.py
+++ b/aider/__init__.py
@@ -1,6 +1,6 @@
try:
from aider.__version__ import __version__
except Exception:
- __version__ = "0.63.2"
+ __version__ = "0.63.3.dev"
__all__ = [__version__]
From 1f8fdc6f5c3e407505877a9f06d28e312b44281e Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 07:44:48 -0800
Subject: [PATCH 031/407] refactor: Update issue script comments and add bot
suffix
---
scripts/issues.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/scripts/issues.py b/scripts/issues.py
index 70ded8caf..999f5d0d9 100755
--- a/scripts/issues.py
+++ b/scripts/issues.py
@@ -22,13 +22,15 @@ def has_been_reopened(issue_number):
# Load environment variables from .env file
load_dotenv()
+BOT_SUFFIX = "\n\nNote: A [bot script](https://github.com/Aider-AI/aider/blob/main/scripts/issues.py) made these updates to the issue."
+
DUPLICATE_COMMENT = """Thanks for trying aider and filing this issue.
This looks like a duplicate of #{oldest_issue_number}. Please see the comments there for more information, and feel free to continue the discussion within that issue.
I'm going to close this issue for now. But please let me know if you think this is actually a distinct issue and I will reopen this issue.""" # noqa
-STALE_COMMENT = """I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, it will be closed in 7 days.""" # noqa
+STALE_COMMENT = """I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, I will close it in 7 days.""" # noqa
CLOSE_STALE_COMMENT = """I'm closing this issue because it has been stalled for 3 weeks with no activity. Feel free to add a comment here and we can re-open it. Or feel free to file a new issue at any time.""" # noqa
From 4613bf78d568b7fa935c1aaab99408a9951b5d28 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 07:44:50 -0800
Subject: [PATCH 032/407] feat: Add BOT_SUFFIX to issue comment templates
---
scripts/issues.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/scripts/issues.py b/scripts/issues.py
index 999f5d0d9..884360fd1 100755
--- a/scripts/issues.py
+++ b/scripts/issues.py
@@ -28,11 +28,11 @@ DUPLICATE_COMMENT = """Thanks for trying aider and filing this issue.
This looks like a duplicate of #{oldest_issue_number}. Please see the comments there for more information, and feel free to continue the discussion within that issue.
-I'm going to close this issue for now. But please let me know if you think this is actually a distinct issue and I will reopen this issue.""" # noqa
+I'm going to close this issue for now. But please let me know if you think this is actually a distinct issue and I will reopen this issue.""" + BOT_SUFFIX # noqa
-STALE_COMMENT = """I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, I will close it in 7 days.""" # noqa
+STALE_COMMENT = """I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, I will close it in 7 days.""" + BOT_SUFFIX # noqa
-CLOSE_STALE_COMMENT = """I'm closing this issue because it has been stalled for 3 weeks with no activity. Feel free to add a comment here and we can re-open it. Or feel free to file a new issue at any time.""" # noqa
+CLOSE_STALE_COMMENT = """I'm closing this issue because it has been stalled for 3 weeks with no activity. Feel free to add a comment here and we can re-open it. Or feel free to file a new issue at any time.""" + BOT_SUFFIX # noqa
# GitHub API configuration
GITHUB_API_URL = "https://api.github.com"
From 6d26051d1125919ba4c3cb0a1a60b1cd3eaf1383 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 07:44:54 -0800
Subject: [PATCH 033/407] style: Reformat long string literals using
parentheses
---
scripts/issues.py | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/scripts/issues.py b/scripts/issues.py
index 884360fd1..dc277e5b2 100755
--- a/scripts/issues.py
+++ b/scripts/issues.py
@@ -22,17 +22,29 @@ def has_been_reopened(issue_number):
# Load environment variables from .env file
load_dotenv()
-BOT_SUFFIX = "\n\nNote: A [bot script](https://github.com/Aider-AI/aider/blob/main/scripts/issues.py) made these updates to the issue."
+BOT_SUFFIX = (
+ "\n\nNote: A [bot script](https://github.com/Aider-AI/aider/blob/main/scripts/issues.py) made"
+ " these updates to the issue."
+)
-DUPLICATE_COMMENT = """Thanks for trying aider and filing this issue.
+DUPLICATE_COMMENT = (
+ """Thanks for trying aider and filing this issue.
This looks like a duplicate of #{oldest_issue_number}. Please see the comments there for more information, and feel free to continue the discussion within that issue.
-I'm going to close this issue for now. But please let me know if you think this is actually a distinct issue and I will reopen this issue.""" + BOT_SUFFIX # noqa
+I'm going to close this issue for now. But please let me know if you think this is actually a distinct issue and I will reopen this issue."""
+ + BOT_SUFFIX
+) # noqa
-STALE_COMMENT = """I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, I will close it in 7 days.""" + BOT_SUFFIX # noqa
+STALE_COMMENT = (
+ """I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, I will close it in 7 days."""
+ + BOT_SUFFIX
+) # noqa
-CLOSE_STALE_COMMENT = """I'm closing this issue because it has been stalled for 3 weeks with no activity. Feel free to add a comment here and we can re-open it. Or feel free to file a new issue at any time.""" + BOT_SUFFIX # noqa
+CLOSE_STALE_COMMENT = (
+ """I'm closing this issue because it has been stalled for 3 weeks with no activity. Feel free to add a comment here and we can re-open it. Or feel free to file a new issue at any time."""
+ + BOT_SUFFIX
+) # noqa
# GitHub API configuration
GITHUB_API_URL = "https://api.github.com"
From 201abe152445ffc14233c5ae92bee6eabe93b86e Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 07:46:00 -0800
Subject: [PATCH 034/407] refactor: Improve code formatting and add noqa
comment in issues.py script
---
scripts/issues.py | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/scripts/issues.py b/scripts/issues.py
index dc277e5b2..9251d9ccf 100755
--- a/scripts/issues.py
+++ b/scripts/issues.py
@@ -23,8 +23,9 @@ def has_been_reopened(issue_number):
load_dotenv()
BOT_SUFFIX = (
- "\n\nNote: A [bot script](https://github.com/Aider-AI/aider/blob/main/scripts/issues.py) made"
- " these updates to the issue."
+ """
+Note: A [bot script](https://github.com/Aider-AI/aider/blob/main/scripts/issues.py) made these updates to the issue.
+""" # noqa
)
DUPLICATE_COMMENT = (
@@ -293,7 +294,9 @@ def handle_stale_closing(all_issues, auto_yes):
continue
# Add closing comment
- comment_url = f"{GITHUB_API_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}/comments"
+ comment_url = (
+ f"{GITHUB_API_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}/comments"
+ )
response = requests.post(
comment_url, headers=headers, json={"body": CLOSE_STALE_COMMENT}
)
From 5295abbb833edb06dd7794eaedbdd6c28cb5081d Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 07:46:23 -0800
Subject: [PATCH 035/407] style: Move #noqa comments to triple-quoted strings
in issues.py
---
scripts/issues.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/scripts/issues.py b/scripts/issues.py
index 9251d9ccf..a03696f9b 100755
--- a/scripts/issues.py
+++ b/scripts/issues.py
@@ -38,14 +38,14 @@ I'm going to close this issue for now. But please let me know if you think this
) # noqa
STALE_COMMENT = (
- """I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, I will close it in 7 days."""
+ """I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, I will close it in 7 days.""" # noqa
+ BOT_SUFFIX
-) # noqa
+)
CLOSE_STALE_COMMENT = (
- """I'm closing this issue because it has been stalled for 3 weeks with no activity. Feel free to add a comment here and we can re-open it. Or feel free to file a new issue at any time."""
+ """I'm closing this issue because it has been stalled for 3 weeks with no activity. Feel free to add a comment here and we can re-open it. Or feel free to file a new issue at any time.""" # noqa
+ BOT_SUFFIX
-) # noqa
+)
# GitHub API configuration
GITHUB_API_URL = "https://api.github.com"
From 5f40aaabb5e27262f2869c5b8d5f9a9ea0bafdf7 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 07:46:28 -0800
Subject: [PATCH 036/407] style: Lint and clean up code formatting in issues.py
script
---
scripts/issues.py | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/scripts/issues.py b/scripts/issues.py
index a03696f9b..35685985a 100755
--- a/scripts/issues.py
+++ b/scripts/issues.py
@@ -22,11 +22,9 @@ def has_been_reopened(issue_number):
# Load environment variables from .env file
load_dotenv()
-BOT_SUFFIX = (
- """
+BOT_SUFFIX = """
Note: A [bot script](https://github.com/Aider-AI/aider/blob/main/scripts/issues.py) made these updates to the issue.
-""" # noqa
-)
+""" # noqa
DUPLICATE_COMMENT = (
"""Thanks for trying aider and filing this issue.
@@ -294,9 +292,7 @@ def handle_stale_closing(all_issues, auto_yes):
continue
# Add closing comment
- comment_url = (
- f"{GITHUB_API_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}/comments"
- )
+ comment_url = f"{GITHUB_API_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}/comments"
response = requests.post(
comment_url, headers=headers, json={"body": CLOSE_STALE_COMMENT}
)
From 8adf42216d2b0fb9f9e53562eaf1ed1f274e70cc Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 07:47:30 -0800
Subject: [PATCH 037/407] copy
---
scripts/issues.py | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/scripts/issues.py b/scripts/issues.py
index 35685985a..721178fa9 100755
--- a/scripts/issues.py
+++ b/scripts/issues.py
@@ -22,8 +22,7 @@ def has_been_reopened(issue_number):
# Load environment variables from .env file
load_dotenv()
-BOT_SUFFIX = """
-Note: A [bot script](https://github.com/Aider-AI/aider/blob/main/scripts/issues.py) made these updates to the issue.
+BOT_SUFFIX = """Note: A [bot script](https://github.com/Aider-AI/aider/blob/main/scripts/issues.py) made these updates to the issue.
""" # noqa
DUPLICATE_COMMENT = (
@@ -31,9 +30,9 @@ DUPLICATE_COMMENT = (
This looks like a duplicate of #{oldest_issue_number}. Please see the comments there for more information, and feel free to continue the discussion within that issue.
-I'm going to close this issue for now. But please let me know if you think this is actually a distinct issue and I will reopen this issue."""
+I'm going to close this issue for now. But please let me know if you think this is actually a distinct issue and I will reopen this issue.""" # noqa
+ BOT_SUFFIX
-) # noqa
+)
STALE_COMMENT = (
"""I'm labeling this issue as stale because it has been open for 2 weeks with no activity. If there are no additional comments, I will close it in 7 days.""" # noqa
@@ -292,7 +291,7 @@ def handle_stale_closing(all_issues, auto_yes):
continue
# Add closing comment
- comment_url = f"{GITHUB_API_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}/comments"
+ comment_url = f"{GITHUB_API_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}/comments" # noqa
response = requests.post(
comment_url, headers=headers, json={"body": CLOSE_STALE_COMMENT}
)
From 4bd7bce232cd4d507672c2ead348c4d91f5d9bfe Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 13:22:55 -0800
Subject: [PATCH 038/407] docs: Add example of using .aiderignore to focus on
specific directories in monorepo
---
aider/website/docs/faq.md | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index 9c14e5f21..868af6b19 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -60,6 +60,23 @@ directory you start in.
You can also create a `.aiderignore` file to tell aider
to ignore parts of the repo that aren't relevant to your task.
This file conforms to `.gitignore` syntax and conventions.
+For example, to focus only on specific directories in a monorepo,
+you could create a `.aiderignore` file with:
+
+```
+# Ignore everything
+/*
+
+# Allow specific directories and their contents
+!foo/
+!bar/
+!baz/
+
+# Allow nested files under these directories
+!foo/**
+!bar/**
+!baz/**
+```
You can use `--aiderignore ` to name a specific file
to use for ignore patterns.
From a20ea09a6e65ac379b90e0f29f81ffa8bfb4d8ad Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 13:28:14 -0800
Subject: [PATCH 039/407] refactor: Remove redundant `streaming=False` from
model settings
---
aider/models.py | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index a5ea14320..2856c7707 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -629,7 +629,6 @@ MODEL_SETTINGS = [
reminder="user",
use_system_prompt=False,
use_temperature=False,
- streaming=False,
),
ModelSettings(
"azure/o1-mini",
@@ -641,7 +640,6 @@ MODEL_SETTINGS = [
reminder="user",
use_system_prompt=False,
use_temperature=False,
- streaming=False,
),
ModelSettings(
"o1-mini",
@@ -653,7 +651,6 @@ MODEL_SETTINGS = [
reminder="user",
use_system_prompt=False,
use_temperature=False,
- streaming=False,
),
ModelSettings(
"openai/o1-preview",
@@ -665,7 +662,6 @@ MODEL_SETTINGS = [
reminder="user",
use_system_prompt=False,
use_temperature=False,
- streaming=False,
),
ModelSettings(
"azure/o1-preview",
@@ -677,7 +673,6 @@ MODEL_SETTINGS = [
reminder="user",
use_system_prompt=False,
use_temperature=False,
- streaming=False,
),
ModelSettings(
"o1-preview",
@@ -689,7 +684,6 @@ MODEL_SETTINGS = [
reminder="user",
use_system_prompt=False,
use_temperature=False,
- streaming=False,
),
ModelSettings(
"openrouter/openai/o1-mini",
@@ -701,7 +695,6 @@ MODEL_SETTINGS = [
reminder="user",
use_system_prompt=False,
use_temperature=False,
- streaming=False,
),
ModelSettings(
"openrouter/openai/o1-preview",
@@ -713,7 +706,6 @@ MODEL_SETTINGS = [
reminder="user",
use_system_prompt=False,
use_temperature=False,
- streaming=False,
),
ModelSettings(
"openrouter/qwen/qwen-2.5-coder-32b-instruct",
@@ -878,7 +870,6 @@ class Model(ModelSettings):
if model.startswith("o1-") or "/o1-" in model:
self.use_system_prompt = False
self.use_temperature = False
- self.streaming = False
if (
"qwen" in model
From 72734de3766ac010f0c81eadb0df291bdfe8e13b Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 13:28:47 -0800
Subject: [PATCH 040/407] copy
---
aider/website/assets/sample-analytics.jsonl | 64 +++++++++----------
.../website/docs/config/adv-model-settings.md | 16 ++---
2 files changed, 40 insertions(+), 40 deletions(-)
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 37deaed69..a389267b2 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,35 +1,3 @@
-{"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}
@@ -998,3 +966,35 @@
{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941805}
{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941806}
{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19577, "completion_tokens": 394, "total_tokens": 19971, "cost": 0.064641, "total_cost": 0.064641, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731941822}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731942762}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731942762}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731943799}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.2.dev9+g38a5405c.d20241115"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731943799}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944609}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944611}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944614}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 6551, "completion_tokens": 436, "total_tokens": 6987, "cost": 0.026193, "total_cost": 0.026193, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944687}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 8345, "completion_tokens": 402, "total_tokens": 8747, "cost": 0.031065000000000002, "total_cost": 0.057258, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944708}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 8769, "completion_tokens": 358, "total_tokens": 9127, "cost": 0.031677, "total_cost": 0.088935, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944758}
+{"event": "command_clear", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944764}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 8350, "completion_tokens": 282, "total_tokens": 8632, "cost": 0.02928, "total_cost": 0.118215, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944781}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944931}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731944932}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963466}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963468}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963471}
+{"event": "command_ask", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963501}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 1825, "completion_tokens": 930, "total_tokens": 2755, "cost": 0.019425, "total_cost": 0.019425, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963528}
+{"event": "command_ask", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963615}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 2855, "completion_tokens": 407, "total_tokens": 3262, "cost": 0.014669999999999999, "total_cost": 0.034095, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963624}
+{"event": "command_ask", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963692}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 3282, "completion_tokens": 553, "total_tokens": 3835, "cost": 0.018141, "total_cost": 0.052236000000000005, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963705}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 5983, "completion_tokens": 1033, "total_tokens": 7016, "cost": 0.033444, "total_cost": 0.08568, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963755}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963947}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731963950}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731964943}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 5595, "completion_tokens": 0, "total_tokens": 5595, "cost": 0.016785, "total_cost": 0.016785, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731964967}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 5645, "completion_tokens": 278, "total_tokens": 5923, "cost": 0.021105000000000002, "total_cost": 0.03789000000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731964974}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731965068}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731965069}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731965289}
diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md
index 0f4fe386c..3ebf763ee 100644
--- a/aider/website/docs/config/adv-model-settings.md
+++ b/aider/website/docs/config/adv-model-settings.md
@@ -1057,7 +1057,7 @@ cog.out("```\n")
name: openai/o1-mini
reminder: user
send_undo_reply: false
- streaming: false
+ streaming: true
use_repo_map: true
use_system_prompt: false
use_temperature: false
@@ -1073,7 +1073,7 @@ cog.out("```\n")
name: azure/o1-mini
reminder: user
send_undo_reply: false
- streaming: false
+ streaming: true
use_repo_map: true
use_system_prompt: false
use_temperature: false
@@ -1089,7 +1089,7 @@ cog.out("```\n")
name: o1-mini
reminder: user
send_undo_reply: false
- streaming: false
+ streaming: true
use_repo_map: true
use_system_prompt: false
use_temperature: false
@@ -1105,7 +1105,7 @@ cog.out("```\n")
name: openai/o1-preview
reminder: user
send_undo_reply: false
- streaming: false
+ streaming: true
use_repo_map: true
use_system_prompt: false
use_temperature: false
@@ -1121,7 +1121,7 @@ cog.out("```\n")
name: azure/o1-preview
reminder: user
send_undo_reply: false
- streaming: false
+ streaming: true
use_repo_map: true
use_system_prompt: false
use_temperature: false
@@ -1137,7 +1137,7 @@ cog.out("```\n")
name: o1-preview
reminder: user
send_undo_reply: false
- streaming: false
+ streaming: true
use_repo_map: true
use_system_prompt: false
use_temperature: false
@@ -1153,7 +1153,7 @@ cog.out("```\n")
name: openrouter/openai/o1-mini
reminder: user
send_undo_reply: false
- streaming: false
+ streaming: true
use_repo_map: true
use_system_prompt: false
use_temperature: false
@@ -1169,7 +1169,7 @@ cog.out("```\n")
name: openrouter/openai/o1-preview
reminder: user
send_undo_reply: false
- streaming: false
+ streaming: true
use_repo_map: true
use_system_prompt: false
use_temperature: false
From 3c9c6eef6ea1595f73253c137018d6224dca7076 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 13:37:02 -0800
Subject: [PATCH 041/407] feat: Add URL validation and Content Security Policy
to share page
---
aider/website/share/index.md | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/aider/website/share/index.md b/aider/website/share/index.md
index f4a5d7248..95e755f26 100644
--- a/aider/website/share/index.md
+++ b/aider/website/share/index.md
@@ -2,6 +2,12 @@
nav_exclude: true
---
+
+
# Shared aider chat transcript
A user has shared the following transcript of a pair programming chat session
@@ -38,10 +44,20 @@ print("goodbye")
+
From 06a5fec6129306256cceb1edcdb21c62c9f31d82 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 13:45:50 -0800
Subject: [PATCH 043/407] feat: Include .md files from aider/website/share/ in
blame statistics
---
scripts/blame.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/blame.py b/scripts/blame.py
index 2700b7eec..13ad5d650 100755
--- a/scripts/blame.py
+++ b/scripts/blame.py
@@ -25,6 +25,7 @@ def blame(start_tag, end_tag=None):
for f in files
if f.endswith((".py", ".scm", ".sh", "Dockerfile", "Gemfile"))
or (f.startswith(".github/workflows/") and f.endswith(".yml"))
+ or (f.startswith("aider/website/share/") and f.endswith(".md"))
]
files = [f for f in files if not f.endswith("prompts.py")]
From 21a28623ca1ab2e6586eaea6bf209b67f011cd8f Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Mon, 18 Nov 2024 13:46:43 -0800
Subject: [PATCH 044/407] feat: Explicitly include specific markdown files in
blame script
---
scripts/blame.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/scripts/blame.py b/scripts/blame.py
index 13ad5d650..41b14aaa0 100755
--- a/scripts/blame.py
+++ b/scripts/blame.py
@@ -25,7 +25,8 @@ def blame(start_tag, end_tag=None):
for f in files
if f.endswith((".py", ".scm", ".sh", "Dockerfile", "Gemfile"))
or (f.startswith(".github/workflows/") and f.endswith(".yml"))
- or (f.startswith("aider/website/share/") and f.endswith(".md"))
+ or f == "aider/website/share/index.md"
+ or f == "aider/website/docs/leaderboards/index.md"
]
files = [f for f in files if not f.endswith("prompts.py")]
From ab5a8b24a53c1dd4b9a9869228d8c483ec2d5209 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Mon, 18 Nov 2024 13:56:46 -0800
Subject: [PATCH 045/407] updated blame
---
aider/website/HISTORY.md | 2 +-
aider/website/_data/blame.yml | 134 +++++++++++++++++++++-------------
2 files changed, 85 insertions(+), 51 deletions(-)
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index 44f8da599..dc0248b1c 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -12,7 +12,7 @@ description: Release notes and stats on aider writing its own code.
The above
[stats are based on the git commit history](/docs/faq.html#how-are-the-aider-wrote-xx-of-code-stats-computed)
-in the aider repo.
+of the aider repo.
-November 11, 2024.
+November 20, 2024.
From 788956e86d1ae5322e6bc2111dd9dc89b9351025 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 07:56:28 -0800
Subject: [PATCH 123/407] refactor: Update cache TTL in ModelInfoManager even
on download failure
---
aider/models.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/aider/models.py b/aider/models.py
index b5cd9cd9f..73ed42300 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -754,6 +754,12 @@ class ModelInfoManager:
pass
except Exception as ex:
print(str(ex))
+ finally:
+ # Touch the cache file to update its mtime even if download failed
+ try:
+ self.cache_file.touch()
+ except OSError:
+ pass
def get_model_from_cached_json_db(self, model):
if not self.content:
From aac45097ca64e52ba1a7c871fedfa2597efb6d54 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 07:57:56 -0800
Subject: [PATCH 124/407] fix: Save empty dict to cache file on download
failure
---
aider/models.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index 73ed42300..32f640675 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -754,10 +754,9 @@ class ModelInfoManager:
pass
except Exception as ex:
print(str(ex))
- finally:
- # Touch the cache file to update its mtime even if download failed
try:
- self.cache_file.touch()
+ # Save empty dict to cache file on failure
+ self.cache_file.write_text("{}")
except OSError:
pass
From 3bb8b163b8427e9130f36074df6d88e3dc37ea2f Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 08:09:53 -0800
Subject: [PATCH 125/407] feat: Update HISTORY.md with new release notes
entries
---
HISTORY.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/HISTORY.md b/HISTORY.md
index 6b6cbd6dd..510102adb 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -10,6 +10,9 @@
- Architect mode now asks to add files suggested by the LLM.
- Fixed bug in fuzzy model name matching.
- Added Timeout exception to handle API provider timeouts.
+- Added `--show-release-notes` to control release notes display on first run.
+- Improved release notes display logic and user interaction flow.
+- Save empty dict to cache file on model metadata download failure.
- Improved error handling and code formatting.
- Aider wrote 53% of the code in this release.
From 2ac077603bd2312bf1188e64c8ccd1ca8599a3fd Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 08:16:55 -0800
Subject: [PATCH 126/407] feat: Update add_to_input_history to immediately
update prompt session history
---
aider/io.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/aider/io.py b/aider/io.py
index cbbbd944a..0967b0da7 100644
--- a/aider/io.py
+++ b/aider/io.py
@@ -478,8 +478,8 @@ class InputOutput:
return
FileHistory(self.input_history_file).append_string(inp)
# Also add to the in-memory history if it exists
- if hasattr(self, "session") and hasattr(self.session, "history"):
- self.session.history.append_string(inp)
+ if self.prompt_session and self.prompt_session.history:
+ self.prompt_session.history.append_string(inp)
def get_input_history(self):
if not self.input_history_file:
From 18a88596a6675067eca41d5469f8d1b97a86ed32 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 11:33:16 -0800
Subject: [PATCH 127/407] Added gpt-4o-2024-11-20
---
aider/website/_data/edit_leaderboard.yml | 25 +++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/aider/website/_data/edit_leaderboard.yml b/aider/website/_data/edit_leaderboard.yml
index 754bc52a8..51df6569f 100644
--- a/aider/website/_data/edit_leaderboard.yml
+++ b/aider/website/_data/edit_leaderboard.yml
@@ -1840,4 +1840,27 @@
date: 2024-11-20
versions: 0.63.3.dev
seconds_per_case: 24.9
- total_cost: 3.2334
\ No newline at end of file
+ total_cost: 3.2334
+
+- dirname: 2024-11-20-19-28-30--gpt-4o-2024-11-20
+ test_cases: 133
+ model: openai/gpt-4o-2024-11-20
+ edit_format: diff
+ commit_hash: 2ac0776-dirty
+ pass_rate_1: 58.6
+ pass_rate_2: 71.4
+ percent_cases_well_formed: 99.2
+ error_outputs: 1
+ num_malformed_responses: 1
+ num_with_malformed_responses: 1
+ user_asks: 4
+ lazy_comments: 0
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 0
+ test_timeouts: 5
+ command: aider --model openai/gpt-4o-2024-11-20
+ date: 2024-11-20
+ versions: 0.63.3.dev
+ seconds_per_case: 6.0
+ total_cost: 0.0000
\ No newline at end of file
From a06a9ed7d81c2c1fac1954e791e25bfa6e1d84fc Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 15:31:32 -0800
Subject: [PATCH 128/407] show the /editor message
---
aider/commands.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/aider/commands.py b/aider/commands.py
index 37441390a..35a3ed9b5 100644
--- a/aider/commands.py
+++ b/aider/commands.py
@@ -1371,7 +1371,8 @@ class Commands:
"Open an editor to write a prompt"
user_input = pipe_editor(initial_content, suffix="md")
- self.io.display_user_input(user_input)
+ self.io.user_input(user_input, log_only=False)
+ self.io.add_to_input_history(user_input)
return user_input
From 1aaa3d9279869a76f076ea4e5b14929c40a9fa4c Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 15:31:47 -0800
Subject: [PATCH 129/407] gpt-4o-2024-11-20
---
aider/models.py | 16 ++++++++++++++++
aider/website/_data/edit_leaderboard.yml | 2 +-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index 32f640675..8faf9c061 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -161,6 +161,22 @@ MODEL_SETTINGS = [
lazy=True,
reminder="sys",
),
+ ModelSettings(
+ "gpt-4o-2024-11-20",
+ "diff",
+ weak_model_name="gpt-4o-mini",
+ use_repo_map=True,
+ lazy=True,
+ reminder="sys",
+ ),
+ ModelSettings(
+ "openai/gpt-4o-2024-11-20",
+ "diff",
+ weak_model_name="gpt-4o-mini",
+ use_repo_map=True,
+ lazy=True,
+ reminder="sys",
+ ),
ModelSettings(
"gpt-4o",
"diff",
diff --git a/aider/website/_data/edit_leaderboard.yml b/aider/website/_data/edit_leaderboard.yml
index 51df6569f..5bb33236d 100644
--- a/aider/website/_data/edit_leaderboard.yml
+++ b/aider/website/_data/edit_leaderboard.yml
@@ -1844,7 +1844,7 @@
- dirname: 2024-11-20-19-28-30--gpt-4o-2024-11-20
test_cases: 133
- model: openai/gpt-4o-2024-11-20
+ model: gpt-4o-2024-11-20
edit_format: diff
commit_hash: 2ac0776-dirty
pass_rate_1: 58.6
From c93f3faed91af9efe415373b939c2d1d4534c4aa Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 15:33:00 -0800
Subject: [PATCH 130/407] cleanup openrouter/qwen/qwen-2.5-coder-32b-instruct
in resources
---
HISTORY.md | 6 +++---
aider/resources/model-metadata.json | 11 -----------
2 files changed, 3 insertions(+), 14 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index 510102adb..4dcd0035e 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -4,15 +4,15 @@
### main branch
- Added [`/editor` command](https://aider.chat/docs/usage/commands.html) to open system editor for writing prompts, by @thehunmonkgroup.
+- Full support for `gpt-4o-2024-11-20`.
- Stream o1 models by default.
- Added support for [optional multiline input tags](https://aider.chat/docs/usage/commands.html#entering-multi-line-chat-messages) with matching closing tags.
- Improved [model settings configuration](https://aider.chat/docs/config/adv-model-settings.html#global-extra-params) with support for global `extra_params` for `litellm.completion()`.
- Architect mode now asks to add files suggested by the LLM.
- Fixed bug in fuzzy model name matching.
- Added Timeout exception to handle API provider timeouts.
-- Added `--show-release-notes` to control release notes display on first run.
-- Improved release notes display logic and user interaction flow.
-- Save empty dict to cache file on model metadata download failure.
+- Added `--show-release-notes` to control release notes display on first run of new version.
+- Save empty dict to cache file on model metadata download failure, to delay retry.
- Improved error handling and code formatting.
- Aider wrote 53% of the code in this release.
diff --git a/aider/resources/model-metadata.json b/aider/resources/model-metadata.json
index a2fd02b12..e69de29bb 100644
--- a/aider/resources/model-metadata.json
+++ b/aider/resources/model-metadata.json
@@ -1,11 +0,0 @@
-{
- "openrouter/qwen/qwen-2.5-coder-32b-instruct": {
- "max_tokens": 33792,
- "max_input_tokens": 33792,
- "max_output_tokens": 33792,
- "input_cost_per_token": 0.00000018,
- "output_cost_per_token": 0.00000018,
- "litellm_provider": "openrouter",
- "mode": "chat",
- },
-}
From 3a28e74d897ebfa0f5b40ce29814e7e31c33ad42 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 16:03:51 -0800
Subject: [PATCH 131/407] copy
---
aider/website/HISTORY.md | 3 +
aider/website/assets/sample-analytics.jsonl | 88 +++++++++----------
.../website/docs/config/adv-model-settings.md | 32 +++++++
aider/website/docs/more/infinite-output.md | 7 +-
4 files changed, 85 insertions(+), 45 deletions(-)
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index 78e8f9c08..ee08a959f 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -28,12 +28,15 @@ cog.out(text)
### main branch
- Added [`/editor` command](https://aider.chat/docs/usage/commands.html) to open system editor for writing prompts, by @thehunmonkgroup.
+- Full support for `gpt-4o-2024-11-20`.
- Stream o1 models by default.
- Added support for [optional multiline input tags](https://aider.chat/docs/usage/commands.html#entering-multi-line-chat-messages) with matching closing tags.
- Improved [model settings configuration](https://aider.chat/docs/config/adv-model-settings.html#global-extra-params) with support for global `extra_params` for `litellm.completion()`.
- Architect mode now asks to add files suggested by the LLM.
- Fixed bug in fuzzy model name matching.
- Added Timeout exception to handle API provider timeouts.
+- Added `--show-release-notes` to control release notes display on first run of new version.
+- Save empty dict to cache file on model metadata download failure, to delay retry.
- Improved error handling and code formatting.
- Aider wrote 53% of the code in this release.
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 58d4137fd..fbdb76b30 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,47 +1,3 @@
-{"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.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754107}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754113}
-{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754114}
-{"event": "command_help", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754114}
-{"event": "interactive help", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754114}
-{"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": "help", "prompt_tokens": 4369, "completion_tokens": 162, "total_tokens": 4531, "cost": 0.015537, "total_cost": 0.015537, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754131}
-{"event": "command_help", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754139}
-{"event": "interactive help", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754139}
-{"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": "help", "prompt_tokens": 7756, "completion_tokens": 141, "total_tokens": 7897, "cost": 0.025383, "total_cost": 0.04092, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754149}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754160}
-{"event": "cli session", "properties": {"main_model": "openrouter/anthropic/claude-3.5-sonnet", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/anthropic/claude-3.5-sonnet", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754162}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.5-sonnet", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/anthropic/claude-3.5-sonnet", "edit_format": "diff", "prompt_tokens": 4597, "completion_tokens": 43, "total_tokens": 4640, "cost": 0.014436000000000001, "total_cost": 0.014436000000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754166}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754174}
-{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754176}
-{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 593, "completion_tokens": 53, "total_tokens": 646, "cost": 0.000858, "total_cost": 0.000858, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754179}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818364}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818452}
-{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818452}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818654}
-{"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.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818656}
-{"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": 4733, "completion_tokens": 745, "total_tokens": 5478, "cost": 0.025374, "total_cost": 0.025374, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818718}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.61.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818841}
-{"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.61.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818842}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818882}
-{"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.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818884}
-{"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": 4657, "completion_tokens": 83, "total_tokens": 4740, "cost": 0.015216, "total_cost": 0.015216, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818900}
-{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818904}
-{"event": "command_clear", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818907}
-{"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": 5113, "completion_tokens": 1484, "total_tokens": 6597, "cost": 0.037599, "total_cost": 0.052815, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818940}
-{"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": 6654, "completion_tokens": 435, "total_tokens": 7089, "cost": 0.026487, "total_cost": 0.079302, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730819050}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825144}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825234}
-{"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.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825235}
-{"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": 23, "total_tokens": 697, "cost": 0.00011489999999999999, "total_cost": 0.00011489999999999999, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825238}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825250}
-{"event": "cli session", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825252}
-{"event": "message_send", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "diff", "prompt_tokens": 2185, "completion_tokens": 56, "total_tokens": 2241, "cost": 0.0024649999999999997, "total_cost": 0.0024649999999999997, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825255}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825273}
-{"event": "cli session", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825275}
-{"event": "message_send", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "diff", "prompt_tokens": 4601, "completion_tokens": 0, "total_tokens": 4601, "cost": 0.004601, "total_cost": 0.004601, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825277}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825280}
-{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825329}
-{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825344}
-{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825345}
{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825356}
{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825371}
{"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": 12023, "completion_tokens": 494, "total_tokens": 12517, "cost": 0.043479000000000004, "total_cost": 0.122781, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825392}
@@ -998,3 +954,47 @@
{"event": "cli session", "properties": {"main_model": "openrouter/mistralai/mistral-large", "weak_model": "openrouter/mistralai/mistral-large", "editor_model": "openrouter/mistralai/mistral-large", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732113633}
{"event": "message_send", "properties": {"main_model": "openrouter/mistralai/mistral-large", "weak_model": "openrouter/mistralai/mistral-large", "editor_model": "openrouter/mistralai/mistral-large", "edit_format": "whole", "prompt_tokens": 407, "completion_tokens": 33, "total_tokens": 440, "cost": 0.0040479999999999995, "total_cost": 0.0040479999999999995, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732113636}
{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732115374}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732115650}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732115651}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118126}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118129}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118132}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 12601, "completion_tokens": 334, "total_tokens": 12935, "cost": 0.042813000000000004, "total_cost": 0.042813000000000004, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118186}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 13031, "completion_tokens": 349, "total_tokens": 13380, "cost": 0.044328000000000006, "total_cost": 0.08714100000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118274}
+{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118294}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118349}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118349}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118579}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118581}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118588}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 32104, "completion_tokens": 304, "total_tokens": 32408, "cost": 0.100872, "total_cost": 0.100872, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118617}
+{"event": "command_undo", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118643}
+{"event": "command_editor", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118656}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14796, "completion_tokens": 157, "total_tokens": 14953, "cost": 0.04674300000000001, "total_cost": 0.147615, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118706}
+{"event": "command_undo", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118724}
+{"event": "command_clear", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118792}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118799}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118841}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118843}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118849}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 32116, "completion_tokens": 410, "total_tokens": 32526, "cost": 0.102498, "total_cost": 0.102498, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118887}
+{"event": "command_undo", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118905}
+{"event": "command_exit", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118909}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118933}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118935}
+{"event": "command_run", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118951}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 32134, "completion_tokens": 539, "total_tokens": 32673, "cost": 0.104487, "total_cost": 0.104487, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732118973}
+{"event": "command_editor", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732119025}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14935, "completion_tokens": 0, "total_tokens": 14935, "cost": 0.044805000000000005, "total_cost": 0.149292, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732119135}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732119138}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732119140}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732119368}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732119370}
+{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732119374}
+{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 8871, "completion_tokens": 276, "total_tokens": 9147, "cost": 0.030753000000000003, "total_cost": 0.030753000000000003, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732119413}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732130811}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732130813}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732130833}
+{"event": "message_send", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "edit_format": "diff", "prompt_tokens": 1569, "completion_tokens": 9, "total_tokens": 1578, "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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732130836}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732145592}
+{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732145592}
diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md
index 7947ea758..74ca85cc2 100644
--- a/aider/website/docs/config/adv-model-settings.md
+++ b/aider/website/docs/config/adv-model-settings.md
@@ -265,6 +265,38 @@ cog.out("```\n")
use_system_prompt: true
use_temperature: true
weak_model_name: gpt-4o-mini
+- cache_control: false
+ caches_by_default: false
+ edit_format: diff
+ editor_edit_format: null
+ editor_model_name: null
+ examples_as_sys_msg: false
+ extra_params: null
+ lazy: true
+ name: gpt-4o-2024-11-20
+ reminder: sys
+ send_undo_reply: false
+ streaming: true
+ use_repo_map: true
+ use_system_prompt: true
+ use_temperature: true
+ weak_model_name: gpt-4o-mini
+- cache_control: false
+ caches_by_default: false
+ edit_format: diff
+ editor_edit_format: null
+ editor_model_name: null
+ examples_as_sys_msg: false
+ extra_params: null
+ lazy: true
+ name: openai/gpt-4o-2024-11-20
+ reminder: sys
+ send_undo_reply: false
+ streaming: true
+ use_repo_map: true
+ use_system_prompt: true
+ use_temperature: true
+ weak_model_name: gpt-4o-mini
- cache_control: false
caches_by_default: false
edit_format: diff
diff --git a/aider/website/docs/more/infinite-output.md b/aider/website/docs/more/infinite-output.md
index f590d0791..33e84188b 100644
--- a/aider/website/docs/more/infinite-output.md
+++ b/aider/website/docs/more/infinite-output.md
@@ -57,7 +57,6 @@ cog.out(model_list)
]]]-->
- anthropic.claude-3-5-haiku-20241022-v1:0
- anthropic.claude-3-5-sonnet-20241022-v2:0
-- anthropic/claude-3-5-sonnet-20241022
- claude-3-5-haiku-20241022
- claude-3-5-sonnet-20240620
- claude-3-5-sonnet-20241022
@@ -91,11 +90,17 @@ cog.out(model_list)
- openrouter/anthropic/claude-3.5-sonnet
- us.anthropic.claude-3-5-haiku-20241022-v1:0
- us.anthropic.claude-3-5-sonnet-20241022-v2:0
+- vertex_ai/claude-3-5-haiku
- vertex_ai/claude-3-5-haiku@20241022
+- vertex_ai/claude-3-5-sonnet
+- vertex_ai/claude-3-5-sonnet-v2
- vertex_ai/claude-3-5-sonnet-v2@20241022
- vertex_ai/claude-3-5-sonnet@20240620
+- vertex_ai/claude-3-haiku
- vertex_ai/claude-3-haiku@20240307
+- vertex_ai/claude-3-opus
- vertex_ai/claude-3-opus@20240229
+- vertex_ai/claude-3-sonnet
- vertex_ai/claude-3-sonnet@20240229
From 539a6cde634780e690cc02e20f7ef4c65082bac9 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 16:22:01 -0800
Subject: [PATCH 132/407] feat: Enhance analytics opt-in logic with user
sampling and explicit control
---
aider/analytics.py | 17 +++++++++++++++--
aider/args.py | 4 ++--
aider/main.py | 4 ++--
tests/basic/test_analytics.py | 13 ++++++++++---
4 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index 5a0ace4b3..464f98f57 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -62,8 +62,21 @@ class Analytics:
self.permanently_disable = True
self.save_data()
- def need_to_ask(self):
- return not self.asked_opt_in and not self.permanently_disable
+ def need_to_ask(self, args_analytics):
+ if args_analytics is False:
+ return False
+
+ could_ask = not self.asked_opt_in and not self.permanently_disable
+ if not could_ask:
+ return False
+
+ if args_analytics is True:
+ return True
+
+ assert args_analytics is None, args_analytics
+
+ # ask 1/16 of the users
+ return self.user_id < "1"
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
diff --git a/aider/args.py b/aider/args.py
index 2a266f303..ec2545c8c 100644
--- a/aider/args.py
+++ b/aider/args.py
@@ -562,8 +562,8 @@ def get_parser(default_config_files, git_root):
group.add_argument(
"--analytics",
action=argparse.BooleanOptionalAction,
- default=False,
- help="Enable/disable analytics for one session (default: False)",
+ default=None,
+ help="Enable/disable analytics for current session (default: random)",
)
group.add_argument(
"--analytics-log",
diff --git a/aider/main.py b/aider/main.py
index 89d01d72c..d38f3cc20 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -506,8 +506,8 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
io.tool_warning("Terminal does not support pretty output (UnicodeDecodeError)")
analytics = Analytics(logfile=args.analytics_log, permanently_disable=args.analytics_disable)
- if args.analytics:
- if analytics.need_to_ask():
+ if args.analytics is not False:
+ if analytics.need_to_ask(args.analytics):
io.tool_output(
"Aider respects your privacy and never collects your code, chat messages, keys or"
" personal info."
diff --git a/tests/basic/test_analytics.py b/tests/basic/test_analytics.py
index 11071cf50..baeb21ddc 100644
--- a/tests/basic/test_analytics.py
+++ b/tests/basic/test_analytics.py
@@ -91,10 +91,17 @@ def test_system_info(temp_data_dir):
def test_need_to_ask(temp_data_dir):
analytics = Analytics()
- assert analytics.need_to_ask() is True
+ assert analytics.need_to_ask(True) is True
+ assert analytics.need_to_ask(False) is False
+
+ analytics.user_id = "111"
+ assert analytics.need_to_ask(None) is False
+
+ analytics.user_id = "000"
+ assert analytics.need_to_ask(None) is True
analytics.asked_opt_in = True
- assert analytics.need_to_ask() is False
+ assert analytics.need_to_ask(True) is False
analytics.permanently_disable = True
- assert analytics.need_to_ask() is False
+ assert analytics.need_to_ask(True) is False
From ded60036cbd988ae47c120efb62ec06f58fe5b4a Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 17:43:51 -0800
Subject: [PATCH 133/407] copy
---
aider/website/assets/sample-analytics.jsonl | 6 ++--
aider/website/assets/sample.aider.conf.yml | 4 +--
aider/website/assets/sample.env | 4 +--
aider/website/docs/config/aider_conf.md | 4 +--
aider/website/docs/config/dotenv.md | 4 +--
aider/website/docs/config/options.md | 3 +-
aider/website/docs/more/analytics.md | 32 ++++++++++++++-------
7 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index fbdb76b30..5894250f8 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,6 +1,3 @@
-{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825356}
-{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825371}
-{"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": 12023, "completion_tokens": 494, "total_tokens": 12517, "cost": 0.043479000000000004, "total_cost": 0.122781, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825392}
{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825584}
{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825586}
{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825588}
@@ -998,3 +995,6 @@
{"event": "message_send", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "edit_format": "diff", "prompt_tokens": 1569, "completion_tokens": 9, "total_tokens": 1578, "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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732130836}
{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732145592}
{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-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.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732145592}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732147482}
+{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732147483}
+{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.63.3.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1732148511}
diff --git a/aider/website/assets/sample.aider.conf.yml b/aider/website/assets/sample.aider.conf.yml
index e72459a2d..01956252f 100644
--- a/aider/website/assets/sample.aider.conf.yml
+++ b/aider/website/assets/sample.aider.conf.yml
@@ -271,8 +271,8 @@
############
# Analytics:
-## Enable/disable analytics for one session (default: False)
-#analytics: false
+## Enable/disable analytics for current session (default: random)
+#analytics: xxx
## Specify a file to log analytics events
#analytics-log: xxx
diff --git a/aider/website/assets/sample.env b/aider/website/assets/sample.env
index 61c7078c4..5c10ea14f 100644
--- a/aider/website/assets/sample.env
+++ b/aider/website/assets/sample.env
@@ -270,8 +270,8 @@
############
# Analytics:
-## Enable/disable analytics for one session (default: False)
-#AIDER_ANALYTICS=false
+## Enable/disable analytics for current session (default: random)
+#AIDER_ANALYTICS=
## Specify a file to log analytics events
#AIDER_ANALYTICS_LOG=
diff --git a/aider/website/docs/config/aider_conf.md b/aider/website/docs/config/aider_conf.md
index 13278a206..a6bc78fcc 100644
--- a/aider/website/docs/config/aider_conf.md
+++ b/aider/website/docs/config/aider_conf.md
@@ -327,8 +327,8 @@ cog.outl("```")
############
# Analytics:
-## Enable/disable analytics for one session (default: False)
-#analytics: false
+## Enable/disable analytics for current session (default: random)
+#analytics: xxx
## Specify a file to log analytics events
#analytics-log: xxx
diff --git a/aider/website/docs/config/dotenv.md b/aider/website/docs/config/dotenv.md
index 2c33707e9..b484ebc72 100644
--- a/aider/website/docs/config/dotenv.md
+++ b/aider/website/docs/config/dotenv.md
@@ -312,8 +312,8 @@ cog.outl("```")
############
# Analytics:
-## Enable/disable analytics for one session (default: False)
-#AIDER_ANALYTICS=false
+## Enable/disable analytics for current session (default: random)
+#AIDER_ANALYTICS=
## Specify a file to log analytics events
#AIDER_ANALYTICS_LOG=
diff --git a/aider/website/docs/config/options.md b/aider/website/docs/config/options.md
index a9ab64349..fd4eef894 100644
--- a/aider/website/docs/config/options.md
+++ b/aider/website/docs/config/options.md
@@ -511,8 +511,7 @@ Environment variable: `AIDER_TEST`
## Analytics:
### `--analytics`
-Enable/disable analytics for one session (default: False)
-Default: False
+Enable/disable analytics for current session (default: random)
Environment variable: `AIDER_ANALYTICS`
Aliases:
- `--analytics`
diff --git a/aider/website/docs/more/analytics.md b/aider/website/docs/more/analytics.md
index b44bcec63..24bd4910b 100644
--- a/aider/website/docs/more/analytics.md
+++ b/aider/website/docs/more/analytics.md
@@ -31,7 +31,7 @@ features and commands are most used.
It also helps uncover bugs that users are experiencing, so that they can be fixed
in upcoming releases.
-## Enabling & disabling analytics
+## Disabling analytics
You can opt out of analytics forever by running this command one time:
@@ -39,10 +39,27 @@ You can opt out of analytics forever by running this command one time:
aider --analytics-disable
```
-To enable analytics for a single session, you can run aider with `--analytics`.
-This will *not* have any effect if you have permanently disabled analytics with the previous command.
+## Enabling analytics
-The first time, you will need to agree to opt-in.
+The `--[no-]analytics` switch controls whether analytics are enabled for the
+current session:
+
+- `--analytics` will turn on analytics for the current session.
+This will *not* have any effect if you have permanently disabled analytics
+with `--analytics-disable`.
+If this is the first time you have enabled analytics, aider
+will confirm you wish to opt-in to analytics.
+- `--no-analytics` will turn off analytics for the current session.
+- By default, if you don't provide `--analytics` or `--no-analytics`,
+aider will enable analytics for a random subset of users.
+This will never happen if you have permanently disabled analytics
+with `--analytics-disable`.
+Randomly selected users will be asked if they wish to opt-in to analytics.
+
+
+## Opting in
+
+The first time analytics are enabled, you will need to agree to opt-in.
```
aider --analytics
@@ -53,13 +70,8 @@ For more info: https://aider.chat/docs/more/analytics.html
Allow collection of anonymous analytics to help improve aider? (Y)es/(N)o [Yes]:
```
-If you've added `analytics: true` to your
-[yaml config file](/docs/config/aider_conf.html),
-you can disable analytics for a single session, you can run:
+If you say "no", analytics will be permanently disabled.
-```
-aider --no-analytics
-```
## Details about data being collected
From 6e076a40a92734a10390e3f07ad2c85d64fb1dff Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 17:52:50 -0800
Subject: [PATCH 134/407] refactor: Modify analytics sampling logic to use 1%
of users
---
aider/analytics.py | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index 464f98f57..e702b8f41 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -75,8 +75,11 @@ class Analytics:
assert args_analytics is None, args_analytics
- # ask 1/16 of the users
- return self.user_id < "1"
+ if not self.user_id:
+ return False
+
+ # ask 1% of users
+ return self.user_id < "03"
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
From 75f52a132406ac877401695da30f27344926b708 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 17:52:52 -0800
Subject: [PATCH 135/407] refactor: Improve user sampling logic with
configurable percentage
---
aider/analytics.py | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index e702b8f41..537da259e 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -78,8 +78,11 @@ class Analytics:
if not self.user_id:
return False
- # ask 1% of users
- return self.user_id < "03"
+ # Define percentage of users to ask
+ PERCENT = 1
+ # Convert percentage to hex threshold (1% = "03", 10% = "1a", etc)
+ threshold = format(int(256 * PERCENT / 100), "02x")
+ return self.user_id < threshold
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
From 82187f6a71bda8864e6b49d578dc69d174664d70 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 17:54:16 -0800
Subject: [PATCH 136/407] refactor: Extract UUID percentage testing logic into
a separate method with tests
---
aider/analytics.py | 23 ++++++++++++++++++++---
tests/basic/test_analytics.py | 30 ++++++++++++++++++++++++++++++
2 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index 537da259e..02f6b1f92 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -78,11 +78,28 @@ class Analytics:
if not self.user_id:
return False
- # Define percentage of users to ask
PERCENT = 1
+ return self.is_uuid_in_percentage(self.user_id, PERCENT)
+
+ def is_uuid_in_percentage(self, uuid_str, percent):
+ """Check if a UUID string falls within the first X percent of the UUID space.
+
+ Args:
+ uuid_str: UUID string to test
+ percent: Percentage threshold (0-100)
+
+ Returns:
+ bool: True if UUID falls within the first X percent
+ """
+ if not (0 <= percent <= 100):
+ raise ValueError("Percentage must be between 0 and 100")
+
+ if not uuid_str:
+ return False
+
# Convert percentage to hex threshold (1% = "03", 10% = "1a", etc)
- threshold = format(int(256 * PERCENT / 100), "02x")
- return self.user_id < threshold
+ threshold = format(int(256 * percent / 100), "02x")
+ return uuid_str < threshold
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
diff --git a/tests/basic/test_analytics.py b/tests/basic/test_analytics.py
index baeb21ddc..9d7df7167 100644
--- a/tests/basic/test_analytics.py
+++ b/tests/basic/test_analytics.py
@@ -105,3 +105,33 @@ def test_need_to_ask(temp_data_dir):
analytics.permanently_disable = True
assert analytics.need_to_ask(True) is False
+
+
+def test_is_uuid_in_percentage():
+ analytics = Analytics()
+
+ # Test basic percentage thresholds
+ assert analytics.is_uuid_in_percentage("00", 1) is True
+ assert analytics.is_uuid_in_percentage("02", 1) is True
+ assert analytics.is_uuid_in_percentage("03", 1) is False
+ assert analytics.is_uuid_in_percentage("ff", 1) is False
+
+ assert analytics.is_uuid_in_percentage("00", 10) is True
+ assert analytics.is_uuid_in_percentage("19", 10) is True
+ assert analytics.is_uuid_in_percentage("1a", 10) is False
+ assert analytics.is_uuid_in_percentage("ff", 10) is False
+
+ # Test edge cases
+ assert analytics.is_uuid_in_percentage("00", 0) is False
+ assert analytics.is_uuid_in_percentage("00", 100) is True
+ assert analytics.is_uuid_in_percentage("ff", 100) is True
+
+ # Test invalid inputs
+ with pytest.raises(ValueError):
+ analytics.is_uuid_in_percentage("00", -1)
+ with pytest.raises(ValueError):
+ analytics.is_uuid_in_percentage("00", 101)
+
+ # Test empty/None UUID
+ assert analytics.is_uuid_in_percentage("", 50) is False
+ assert analytics.is_uuid_in_percentage(None, 50) is False
From 95c9863d0aa707937a9bfb5883e5cefd3ac1d042 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 17:54:22 -0800
Subject: [PATCH 137/407] style: Fix linter formatting in analytics module
---
aider/analytics.py | 8 ++++----
tests/basic/test_analytics.py | 10 +++++-----
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index 02f6b1f92..737cae701 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -83,20 +83,20 @@ class Analytics:
def is_uuid_in_percentage(self, uuid_str, percent):
"""Check if a UUID string falls within the first X percent of the UUID space.
-
+
Args:
uuid_str: UUID string to test
percent: Percentage threshold (0-100)
-
+
Returns:
bool: True if UUID falls within the first X percent
"""
if not (0 <= percent <= 100):
raise ValueError("Percentage must be between 0 and 100")
-
+
if not uuid_str:
return False
-
+
# Convert percentage to hex threshold (1% = "03", 10% = "1a", etc)
threshold = format(int(256 * percent / 100), "02x")
return uuid_str < threshold
diff --git a/tests/basic/test_analytics.py b/tests/basic/test_analytics.py
index 9d7df7167..ef2ba884a 100644
--- a/tests/basic/test_analytics.py
+++ b/tests/basic/test_analytics.py
@@ -109,29 +109,29 @@ def test_need_to_ask(temp_data_dir):
def test_is_uuid_in_percentage():
analytics = Analytics()
-
+
# Test basic percentage thresholds
assert analytics.is_uuid_in_percentage("00", 1) is True
assert analytics.is_uuid_in_percentage("02", 1) is True
assert analytics.is_uuid_in_percentage("03", 1) is False
assert analytics.is_uuid_in_percentage("ff", 1) is False
-
+
assert analytics.is_uuid_in_percentage("00", 10) is True
assert analytics.is_uuid_in_percentage("19", 10) is True
assert analytics.is_uuid_in_percentage("1a", 10) is False
assert analytics.is_uuid_in_percentage("ff", 10) is False
-
+
# Test edge cases
assert analytics.is_uuid_in_percentage("00", 0) is False
assert analytics.is_uuid_in_percentage("00", 100) is True
assert analytics.is_uuid_in_percentage("ff", 100) is True
-
+
# Test invalid inputs
with pytest.raises(ValueError):
analytics.is_uuid_in_percentage("00", -1)
with pytest.raises(ValueError):
analytics.is_uuid_in_percentage("00", 101)
-
+
# Test empty/None UUID
assert analytics.is_uuid_in_percentage("", 50) is False
assert analytics.is_uuid_in_percentage(None, 50) is False
From 1a1cb0d3f1adf8d70ce7ded2b9249f03cfc0e14b Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 17:55:40 -0800
Subject: [PATCH 138/407] fix: Correct percentage calculation in UUID sampling
method
---
aider/analytics.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index 737cae701..baae92ae4 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -97,8 +97,9 @@ class Analytics:
if not uuid_str:
return False
- # Convert percentage to hex threshold (1% = "03", 10% = "1a", etc)
- threshold = format(int(256 * percent / 100), "02x")
+ # Convert percentage to hex threshold (1% = "04", 10% = "1a", etc)
+ # Using first 2 hex digits (0-ff) means each digit is 1/256 of the space
+ threshold = format(int(255 * percent / 100), "02x")
return uuid_str < threshold
def get_data_file_path(self):
From 6b703244ecb44cd4bcfd8cedfbe3e09ccb92f955 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 17:56:07 -0800
Subject: [PATCH 139/407] fix: Correct percentage calculation in
is_uuid_in_percentage method
---
aider/analytics.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index baae92ae4..453879097 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -100,7 +100,7 @@ class Analytics:
# Convert percentage to hex threshold (1% = "04", 10% = "1a", etc)
# Using first 2 hex digits (0-ff) means each digit is 1/256 of the space
threshold = format(int(255 * percent / 100), "02x")
- return uuid_str < threshold
+ return uuid_str <= threshold
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
From fa85bdceeda7b7d5a07d899c32473f69799f13a9 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 17:58:16 -0800
Subject: [PATCH 140/407] fix: Correct sampling logic by changing <= to < in
UUID comparison
---
aider/analytics.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index 453879097..baae92ae4 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -100,7 +100,7 @@ class Analytics:
# Convert percentage to hex threshold (1% = "04", 10% = "1a", etc)
# Using first 2 hex digits (0-ff) means each digit is 1/256 of the space
threshold = format(int(255 * percent / 100), "02x")
- return uuid_str <= threshold
+ return uuid_str < threshold
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
From 1a8949eea3fc37b982722d01959240b4a8b7a57f Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 17:58:18 -0800
Subject: [PATCH 141/407] fix: Correct UUID percentage calculation in analytics
method
---
aider/analytics.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index baae92ae4..a1887e4a2 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -99,8 +99,10 @@ class Analytics:
# Convert percentage to hex threshold (1% = "04", 10% = "1a", etc)
# Using first 2 hex digits (0-ff) means each digit is 1/256 of the space
+ if percent == 0:
+ return False
threshold = format(int(255 * percent / 100), "02x")
- return uuid_str < threshold
+ return uuid_str[:2] <= threshold
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
From 59f4a3bcc77b5a5f8489c93c338cc1ef302dd7ce Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 17:58:50 -0800
Subject: [PATCH 142/407] test: Update UUID percentage threshold test case
---
tests/basic/test_analytics.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/basic/test_analytics.py b/tests/basic/test_analytics.py
index ef2ba884a..2d7f25e57 100644
--- a/tests/basic/test_analytics.py
+++ b/tests/basic/test_analytics.py
@@ -112,7 +112,7 @@ def test_is_uuid_in_percentage():
# Test basic percentage thresholds
assert analytics.is_uuid_in_percentage("00", 1) is True
- assert analytics.is_uuid_in_percentage("02", 1) is True
+ assert analytics.is_uuid_in_percentage("01999", 1) is True
assert analytics.is_uuid_in_percentage("03", 1) is False
assert analytics.is_uuid_in_percentage("ff", 1) is False
From ec39f018e27ebf33837be58e2e15233efe503412 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 17:58:52 -0800
Subject: [PATCH 143/407] test: Update test_is_uuid_in_percentage with
full-length UUIDs
---
tests/basic/test_analytics.py | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/tests/basic/test_analytics.py b/tests/basic/test_analytics.py
index 2d7f25e57..18194b1e8 100644
--- a/tests/basic/test_analytics.py
+++ b/tests/basic/test_analytics.py
@@ -111,26 +111,26 @@ def test_is_uuid_in_percentage():
analytics = Analytics()
# Test basic percentage thresholds
- assert analytics.is_uuid_in_percentage("00", 1) is True
- assert analytics.is_uuid_in_percentage("01999", 1) is True
- assert analytics.is_uuid_in_percentage("03", 1) is False
- assert analytics.is_uuid_in_percentage("ff", 1) is False
+ assert analytics.is_uuid_in_percentage("00000000000000000000000000000000", 1) is True
+ assert analytics.is_uuid_in_percentage("01999000000000000000000000000000", 1) is True
+ assert analytics.is_uuid_in_percentage("03000000000000000000000000000000", 1) is False
+ assert analytics.is_uuid_in_percentage("ff000000000000000000000000000000", 1) is False
- assert analytics.is_uuid_in_percentage("00", 10) is True
- assert analytics.is_uuid_in_percentage("19", 10) is True
- assert analytics.is_uuid_in_percentage("1a", 10) is False
- assert analytics.is_uuid_in_percentage("ff", 10) is False
+ assert analytics.is_uuid_in_percentage("00000000000000000000000000000000", 10) is True
+ assert analytics.is_uuid_in_percentage("19000000000000000000000000000000", 10) is True
+ assert analytics.is_uuid_in_percentage("1a000000000000000000000000000000", 10) is False
+ assert analytics.is_uuid_in_percentage("ff000000000000000000000000000000", 10) is False
# Test edge cases
- assert analytics.is_uuid_in_percentage("00", 0) is False
- assert analytics.is_uuid_in_percentage("00", 100) is True
- assert analytics.is_uuid_in_percentage("ff", 100) is True
+ assert analytics.is_uuid_in_percentage("00000000000000000000000000000000", 0) is False
+ assert analytics.is_uuid_in_percentage("00000000000000000000000000000000", 100) is True
+ assert analytics.is_uuid_in_percentage("ffffffffffffffffffffffffffffffff", 100) is True
# Test invalid inputs
with pytest.raises(ValueError):
- analytics.is_uuid_in_percentage("00", -1)
+ analytics.is_uuid_in_percentage("00000000000000000000000000000000", -1)
with pytest.raises(ValueError):
- analytics.is_uuid_in_percentage("00", 101)
+ analytics.is_uuid_in_percentage("00000000000000000000000000000000", 101)
# Test empty/None UUID
assert analytics.is_uuid_in_percentage("", 50) is False
From e9e51db9c7b1f75e7e4c08a632491994fa65384d Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 18:00:17 -0800
Subject: [PATCH 144/407] improve precision, tests
---
aider/analytics.py | 8 ++++----
tests/basic/test_analytics.py | 2 ++
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/aider/analytics.py b/aider/analytics.py
index a1887e4a2..6295f9e3f 100644
--- a/aider/analytics.py
+++ b/aider/analytics.py
@@ -97,12 +97,12 @@ class Analytics:
if not uuid_str:
return False
- # Convert percentage to hex threshold (1% = "04", 10% = "1a", etc)
- # Using first 2 hex digits (0-ff) means each digit is 1/256 of the space
+ # Convert percentage to hex threshold (1% = "04...", 10% = "1a...", etc)
+ # Using first 6 hex digits
if percent == 0:
return False
- threshold = format(int(255 * percent / 100), "02x")
- return uuid_str[:2] <= threshold
+ threshold = format(int(0xFFFFFF * percent / 100), "06x")
+ return uuid_str[:6] <= threshold
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
diff --git a/tests/basic/test_analytics.py b/tests/basic/test_analytics.py
index 18194b1e8..dd25e12c8 100644
--- a/tests/basic/test_analytics.py
+++ b/tests/basic/test_analytics.py
@@ -113,6 +113,8 @@ def test_is_uuid_in_percentage():
# Test basic percentage thresholds
assert analytics.is_uuid_in_percentage("00000000000000000000000000000000", 1) is True
assert analytics.is_uuid_in_percentage("01999000000000000000000000000000", 1) is True
+ assert analytics.is_uuid_in_percentage("02000000000000000000000000000000", 1) is True
+ assert analytics.is_uuid_in_percentage("02910000000000000000000000000001", 1) is False
assert analytics.is_uuid_in_percentage("03000000000000000000000000000000", 1) is False
assert analytics.is_uuid_in_percentage("ff000000000000000000000000000000", 1) is False
From 35115f5707d818fef5a601d82c6ff6632b08d7f2 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 18:30:09 -0800
Subject: [PATCH 145/407] feat: Add orange color for Claude 3 Sonnet models in
benchmark visualization
---
benchmark/over_time.py | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 931b7e1d2..455a07ccb 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -12,6 +12,9 @@ def get_model_color(model):
if model == "gpt-4o-mini":
return default
+ if "claude-3-sonnet" in model.lower():
+ return "orange"
+
if "-4o" in model:
return "purple"
@@ -73,8 +76,9 @@ def plot_over_time(yaml_file):
purple_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "purple"]
red_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "red"]
green_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "green"]
+ orange_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "orange"]
- # Plot lines for purple, red, and green points
+ # Plot lines for purple, red, green and orange points
if purple_points:
purple_dates, purple_rates = zip(*sorted(purple_points))
ax.plot(purple_dates, purple_rates, c="purple", alpha=0.5, linewidth=1)
@@ -84,6 +88,9 @@ def plot_over_time(yaml_file):
if green_points:
green_dates, green_rates = zip(*sorted(green_points))
ax.plot(green_dates, green_rates, c="green", alpha=0.5, linewidth=1)
+ if orange_points:
+ orange_dates, orange_rates = zip(*sorted(orange_points))
+ ax.plot(orange_dates, orange_rates, c="orange", alpha=0.5, linewidth=1)
# Plot all points
ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=120)
From 16b319174b44a81ce4907e22eb471e5d15f29cfa Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 18:31:44 -0800
Subject: [PATCH 146/407] refactor: Simplify model color detection logic for
Sonnet models
---
benchmark/over_time.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 455a07ccb..98d206794 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -12,7 +12,7 @@ def get_model_color(model):
if model == "gpt-4o-mini":
return default
- if "claude-3-sonnet" in model.lower():
+ if "sonnet" in model.lower():
return "orange"
if "-4o" in model:
From 8f1dcfda07fbbc278dc791d30e4afe01a64b48d3 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 18:31:46 -0800
Subject: [PATCH 147/407] feat: Add brown color for DeepSeek models in
benchmark visualization
---
benchmark/over_time.py | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 98d206794..42a15eaa3 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -12,6 +12,9 @@ def get_model_color(model):
if model == "gpt-4o-mini":
return default
+ if "deepseek" in model.lower():
+ return "brown"
+
if "sonnet" in model.lower():
return "orange"
@@ -77,8 +80,9 @@ def plot_over_time(yaml_file):
red_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "red"]
green_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "green"]
orange_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "orange"]
+ brown_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "brown"]
- # Plot lines for purple, red, green and orange points
+ # Plot lines for purple, red, green, orange and brown points
if purple_points:
purple_dates, purple_rates = zip(*sorted(purple_points))
ax.plot(purple_dates, purple_rates, c="purple", alpha=0.5, linewidth=1)
@@ -91,6 +95,9 @@ def plot_over_time(yaml_file):
if orange_points:
orange_dates, orange_rates = zip(*sorted(orange_points))
ax.plot(orange_dates, orange_rates, c="orange", alpha=0.5, linewidth=1)
+ if brown_points:
+ brown_dates, brown_rates = zip(*sorted(brown_points))
+ ax.plot(brown_dates, brown_rates, c="brown", alpha=0.5, linewidth=1)
# Plot all points
ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=120)
From 093540507ed93d3ceff9bb0f4017cf70ea24042b Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 18:33:54 -0800
Subject: [PATCH 148/407] feat: Add pink color and line for Haiku models in
benchmark visualization
---
benchmark/over_time.py | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 42a15eaa3..afae1d26e 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -12,6 +12,9 @@ def get_model_color(model):
if model == "gpt-4o-mini":
return default
+ if "haiku" in model.lower():
+ return "pink"
+
if "deepseek" in model.lower():
return "brown"
@@ -81,6 +84,7 @@ def plot_over_time(yaml_file):
green_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "green"]
orange_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "orange"]
brown_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "brown"]
+ pink_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "pink"]
# Plot lines for purple, red, green, orange and brown points
if purple_points:
@@ -98,6 +102,9 @@ def plot_over_time(yaml_file):
if brown_points:
brown_dates, brown_rates = zip(*sorted(brown_points))
ax.plot(brown_dates, brown_rates, c="brown", alpha=0.5, linewidth=1)
+ if pink_points:
+ pink_dates, pink_rates = zip(*sorted(pink_points))
+ ax.plot(pink_dates, pink_rates, c="pink", alpha=0.5, linewidth=1)
# Plot all points
ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=120)
From 2b55707738d83775d22812eab6ae86bee28ab783 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 18:35:25 -0800
Subject: [PATCH 149/407] feat: Add purple color and line for Qwen models in
visualization
---
benchmark/over_time.py | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index afae1d26e..7195d52c3 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -12,6 +12,9 @@ def get_model_color(model):
if model == "gpt-4o-mini":
return default
+ if "qwen" in model.lower():
+ return "purple"
+
if "haiku" in model.lower():
return "pink"
@@ -85,6 +88,7 @@ def plot_over_time(yaml_file):
orange_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "orange"]
brown_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "brown"]
pink_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "pink"]
+ qwen_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "purple"]
# Plot lines for purple, red, green, orange and brown points
if purple_points:
@@ -105,6 +109,9 @@ def plot_over_time(yaml_file):
if pink_points:
pink_dates, pink_rates = zip(*sorted(pink_points))
ax.plot(pink_dates, pink_rates, c="pink", alpha=0.5, linewidth=1)
+ if qwen_points:
+ qwen_dates, qwen_rates = zip(*sorted(qwen_points))
+ ax.plot(qwen_dates, qwen_rates, c="purple", alpha=0.5, linewidth=1)
# Plot all points
ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=120)
From bd2b9a12ed2ac3a0ce427e985be1619492b4f8af Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 18:38:04 -0800
Subject: [PATCH 150/407] style: Change Qwen model color from purple to
darkblue
---
benchmark/over_time.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 7195d52c3..4e5b6a8cf 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -13,7 +13,7 @@ def get_model_color(model):
return default
if "qwen" in model.lower():
- return "purple"
+ return "darkblue"
if "haiku" in model.lower():
return "pink"
@@ -88,7 +88,7 @@ def plot_over_time(yaml_file):
orange_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "orange"]
brown_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "brown"]
pink_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "pink"]
- qwen_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "purple"]
+ qwen_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "darkblue"]
# Plot lines for purple, red, green, orange and brown points
if purple_points:
@@ -111,7 +111,7 @@ def plot_over_time(yaml_file):
ax.plot(pink_dates, pink_rates, c="pink", alpha=0.5, linewidth=1)
if qwen_points:
qwen_dates, qwen_rates = zip(*sorted(qwen_points))
- ax.plot(qwen_dates, qwen_rates, c="purple", alpha=0.5, linewidth=1)
+ ax.plot(qwen_dates, qwen_rates, c="darkblue", alpha=0.5, linewidth=1)
# Plot all points
ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=120)
From 7d9b986c04b627029c30d843b78bd0a415c9e3ee Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 18:38:06 -0800
Subject: [PATCH 151/407] feat: Add cyan color and line for Mistral models in
visualization
---
benchmark/over_time.py | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 4e5b6a8cf..78937242b 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -15,6 +15,9 @@ def get_model_color(model):
if "qwen" in model.lower():
return "darkblue"
+ if "mistral" in model.lower():
+ return "cyan"
+
if "haiku" in model.lower():
return "pink"
@@ -89,6 +92,7 @@ def plot_over_time(yaml_file):
brown_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "brown"]
pink_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "pink"]
qwen_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "darkblue"]
+ mistral_points = [(d, r) for d, r, c in zip(dates, pass_rates, colors) if c == "cyan"]
# Plot lines for purple, red, green, orange and brown points
if purple_points:
@@ -112,6 +116,9 @@ def plot_over_time(yaml_file):
if qwen_points:
qwen_dates, qwen_rates = zip(*sorted(qwen_points))
ax.plot(qwen_dates, qwen_rates, c="darkblue", alpha=0.5, linewidth=1)
+ if mistral_points:
+ mistral_dates, mistral_rates = zip(*sorted(mistral_points))
+ ax.plot(mistral_dates, mistral_rates, c="cyan", alpha=0.5, linewidth=1)
# Plot all points
ax.scatter(dates, pass_rates, c=colors, alpha=0.5, s=120)
From 062dc43c87ccbde0465f7bdde310ed1c6c6d057e Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 18:43:18 -0800
Subject: [PATCH 152/407] style: Make graph aspect ratio square
---
benchmark/over_time.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 78937242b..11b26eca8 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -74,7 +74,7 @@ def plot_over_time(yaml_file):
rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10})
plt.rcParams["text.color"] = "#444444"
- fig, ax = plt.subplots(figsize=(12, 6)) # Increase figure size for better visibility
+ fig, ax = plt.subplots(figsize=(10, 10)) # Make figure square
print("Debug: Figure created. Plotting data...")
ax.grid(axis="y", zorder=0, lw=0.2)
From ddc538cdfad3b20aa8a21b0d30770d7c9b5bc129 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 18:47:28 -0800
Subject: [PATCH 153/407] refactor: Adjust plot figure size and y-axis limits
for better visualization
---
benchmark/over_time.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 11b26eca8..5899ba05b 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -74,7 +74,7 @@ def plot_over_time(yaml_file):
rc("font", **{"family": "sans-serif", "sans-serif": ["Helvetica"], "size": 10})
plt.rcParams["text.color"] = "#444444"
- fig, ax = plt.subplots(figsize=(10, 10)) # Make figure square
+ fig, ax = plt.subplots(figsize=(12, 8)) # Make figure square
print("Debug: Figure created. Plotting data...")
ax.grid(axis="y", zorder=0, lw=0.2)
@@ -138,7 +138,7 @@ def plot_over_time(yaml_file):
"Aider code editing benchmark,\npercent completed correctly", fontsize=18, color="#555"
)
ax.set_title("LLM code editing skill by model release date", fontsize=20)
- ax.set_ylim(0, 100) # Adjust y-axis limit to accommodate higher values
+ ax.set_ylim(30, 90) # Adjust y-axis limit to accommodate higher values
plt.xticks(fontsize=14, rotation=45, ha="right") # Rotate x-axis labels for better readability
plt.tight_layout(pad=3.0)
From 370993cbed148bbdd44e0e35bab5bff995969584 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 20 Nov 2024 18:47:30 -0800
Subject: [PATCH 154/407] style: Rotate point labels by 45 degrees in benchmark
plot
---
benchmark/over_time.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/benchmark/over_time.py b/benchmark/over_time.py
index 5899ba05b..3ad060c8d 100644
--- a/benchmark/over_time.py
+++ b/benchmark/over_time.py
@@ -131,6 +131,7 @@ def plot_over_time(yaml_file):
alpha=0.75,
xytext=(5, 5),
textcoords="offset points",
+ rotation=45,
)
ax.set_xlabel("Model release date", fontsize=18, color="#555")
From 9b5a703307b8e2a749259e0e40d414fe4cd7a150 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 20 Nov 2024 19:40:59 -0800
Subject: [PATCH 155/407] updated models-over-time
---
aider/website/_data/edit_leaderboard.yml | 45 +-
aider/website/assets/models-over-time.png | Bin 87658 -> 158447 bytes
aider/website/assets/models-over-time.svg | 1247 ++++++++++++---------
benchmark/over_time.py | 2 +-
4 files changed, 740 insertions(+), 554 deletions(-)
diff --git a/aider/website/_data/edit_leaderboard.yml b/aider/website/_data/edit_leaderboard.yml
index 5bb33236d..c4d600ce0 100644
--- a/aider/website/_data/edit_leaderboard.yml
+++ b/aider/website/_data/edit_leaderboard.yml
@@ -274,7 +274,7 @@
- dirname: 2024-05-03-22-24-48--openrouter--llama3-diff-examples-sys-msg
test_cases: 132
model: llama3-70b-8192
- released: 2024-04-18
+ _released: 2024-04-18
edit_format: diff
commit_hash: b5bb453
pass_rate_1: 38.6
@@ -297,7 +297,7 @@
- dirname: 2024-05-06-18-31-08--command-r-plus-whole-final
test_cases: 133
model: command-r-plus
- released: 2024-04-04
+ _released: 2024-04-04
edit_format: whole
commit_hash: fc3a43e-dirty
pass_rate_1: 21.8
@@ -671,7 +671,7 @@
commit_hash: f7ce78b-dirty
pass_rate_1: 46.6
pass_rate_2: 63.9
- released: 2024-07-23
+ _released: 2024-07-23
percent_cases_well_formed: 92.5
error_outputs: 84
num_malformed_responses: 19
@@ -691,6 +691,7 @@
- dirname: 2024-07-24-06-30-29--llama-405b-whole
test_cases: 133
model: llama-3.1-405b-instruct (whole)
+ released: 2024-07-23
edit_format: whole
commit_hash: a362dea-dirty
pass_rate_1: 48.9
@@ -698,7 +699,6 @@
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
- released: 2024-07-23
num_with_malformed_responses: 0
user_asks: 0
lazy_comments: 0
@@ -770,7 +770,7 @@
percent_cases_well_formed: 100.0
error_outputs: 27
num_malformed_responses: 0
- released: 2024-07-23
+ _released: 2024-07-23
num_with_malformed_responses: 0
user_asks: 23
lazy_comments: 8
@@ -796,7 +796,7 @@
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 0
- released: 2024-07-23
+ _released: 2024-07-23
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
@@ -946,7 +946,7 @@
versions: 0.54.13.dev
seconds_per_case: 8.3
total_cost: 0.0000
- released: 2024-09-04
+ _released: 2024-09-04
- dirname: 2024-09-04-16-17-33--yi-coder-9b-chat-q4_0-whole
test_cases: 133
@@ -973,6 +973,7 @@
- dirname: 2024-09-05-14-50-11--deepseek-sep5-no-shell
test_cases: 133
+ released: 2024-09-05
model: DeepSeek V2.5
edit_format: diff
commit_hash: 1279c86
@@ -1112,6 +1113,7 @@
- dirname: 2024-09-21-16-45-11--o1-preview-flex-sr-markers
test_cases: 133
model: o1-preview
+ released: 2024-09-12
edit_format: diff
commit_hash: 5493654-dirty
pass_rate_1: 57.9
@@ -1477,6 +1479,7 @@
- dirname: 2024-10-04-16-30-08--chatgpt-4o-latest-diff-oct4
test_cases: 133
model: openai/chatgpt-4o-latest
+ released: 2024-10-04
edit_format: diff
commit_hash: af10953
pass_rate_1: 56.4
@@ -1592,6 +1595,7 @@
- dirname: 2024-10-22-17-45-28--sonnet-1022-diff-fixed-model-settings
test_cases: 133
model: claude-3-5-sonnet-20241022
+ released: 2024-10-22
edit_format: diff
commit_hash: 3b14eb9
pass_rate_1: 69.2
@@ -1615,6 +1619,7 @@
- dirname: 2024-11-04-19-19-32--haiku35-diff-ex-as-sys-false
test_cases: 133
model: claude-3-5-haiku-20241022
+ released: 2024-10-22
edit_format: diff
commit_hash: 03bbdb0-dirty
pass_rate_1: 61.7
@@ -1773,32 +1778,10 @@
seconds_per_case: 18.3
total_cost: 0.0000
-- dirname: 2024-11-09-10-57-11--Qwen2.5-Coder-32B-Instruct
- test_cases: 133
- model: Qwen2.5-Coder-32B-Instruct (whole)
- edit_format: whole
- commit_hash: ec9982a
- pass_rate_1: 60.9
- pass_rate_2: 73.7
- percent_cases_well_formed: 100.0
- error_outputs: 1
- num_malformed_responses: 0
- num_with_malformed_responses: 0
- user_asks: 1
- lazy_comments: 0
- syntax_errors: 0
- indentation_errors: 0
- exhausted_context_windows: 1
- test_timeouts: 1
- command: aider --model openai/Qwen2.5-Coder-32B-Instruct
- date: 2024-11-09
- versions: 0.59.2.dev
- seconds_per_case: 26.6
- total_cost: 0.0000
-
- dirname: 2024-11-09-11-09-15--Qwen2.5-Coder-32B-Instruct
test_cases: 133
model: Qwen2.5-Coder-32B-Instruct (diff)
+ released: 2024-11-12
edit_format: diff
commit_hash: ec9982a
pass_rate_1: 59.4
@@ -1822,6 +1805,7 @@
- dirname: 2024-11-20-14-57-11--mistral-2411-direct-diff
test_cases: 133
model: Mistral Large (2411)
+ released: 2024-11-18
edit_format: diff
commit_hash: dba844c
pass_rate_1: 46.6
@@ -1845,6 +1829,7 @@
- dirname: 2024-11-20-19-28-30--gpt-4o-2024-11-20
test_cases: 133
model: gpt-4o-2024-11-20
+ released: 2024-11-20
edit_format: diff
commit_hash: 2ac0776-dirty
pass_rate_1: 58.6
diff --git a/aider/website/assets/models-over-time.png b/aider/website/assets/models-over-time.png
index eaed94a53d03e3b2056d23bd149269f28dad82fd..143feb7c66de334450d84a72a8d651ff90b248d0 100644
GIT binary patch
literal 158447
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 {N
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