From 9e548988666c5ce1bcc81e74197b5c2284e5bf86 Mon Sep 17 00:00:00 2001
From: zjy1412
Date: Thu, 17 Apr 2025 14:30:13 +0800
Subject: [PATCH 01/66] fix: correctly detect edit blocks in diff-fenced mode
---
aider/coders/editblock_coder.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/aider/coders/editblock_coder.py b/aider/coders/editblock_coder.py
index 321a6a921..4d7776278 100644
--- a/aider/coders/editblock_coder.py
+++ b/aider/coders/editblock_coder.py
@@ -454,7 +454,10 @@ def find_original_update_blocks(content, fence=DEFAULT_FENCE, valid_fnames=None)
"```csh",
"```tcsh",
]
- next_is_editblock = i + 1 < len(lines) and head_pattern.match(lines[i + 1].strip())
+
+ # Check if the next line or the one after that is an editblock
+ next_is_editblock = (i + 1 < len(lines) and head_pattern.match(lines[i + 1].strip())
+ or i + 2 < len(lines) and head_pattern.match(lines[i + 2].strip()))
if any(line.strip().startswith(start) for start in shell_starts) and not next_is_editblock:
shell_content = []
From a564f94bf34ef9611f14fda40640ffc4aaf64423 Mon Sep 17 00:00:00 2001
From: zjy1412
Date: Thu, 17 Apr 2025 16:50:54 +0800
Subject: [PATCH 02/66] Added two test cases
---
tests/basic/test_editblock.py | 63 +++++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/tests/basic/test_editblock.py b/tests/basic/test_editblock.py
index 0a1f1bf5b..d80952bbe 100644
--- a/tests/basic/test_editblock.py
+++ b/tests/basic/test_editblock.py
@@ -575,6 +575,69 @@ Hope you like it!
edits = list(eb.find_original_update_blocks(edit, fence=quad_backticks))
self.assertEqual(edits, [("foo.txt", "", "Tooooo\n")])
+ #Test for shell script blocks with sh language identifier (issue #3785)
+ def test_find_original_update_blocks_with_sh_language_identifier(self):
+ # https://github.com/Aider-AI/aider/issues/3785
+ edit = """
+Here's a shell script:
+
+```sh
+test_hello.sh
+<<<<<<< SEARCH
+=======
+#!/bin/bash
+# Check if exactly one argument is provided
+if [ "$#" -ne 1 ]; then
+ echo "Usage: $0 " >&2
+ exit 1
+fi
+
+# Echo the first argument
+echo "$1"
+
+exit 0
+>>>>>>> REPLACE
+```
+"""
+
+ edits = list(eb.find_original_update_blocks(edit))
+ # Instead of comparing exact strings, check that we got the right file and structure
+ self.assertEqual(len(edits), 1)
+ self.assertEqual(edits[0][0], "test_hello.sh")
+ self.assertEqual(edits[0][1], "")
+
+ # Check that the content contains the expected shell script elements
+ result_content = edits[0][2]
+ self.assertIn("#!/bin/bash", result_content)
+ self.assertIn("if [ \"$#\" -ne 1 ];", result_content)
+ self.assertIn("echo \"Usage: $0 \"", result_content)
+ self.assertIn("exit 1", result_content)
+ self.assertIn("echo \"$1\"", result_content)
+ self.assertIn("exit 0", result_content)
+
+ #Test for C# code blocks with csharp language identifier
+ def test_find_original_update_blocks_with_csharp_language_identifier(self):
+ edit = """
+Here's a C# code change:
+
+```csharp
+Program.cs
+<<<<<<< SEARCH
+Console.WriteLine("Hello World!");
+=======
+Console.WriteLine("Hello, C# World!");
+>>>>>>> REPLACE
+```
+"""
+
+ edits = list(eb.find_original_update_blocks(edit))
+ search_text = "Console.WriteLine(\"Hello World!\");\n"
+ replace_text = "Console.WriteLine(\"Hello, C# World!\");\n"
+ self.assertEqual(
+ edits,
+ [("Program.cs", search_text, replace_text)]
+ )
+
if __name__ == "__main__":
unittest.main()
From 8e689d35af11807105b546a68ccc8c839707055b Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 17 Apr 2025 20:01:26 -0700
Subject: [PATCH 03/66] Feat: Add --reasoning-effort switch to benchmark script
---
benchmark/benchmark.py | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index f05c4b039..eaf3d25e6 100755
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -206,6 +206,9 @@ def main(
read_model_settings: str = typer.Option(
None, "--read-model-settings", help="Load aider model settings from YAML file"
),
+ reasoning_effort: Optional[float] = typer.Option(
+ None, "--reasoning-effort", help="Set reasoning effort for models that support it"
+ ),
exercises_dir: str = typer.Option(
EXERCISES_DIR_DEFAULT, "--exercises-dir", help="Directory with exercise files"
),
@@ -362,6 +365,7 @@ def main(
editor_edit_format,
num_ctx,
sleep,
+ reasoning_effort,
)
all_results.append(results)
@@ -384,6 +388,7 @@ def main(
replay,
editor_model,
editor_edit_format,
+ reasoning_effort,
)
all_results = run_test_threaded.gather(tqdm=True)
@@ -481,6 +486,7 @@ def summarize_results(dirname, stats_languages=None):
res.indentation_errors = 0
res.lazy_comments = 0
+ res.reasoning_effort = None
variants = defaultdict(set)
for results in all_results:
@@ -509,7 +515,10 @@ def summarize_results(dirname, stats_languages=None):
res.syntax_errors += results.get("syntax_errors", 0)
res.indentation_errors += results.get("indentation_errors", 0)
+ res.reasoning_effort = results.get("reasoning_effort")
+
for key in "model edit_format commit_hash editor_model editor_edit_format".split():
+
val = results.get(key)
if val:
variants[key].add(val)
@@ -552,6 +561,9 @@ def summarize_results(dirname, stats_languages=None):
setattr(res, key, val)
console.print(f" {key}: {val}", style=style)
+ if res.reasoning_effort is not None:
+ print(f" reasoning_effort: {res.reasoning_effort}")
+
for i in range(tries):
print(f" pass_rate_{i + 1}: {percents[i]:.1f}")
for i in range(tries):
@@ -663,6 +675,7 @@ def run_test_real(
editor_edit_format,
num_ctx=None,
sleep=0,
+ reasoning_effort=None,
read_model_settings=None,
):
if not os.path.isdir(testdir):
@@ -769,6 +782,9 @@ def run_test_real(
editor_edit_format=editor_edit_format,
)
+ if reasoning_effort is not None:
+ main_model.set_reasoning_effort(reasoning_effort)
+
dump(main_model.max_chat_history_tokens)
if num_ctx:
@@ -919,6 +935,7 @@ def run_test_real(
syntax_errors=syntax_errors,
indentation_errors=indentation_errors,
lazy_comments=lazy_comments, # Add the count of pattern matches to the results
+ reasoning_effort=reasoning_effort,
chat_hashes=list(
zip(
coder.chat_completion_call_hashes,
From ec9327dcb46ded96a4fe93869e602e1b00d1ff36 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 17 Apr 2025 20:01:30 -0700
Subject: [PATCH 04/66] style: Apply linter to benchmark.py
---
benchmark/benchmark.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index eaf3d25e6..f13cb2cb1 100755
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -518,7 +518,6 @@ def summarize_results(dirname, stats_languages=None):
res.reasoning_effort = results.get("reasoning_effort")
for key in "model edit_format commit_hash editor_model editor_edit_format".split():
-
val = results.get(key)
if val:
variants[key].add(val)
From 5c8150fd160f6ac39db6bc76c6530dbeefaf2895 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 17 Apr 2025 20:02:09 -0700
Subject: [PATCH 05/66] fix: Change reasoning_effort type to string in
benchmark script
---
benchmark/benchmark.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index f13cb2cb1..1ce34a002 100755
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -206,7 +206,7 @@ def main(
read_model_settings: str = typer.Option(
None, "--read-model-settings", help="Load aider model settings from YAML file"
),
- reasoning_effort: Optional[float] = typer.Option(
+ reasoning_effort: Optional[str] = typer.Option(
None, "--reasoning-effort", help="Set reasoning effort for models that support it"
),
exercises_dir: str = typer.Option(
@@ -674,7 +674,7 @@ def run_test_real(
editor_edit_format,
num_ctx=None,
sleep=0,
- reasoning_effort=None,
+ reasoning_effort: Optional[str] = None,
read_model_settings=None,
):
if not os.path.isdir(testdir):
From 05eaf82b36509e6207ce0852ba077e0e52a8bc67 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 17 Apr 2025 20:02:31 -0700
Subject: [PATCH 06/66] feat: Pass verbose flag to Model class for detailed
output
---
benchmark/benchmark.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index 1ce34a002..18799cdf2 100755
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -779,6 +779,7 @@ def run_test_real(
weak_model=weak_model_name,
editor_model=editor_model,
editor_edit_format=editor_edit_format,
+ verbose=verbose,
)
if reasoning_effort is not None:
From 622bf349c50a679b66285457b250582c18533713 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 17 Apr 2025 20:08:57 -0700
Subject: [PATCH 07/66] chore: Add num_ctx and sleep to
run_test_threaded.gather arguments
---
benchmark/benchmark.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index 18799cdf2..71d3cec3e 100755
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -388,6 +388,8 @@ def main(
replay,
editor_model,
editor_edit_format,
+ num_ctx,
+ sleep,
reasoning_effort,
)
all_results = run_test_threaded.gather(tqdm=True)
From 541b496d0914b7546a2365a9ac7121785b1eccb8 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 17 Apr 2025 20:19:52 -0700
Subject: [PATCH 08/66] feat: Allow multiple update/delete actions for the same
file in patch coder
---
aider/coders/patch_coder.py | 49 ++++++++++++++++++++++++++++---------
1 file changed, 38 insertions(+), 11 deletions(-)
diff --git a/aider/coders/patch_coder.py b/aider/coders/patch_coder.py
index 2e9497bc9..802e6b9c3 100644
--- a/aider/coders/patch_coder.py
+++ b/aider/coders/patch_coder.py
@@ -312,11 +312,8 @@ class PatchCoder(Coder):
index += 1
if not path:
raise DiffError("Update File action missing path.")
- if path in patch.actions:
- raise DiffError(f"Duplicate action for file: {path}")
- if path not in current_files:
- raise DiffError(f"Update File Error - missing file content for: {path}")
+ # Optional move target
move_to = None
if index < len(lines) and _norm(lines[index]).startswith("*** Move to: "):
move_to = _norm(lines[index])[len("*** Move to: ") :].strip()
@@ -324,12 +321,36 @@ class PatchCoder(Coder):
if not move_to:
raise DiffError("Move to action missing path.")
+ if path not in current_files:
+ raise DiffError(f"Update File Error - missing file content for: {path}")
+
file_content = current_files[path]
- action, index, fuzz = self._parse_update_file_sections(lines, index, file_content)
- action.path = path # Ensure path is set
- action.move_path = move_to
- patch.actions[path] = action
- fuzz_accumulator += fuzz
+
+ existing_action = patch.actions.get(path)
+ if existing_action is not None:
+ # Merge additional UPDATE block into the existing one
+ if existing_action.type != ActionType.UPDATE:
+ raise DiffError(f"Conflicting actions for file: {path}")
+
+ new_action, index, fuzz = self._parse_update_file_sections(
+ lines, index, file_content
+ )
+ existing_action.chunks.extend(new_action.chunks)
+
+ if move_to:
+ if existing_action.move_path and existing_action.move_path != move_to:
+ raise DiffError(f"Conflicting move targets for file: {path}")
+ existing_action.move_path = move_to
+ fuzz_accumulator += fuzz
+ else:
+ # First UPDATE block for this file
+ action, index, fuzz = self._parse_update_file_sections(
+ lines, index, file_content
+ )
+ action.path = path
+ action.move_path = move_to
+ patch.actions[path] = action
+ fuzz_accumulator += fuzz
continue
# ---------- DELETE ---------- #
@@ -338,8 +359,14 @@ class PatchCoder(Coder):
index += 1
if not path:
raise DiffError("Delete File action missing path.")
- if path in patch.actions:
- raise DiffError(f"Duplicate action for file: {path}")
+ existing_action = patch.actions.get(path)
+ if existing_action:
+ if existing_action.type == ActionType.DELETE:
+ # Duplicate delete – ignore the extra block
+ self.io.tool_warning(f"Duplicate delete action for file: {path} ignored.")
+ continue
+ else:
+ raise DiffError(f"Conflicting actions for file: {path}")
if path not in current_files:
raise DiffError(
f"Delete File Error - file not found: {path}"
From c08336fdb086b3edab97870b1361a52a62e9180f Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 17 Apr 2025 20:23:16 -0700
Subject: [PATCH 09/66] feat: Update prompts to request one block per file in
patches
---
aider/coders/patch_prompts.py | 82 +++++++++++++++++++++--------------
1 file changed, 49 insertions(+), 33 deletions(-)
diff --git a/aider/coders/patch_prompts.py b/aider/coders/patch_prompts.py
index a2deddc24..830a04f2b 100644
--- a/aider/coders/patch_prompts.py
+++ b/aider/coders/patch_prompts.py
@@ -5,6 +5,9 @@ from .editblock_prompts import EditBlockPrompts
class PatchPrompts(EditBlockPrompts):
+ # --------------------------------------------------------------------- #
+ # SYSTEM PROMPT
+ # --------------------------------------------------------------------- #
main_system = """Act as an expert software developer.
Always use best practices when coding.
Respect and use existing conventions, libraries, etc that are already present in the code base.
@@ -18,44 +21,47 @@ Once you understand the request you MUST:
1. Decide if you need to propose edits to any files that haven't been added to the chat. You can create new files without asking!
-But if you need to propose edits to existing files not already added to the chat, you *MUST* tell the user their full path names and ask them to *add the files to the chat*.
-End your reply and wait for their approval.
-You can keep asking if you then decide you need to edit more files.
+ • If you need to propose edits to existing files not already added to the chat, you *MUST* tell the user their full path names and ask them to *add the files to the chat*.
+ • End your reply and wait for their approval.
+ • You can keep asking if you then decide you need to edit more files.
-2. Think step-by-step and explain the needed changes in a few short sentences.
+2. Think step‑by‑step and explain the needed changes in a few short sentences.
3. Describe the changes using the V4A diff format, enclosed within `*** Begin Patch` and `*** End Patch` markers.
-All changes to files must use the V4A diff format specified in the examples and reminder section.
-ONLY EVER RETURN CODE IN THE SPECIFIED V4A DIFF FORMAT!
+IMPORTANT: Each file MUST appear only once in the patch.
+Consolidate **all** edits for a given file into a single `*** [ACTION] File:` block.
{shell_cmd_prompt}
"""
+ # --------------------------------------------------------------------- #
+ # EXAMPLE MESSAGES
+ # --------------------------------------------------------------------- #
example_messages = [
+ # --- Example 1 ---------------------------------------------------- #
dict(
role="user",
content="Change get_factorial() to use math.factorial",
),
dict(
role="assistant",
- content="""To make this change we need to modify `mathweb/flask/app.py` to:
+ content="""To make this change we need to modify `mathweb/flask/app.py`:
-1. Import the math package.
-2. Remove the existing factorial() function.
-3. Update get_factorial() to call math.factorial instead.
+1. Import the `math` module.
+2. Replace the custom recursive `factorial()` helper with `math.factorial`.
+3. Update `get_factorial()` to call `math.factorial`.
Here is the patch:
*** Begin Patch
*** Update File: mathweb/flask/app.py
-@@ class MathWeb:
- from flask import Flask
-
- import math
- from flask import Flask
-
-*** Update File: mathweb/flask/app.py
-@@ def get_factorial(self, n):
+@@
+-from flask import Flask
+-
+-from flask import Flask
++from flask import Flask
++import math
+@@
-def factorial(n):
- "compute factorial"
-
@@ -63,26 +69,27 @@ Here is the patch:
- return 1
- else:
- return n * factorial(n-1)
--
-
-*** Update File: mathweb/flask/app.py
++def factorial(n):
++ "compute factorial"
++
++ return math.factorial(n)
@@ def get_factorial(self, n):
- return str(factorial(n))
+ return str(math.factorial(n))
-
*** End Patch
""",
),
+ # --- Example 2 ---------------------------------------------------- #
dict(
role="user",
content="Refactor hello() into its own file.",
),
dict(
role="assistant",
- content="""To make this change we need to modify `main.py` and make a new file `hello.py`:
+ content="""To make this change we need to modify `main.py` and create a new file `hello.py`:
-1. Make a new hello.py file with hello() in it.
-2. Remove hello() from main.py and replace it with an import.
+1. Create `hello.py` with the `hello()` function.
+2. Remove `hello()` from `main.py` and import it instead.
Here is the patch:
@@ -93,20 +100,21 @@ Here is the patch:
+ "print a greeting"
+
+ print("hello")
-
*** Update File: main.py
-@@ def main():
+@@
-def hello():
- "print a greeting"
-
- print("hello")
+from hello import hello
-
*** End Patch
""",
),
]
+ # --------------------------------------------------------------------- #
+ # SYSTEM REMINDER
+ # --------------------------------------------------------------------- #
system_reminder = """# V4A Diff Format Rules:
Your entire response containing the patch MUST start with `*** Begin Patch` on a line by itself.
@@ -114,10 +122,18 @@ Your entire response containing the patch MUST end with `*** End Patch` on a lin
Use the *FULL* file path, as shown to you by the user.
{quad_backtick_reminder}
+
For each file you need to modify, start with a marker line:
-`*** [ACTION] File: [path/to/file]`
+
+ *** [ACTION] File: [path/to/file]
+
Where `[ACTION]` is one of `Add`, `Update`, or `Delete`.
-Use the *FULL* file path, as shown to you by the user.
+
+⇨ **Each file MUST appear only once in the patch.**
+ Consolidate all changes for that file into the same block.
+ If you are moving code within a file, include both the deletions and the
+ insertions as separate hunks inside this single `*** Update File:` block
+ (do *not* open a second block for the same file).
For `Update` actions, describe each snippet of code that needs to be changed using the following format:
1. Context lines: Include 3 lines of context *before* the change. These lines MUST start with a single space ` `.
@@ -132,9 +148,9 @@ Do not include line numbers.
Only create patches for files that the user has added to the chat!
-To move code within a file, use two `*** Update File:` sections: one to delete the code (using `-` lines) from its original location, and another to add the code (using `+` lines) in the new location.
-
-Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.
+When moving code *within* a single file, keep everything inside one
+`*** Update File:` block. Provide one hunk that deletes the code from its
+original location and another hunk that inserts it at the new location.
For `Add` actions, use the `*** Add File: [path/to/new/file]` marker, followed by the lines of the new file, each preceded by a plus sign `+`.
From a4d32221086968c2f6dd5ce77b754e3981f5c076 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sat, 19 Apr 2025 11:27:50 -0700
Subject: [PATCH 10/66] feat: Add openhands-lm-32b-v0.1 to polyglot leaderboard
data
---
aider/website/_data/polyglot_leaderboard.yml | 28 +++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 40340a4d9..5d7c651ae 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1171,4 +1171,30 @@
date: 2025-04-17
versions: 0.82.2.dev
seconds_per_case: 110.0
- total_cost: 69.2921
\ No newline at end of file
+ total_cost: 69.2921
+
+- dirname: 2025-04-19-14-43-04--o4-mini-patch
+ test_cases: 225
+ model: openhands-lm-32b-v0.1
+ edit_format: whole
+ commit_hash: c08336f
+ pass_rate_1: 4.0
+ pass_rate_2: 10.2
+ pass_num_1: 9
+ pass_num_2: 23
+ percent_cases_well_formed: 95.1
+ error_outputs: 55
+ num_malformed_responses: 41
+ num_with_malformed_responses: 11
+ user_asks: 166
+ lazy_comments: 0
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 0
+ test_timeouts: 11
+ total_tests: 225
+ command: aider --model openrouter/all-hands/openhands-lm-32b-v0.1
+ date: 2025-04-19
+ versions: 0.82.2.dev
+ seconds_per_case: 195.6
+ total_cost: 0.0000
\ No newline at end of file
From 851642a1bd10c031d75a179e64e7322b056a20b7 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 08:13:04 -0700
Subject: [PATCH 11/66] copy
---
aider/website/assets/sample-analytics.jsonl | 184 ++++++++++----------
aider/website/docs/faq.md | 19 +-
aider/website/docs/leaderboards/index.md | 2 +-
aider/website/index.html | 2 +-
4 files changed, 106 insertions(+), 101 deletions(-)
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 6400c1af4..6f29aa337 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,95 +1,3 @@
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566707}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566733}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 12803, "completion_tokens": 139, "total_tokens": 12942, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566740}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566786}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 12987, "completion_tokens": 136, "total_tokens": 13123, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566791}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566810}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566816}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 13178, "completion_tokens": 140, "total_tokens": 13318, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566819}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566850}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566850}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 11062, "completion_tokens": 402, "total_tokens": 11464, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744566861}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567566}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567566}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 11501, "completion_tokens": 1553, "total_tokens": 13054, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567603}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567635}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567635}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 13895, "completion_tokens": 949, "total_tokens": 14844, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567657}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567690}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 17147, "completion_tokens": 212, "total_tokens": 17359, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567696}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567721}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 17497, "completion_tokens": 325, "total_tokens": 17822, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744567728}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744569988}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570117}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570118}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570118}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570118}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570121}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570126}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570189}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 13271, "completion_tokens": 1131, "total_tokens": 14402, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570209}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570237}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 14632, "completion_tokens": 402, "total_tokens": 15034, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570244}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570276}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 15122, "completion_tokens": 582, "total_tokens": 15704, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570283}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570355}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 15762, "completion_tokens": 477, "total_tokens": 16239, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570368}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570433}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570674}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 16325, "completion_tokens": 278, "total_tokens": 16603, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570682}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744570742}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573244}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573245}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573245}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573245}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573247}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573251}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573277}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 13149, "completion_tokens": 308, "total_tokens": 13457, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573288}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573331}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 13550, "completion_tokens": 295, "total_tokens": 13845, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573337}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573353}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573393}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 13891, "completion_tokens": 215, "total_tokens": 14106, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573397}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573433}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 14157, "completion_tokens": 336, "total_tokens": 14493, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744573441}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576312}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 14544, "completion_tokens": 1568, "total_tokens": 16112, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576328}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576329}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 17358, "completion_tokens": 970, "total_tokens": 18328, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576347}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576348}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 18744, "completion_tokens": 533, "total_tokens": 19277, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576356}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576356}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 19828, "completion_tokens": 551, "total_tokens": 20379, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576365}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576393}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576394}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576396}
-{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576400}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576403}
-{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576412}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576414}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 13408, "completion_tokens": 1539, "total_tokens": 14947, "cost": 0.063309, "total_cost": 0.063309}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576445}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576446}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 14864, "completion_tokens": 104, "total_tokens": 14968, "cost": 0.046152, "total_cost": 0.109461}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576451}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576513}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 15024, "completion_tokens": 1795, "total_tokens": 16819, "cost": 0.071997, "total_cost": 0.181458}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576546}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576606}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 17246, "completion_tokens": 618, "total_tokens": 17864, "cost": 0.061008, "total_cost": 0.24246600000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576620}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576661}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 18009, "completion_tokens": 640, "total_tokens": 18649, "cost": 0.063627, "total_cost": 0.306093}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576675}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576709}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 18842, "completion_tokens": 296, "total_tokens": 19138, "cost": 0.060966, "total_cost": 0.367059}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576718}
-{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576737}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576751}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576759}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19188, "completion_tokens": 293, "total_tokens": 19481, "cost": 0.06195900000000001, "total_cost": 0.429018}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576768}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576776}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19549, "completion_tokens": 263, "total_tokens": 19812, "cost": 0.06259200000000001, "total_cost": 0.49161}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576784}
-{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576793}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576812}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576827}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576945}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19840, "completion_tokens": 211, "total_tokens": 20051, "cost": 0.062685, "total_cost": 0.554295}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744576953}
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577003}
{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19980, "completion_tokens": 209, "total_tokens": 20189, "cost": 0.063075, "total_cost": 0.61737}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577011}
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577039}
@@ -998,3 +906,95 @@
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855212}
{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 6080, "completion_tokens": 477, "total_tokens": 6557, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855217}
{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855261}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916060}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916063}
+{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916064}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916070}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916073}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916073}
+{"event": "cli session", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916073}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916074}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916083}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916085}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916085}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916085}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 593, "completion_tokens": 13, "total_tokens": 606, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916086}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744916086}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744942667}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744942668}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744942668}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744942668}
+{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744942675}
+{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744942678}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744942692}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945174}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945175}
+{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945188}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945258}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945258}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945258}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945258}
+{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945263}
+{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945267}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945274}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 20283, "completion_tokens": 661, "total_tokens": 20944, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945285}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945322}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 21131, "completion_tokens": 177, "total_tokens": 21308, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945329}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945347}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 21364, "completion_tokens": 68, "total_tokens": 21432, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945350}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945722}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945734}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945735}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945735}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744945738}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946266}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946266}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946266}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946266}
+{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946269}
+{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946278}
+{"event": "command_reasoning-effort", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946283}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946291}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946291}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 14950, "completion_tokens": 889, "total_tokens": 15839, "cost": 0.18506000000000003, "total_cost": 0.18506000000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946304}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946345}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 16775, "completion_tokens": 5498, "total_tokens": 22273, "cost": 0.38767, "total_cost": 0.5727300000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946391}
+{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946424}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946440}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946440}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 17168, "completion_tokens": 1504, "total_tokens": 18672, "cost": 0.23184000000000005, "total_cost": 0.8045700000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946459}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946483}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19187, "completion_tokens": 683, "total_tokens": 19870, "cost": 0.21919000000000002, "total_cost": 1.0237600000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946496}
+{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946545}
+{"event": "command_chat-mode", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946557}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946572}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "whole", "prompt_tokens": 16552, "completion_tokens": 2609, "total_tokens": 19161, "cost": 0.26988, "total_cost": 1.2936400000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946592}
+{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946606}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744946701}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745087266}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745087267}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745087267}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745087270}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745113992}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745113992}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745113992}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745113992}
+{"event": "command_help", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745113994}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745114112}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161720}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161720}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161720}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161720}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 1149, "completion_tokens": 23, "total_tokens": 1172, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161736}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161736}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161749}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161783}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161785}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161785}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161785}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161788}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161799}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161817}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161817}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161817}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161818}
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index b86aaf0c3..d76f5846e 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -264,15 +264,20 @@ tr:hover { background-color: #f5f5f5; }
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 2,756,387 | 83.5% |
-openrouter/anthropic/claude-3.7-sonnet | 475,106 | 14.4% |
-gemini/gemini-2.5-pro-preview-03-25 | 16,524 | 0.5% |
-o4-mini | 16,499 | 0.5% |
+gemini/gemini-2.5-pro-exp-03-25 | 2,499,338 | 83.9% |
+openrouter/anthropic/claude-3.7-sonnet | 313,377 | 10.5% |
+o3 | 100,777 | 3.4% |
+gemini/gemini-2.5-pro-preview-03-25 | 16,524 | 0.6% |
+o4-mini | 16,499 | 0.6% |
gpt-4.1-mini | 11,775 | 0.4% |
-gpt-4.1 | 10,687 | 0.3% |
-None | 8,001 | 0.2% |
-o3 | 4,962 | 0.2% |
+gpt-4.1 | 10,687 | 0.4% |
+None | 8,001 | 0.3% |
+gemini/REDACTED | 606 | 0.0% |
+
+{: .note :}
+Some models show as REDACTED, because they are new or unpopular models.
+Aider's analytics only records the names of "well known" LLMs.
## How are the "aider wrote xx% of code" stats computed?
diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md
index a76de0bbd..8d54e0bf5 100644
--- a/aider/website/docs/leaderboards/index.md
+++ b/aider/website/docs/leaderboards/index.md
@@ -285,6 +285,6 @@ mod_dates = [get_last_modified_date(file) for file in files]
latest_mod_date = max(mod_dates)
cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}")
]]]-->
-April 16, 2025.
+April 19, 2025.
diff --git a/aider/website/index.html b/aider/website/index.html
index badfbd0ea..80611f3a9 100644
--- a/aider/website/index.html
+++ b/aider/website/index.html
@@ -69,7 +69,7 @@ cog.out(text)
]]]-->
⭐ GitHub Stars
- 31K
+ 32K
📦 Installs
From 888168f044a725479ef7766e14a346299b5d826b Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 08:21:33 -0700
Subject: [PATCH 12/66] copy
---
aider/website/docs/leaderboards/index.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md
index 8d54e0bf5..fa03fb2d7 100644
--- a/aider/website/docs/leaderboards/index.md
+++ b/aider/website/docs/leaderboards/index.md
@@ -285,6 +285,6 @@ mod_dates = [get_last_modified_date(file) for file in files]
latest_mod_date = max(mod_dates)
cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}")
]]]-->
-April 19, 2025.
+April 20, 2025.
From 20a7e3552c55dbb77b0a54e5137d4f5c0b1d94db Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 08:26:22 -0700
Subject: [PATCH 13/66] version bump to 0.82.2
---
aider/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/__init__.py b/aider/__init__.py
index 4f91e3f8a..28c763232 100644
--- a/aider/__init__.py
+++ b/aider/__init__.py
@@ -1,6 +1,6 @@
from packaging import version
-__version__ = "0.82.2.dev"
+__version__ = "0.82.2"
safe_version = __version__
try:
From c2d8d5dc82dbf07cc33811795c213a0a056fb83b Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 08:26:25 -0700
Subject: [PATCH 14/66] set version to 0.82.3.dev
---
aider/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/__init__.py b/aider/__init__.py
index 28c763232..825bf0439 100644
--- a/aider/__init__.py
+++ b/aider/__init__.py
@@ -1,6 +1,6 @@
from packaging import version
-__version__ = "0.82.2"
+__version__ = "0.82.3.dev"
safe_version = __version__
try:
From ec7ac60cfcaa3c7250558d19736f7aac975717e9 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 08:54:44 -0700
Subject: [PATCH 15/66] copy
---
HISTORY.md | 7 +
aider/website/HISTORY.md | 7 +
aider/website/assets/sample-analytics.jsonl | 214 ++++++++++----------
aider/website/docs/faq.md | 16 +-
4 files changed, 129 insertions(+), 115 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index 99398aa22..f3f839e7d 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,6 +1,13 @@
# Release history
+### Aider v0.82.2
+
+- Fix editing shell files with diff-fenced, by zjy1412.
+- Improve robustness of patch application by allowing multiple update/delete actions for the same file within a single response.
+- Update prompts to instruct LLMs to consolidate all edits for a given file into a single block within the patch.
+
### Aider v0.82.1
+
- Added support for `o3` and `o4-mini` including provider-specific versions for OpenAI, OpenRouter, and Azure.
- Added support for Azure specific `gpt-4.1` and `gpt-4.1-mini` models.
- Disabled streaming for `o3` models since you need identity verification to stream.
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index 20b70ec6a..fa3fdcb22 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -24,7 +24,14 @@ cog.out(text)
]]]-->
+### Aider v0.82.2
+
+- Fix editing shell files with diff-fenced, by zjy1412.
+- Improve robustness of patch application by allowing multiple update/delete actions for the same file within a single response.
+- Update prompts to instruct LLMs to consolidate all edits for a given file into a single block within the patch.
+
### Aider v0.82.1
+
- Added support for `o3` and `o4-mini` including provider-specific versions for OpenAI, OpenRouter, and Azure.
- Added support for Azure specific `gpt-4.1` and `gpt-4.1-mini` models.
- Disabled streaming for `o3` models since you need identity verification to stream.
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 6f29aa337..3c18d8c53 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,110 +1,3 @@
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577003}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19980, "completion_tokens": 209, "total_tokens": 20189, "cost": 0.063075, "total_cost": 0.61737}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577011}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577039}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577050}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 20284, "completion_tokens": 562, "total_tokens": 20846, "cost": 0.06928200000000001, "total_cost": 0.686652}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577062}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577094}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 20748, "completion_tokens": 570, "total_tokens": 21318, "cost": 0.070794, "total_cost": 0.7574460000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577107}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577148}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577199}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577199}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 18851, "completion_tokens": 341, "total_tokens": 19192, "cost": 0.061668, "total_cost": 0.8191140000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577212}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577284}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 21544, "completion_tokens": 921, "total_tokens": 22465, "cost": 0.07844699999999999, "total_cost": 0.897561}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577304}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577305}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 23437, "completion_tokens": 960, "total_tokens": 24397, "cost": 0.084711, "total_cost": 0.982272}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577328}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577329}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 25273, "completion_tokens": 627, "total_tokens": 25900, "cost": 0.085224, "total_cost": 1.067496}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577347}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577348}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577354}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577356}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577390}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 13107, "completion_tokens": 553, "total_tokens": 13660, "cost": 0.047616000000000006, "total_cost": 1.115112}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577401}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577417}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577431}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577441}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 13101, "completion_tokens": 825, "total_tokens": 13926, "cost": 0.051678, "total_cost": 1.1667900000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577458}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577481}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 14119, "completion_tokens": 509, "total_tokens": 14628, "cost": 0.049992, "total_cost": 1.2167820000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577492}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577511}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577529}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 14688, "completion_tokens": 513, "total_tokens": 15201, "cost": 0.051759, "total_cost": 1.2685410000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577541}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577541}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 15982, "completion_tokens": 514, "total_tokens": 16496, "cost": 0.055656000000000004, "total_cost": 1.3241970000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577552}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577622}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 16560, "completion_tokens": 1044, "total_tokens": 17604, "cost": 0.06534000000000001, "total_cost": 1.3895370000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577642}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577666}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 17795, "completion_tokens": 382, "total_tokens": 18177, "cost": 0.059115, "total_cost": 1.4486520000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744577676}
-{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578142}
-{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578142}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578145}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578600}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578601}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578601}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578601}
-{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578602}
-{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578602}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578602}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 14829, "completion_tokens": 515, "total_tokens": 15344, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578625}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578634}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 15859, "completion_tokens": 252, "total_tokens": 16111, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578640}
-{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578711}
-{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578745}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578745}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 31847, "completion_tokens": 913, "total_tokens": 32760, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578766}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578802}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 33028, "completion_tokens": 171, "total_tokens": 33199, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578814}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578882}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 33229, "completion_tokens": 1078, "total_tokens": 34307, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578896}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578896}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 35722, "completion_tokens": 1044, "total_tokens": 36766, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578907}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578914}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 37246, "completion_tokens": 219, "total_tokens": 37465, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578919}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578948}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 37520, "completion_tokens": 523, "total_tokens": 38043, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578959}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578990}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 38220, "completion_tokens": 381, "total_tokens": 38601, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744578997}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579008}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579010}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579011}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579026}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 15395, "completion_tokens": 1022, "total_tokens": 16417, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579035}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579044}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 17097, "completion_tokens": 653, "total_tokens": 17750, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579053}
-{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579710}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579710}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 17585, "completion_tokens": 386, "total_tokens": 17971, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579725}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579761}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 18039, "completion_tokens": 873, "total_tokens": 18912, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579781}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579783}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 19435, "completion_tokens": 254, "total_tokens": 19689, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579793}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579798}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 20006, "completion_tokens": 227, "total_tokens": 20233, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744579804}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744586979}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744586995}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744586995}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 11494, "completion_tokens": 1239, "total_tokens": 12733, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587032}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587133}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587134}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587134}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587134}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587151}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587154}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587155}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587155}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587155}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587176}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 13376, "completion_tokens": 902, "total_tokens": 14278, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587186}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587224}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587226}
-{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587229}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587253}
-{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 13814, "completion_tokens": 296, "total_tokens": 14110, "cost": 0.045882, "total_cost": 0.045882}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587261}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587278}
-{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587283}
-{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587283}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587305}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587305}
{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 13075, "completion_tokens": 2645, "total_tokens": 15720, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587358}
{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591225}
{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591226}
@@ -998,3 +891,110 @@
{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161817}
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161817}
{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745161818}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162550}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162555}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162555}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162555}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162555}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162555}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162556}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162557}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162558}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162558}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162558}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162558}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162558}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162559}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162560}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162561}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162561}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162561}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162561}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162561}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162561}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162562}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162563}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162564}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162564}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162564}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162564}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162620}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162621}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162621}
+{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162621}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162621}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162622}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162622}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162622}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162622}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162754}
+{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162760}
+{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745162760}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163376}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163381}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163381}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163393}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163405}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163405}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163405}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163405}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163407}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 5399, "completion_tokens": 256, "total_tokens": 5655, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163408}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163408}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163508}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163513}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163513}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163513}
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index d76f5846e..71bb34aef 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -264,14 +264,14 @@ tr:hover { background-color: #f5f5f5; }
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 2,499,338 | 83.9% |
-openrouter/anthropic/claude-3.7-sonnet | 313,377 | 10.5% |
-o3 | 100,777 | 3.4% |
-gemini/gemini-2.5-pro-preview-03-25 | 16,524 | 0.6% |
-o4-mini | 16,499 | 0.6% |
-gpt-4.1-mini | 11,775 | 0.4% |
-gpt-4.1 | 10,687 | 0.4% |
-None | 8,001 | 0.3% |
+gemini/gemini-2.5-pro-exp-03-25 | 2,084,414 | 91.2% |
+o3 | 100,777 | 4.4% |
+openrouter/anthropic/claude-3.7-sonnet | 35,268 | 1.5% |
+gemini/gemini-2.5-pro-preview-03-25 | 16,524 | 0.7% |
+o4-mini | 16,499 | 0.7% |
+gpt-4.1-mini | 11,775 | 0.5% |
+gpt-4.1 | 10,687 | 0.5% |
+None | 8,001 | 0.4% |
gemini/REDACTED | 606 | 0.0% |
From 21fa54d792a5ba25e6d93d3e93e7a6004c3c5083 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 10:28:01 -0700
Subject: [PATCH 16/66] Refactor: Update LLM docs to match gemini.md structure
---
aider/website/docs/llms/anthropic.md | 19 +++++++++++------
aider/website/docs/llms/azure.md | 15 +++++++++++--
aider/website/docs/llms/bedrock.md | 25 +++++++++++++++-------
aider/website/docs/llms/cohere.md | 15 ++++++++++---
aider/website/docs/llms/deepseek.md | 15 +++++++++++--
aider/website/docs/llms/groq.md | 15 ++++++++++---
aider/website/docs/llms/lm-studio.md | 21 +++++++++++++-----
aider/website/docs/llms/ollama.md | 20 +++++++++++++-----
aider/website/docs/llms/openai-compat.md | 16 +++++++++++---
aider/website/docs/llms/openai.md | 27 +++++++++++++++---------
aider/website/docs/llms/openrouter.md | 25 +++++++++++-----------
aider/website/docs/llms/vertex.md | 9 +++++++-
aider/website/docs/llms/xai.md | 16 ++++++++++----
13 files changed, 173 insertions(+), 65 deletions(-)
diff --git a/aider/website/docs/llms/anthropic.md b/aider/website/docs/llms/anthropic.md
index cf69ab610..26748b101 100644
--- a/aider/website/docs/llms/anthropic.md
+++ b/aider/website/docs/llms/anthropic.md
@@ -10,21 +10,26 @@ To work with Anthropic's models, you need to provide your
either in the `ANTHROPIC_API_KEY` environment variable or
via the `--anthropic-api-key` command line switch.
-Aider has some built in shortcuts for the most popular Anthropic models and
-has been tested and benchmarked to work well with them:
+First, install aider:
+
+{% include install.md %}
+
+Then configure your API keys:
```
-python -m pip install -U aider-chat
-
export ANTHROPIC_API_KEY= # Mac/Linux
setx ANTHROPIC_API_KEY # Windows, restart shell after setx
+```
+
+Start working with aider and Anthropic on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
# Aider uses Claude 3.7 Sonnet by default
aider
-# Claude 3 Opus
-aider --model claude-3-opus-20240229
-
# List models available from Anthropic
aider --list-models anthropic/
```
diff --git a/aider/website/docs/llms/azure.md b/aider/website/docs/llms/azure.md
index c342ec700..7e20fc83d 100644
--- a/aider/website/docs/llms/azure.md
+++ b/aider/website/docs/llms/azure.md
@@ -7,9 +7,13 @@ nav_order: 500
Aider can connect to the OpenAI models on Azure.
-```
-python -m pip install -U aider-chat
+First, install aider:
+{% include install.md %}
+
+Then configure your API keys and endpoint:
+
+```
# Mac/Linux:
export AZURE_API_KEY=
export AZURE_API_VERSION=2024-12-01-preview
@@ -20,6 +24,13 @@ setx AZURE_API_KEY
setx AZURE_API_VERSION 2024-12-01-preview
setx AZURE_API_BASE https://myendpt.openai.azure.com
# ... restart your shell after setx commands
+```
+
+Start working with aider and Azure on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
aider --model azure/
diff --git a/aider/website/docs/llms/bedrock.md b/aider/website/docs/llms/bedrock.md
index c7705918f..f3e2131c7 100644
--- a/aider/website/docs/llms/bedrock.md
+++ b/aider/website/docs/llms/bedrock.md
@@ -6,10 +6,7 @@ nav_order: 560
# Amazon Bedrock
Aider can connect to models provided by Amazon Bedrock.
-You will need to have an AWS account with access to the Bedrock service.
-
-To configure Aider to use the Amazon Bedrock API, you need to set up your AWS credentials.
-This can be done using the AWS CLI or by setting environment variables.
+You will need to have an AWS account with access to the Bedrock service and the specific models you wish to use.
## Select a Model from Amazon Bedrock
@@ -37,6 +34,14 @@ feature, you will receive an error message like the following:
anthropic.claude-3-7-sonnet-20250219-v1:0 with on-demand throughput isn\xe2\x80\x99t supported. Retry your
request with the ID or ARN of an inference profile that contains this model."}'
+## Installation and Configuration
+
+First, install aider:
+
+{% include install.md %}
+
+Next, configure your AWS credentials. This can be done using the AWS CLI or by setting environment variables.
+
## AWS CLI Configuration
If you haven't already, install the [AWS CLI](https://aws.amazon.com/cli/) and configure it with your credentials:
@@ -49,7 +54,7 @@ This will prompt you to enter your AWS Access Key ID, Secret Access Key, and def
## Environment Variables
-Alternatively, you can set the following environment variables:
+You can set the following environment variables:
```bash
export AWS_REGION=your_preferred_region
@@ -63,7 +68,7 @@ export AWS_PROFILE=your-profile
```
You can add these to your
-[.env file](/docs/config/dotenv.html).
+`.env` file.
### Set Environment Variables with PowerShell
@@ -77,6 +82,8 @@ $env:AWS_REGION = 'us-west-2' # Put whichever AWS region that you'd like, that
## Install boto3
+Aider needs the `boto3` library to connect to Bedrock.
+
The AWS Bedrock provider requires the `boto3` package in order to function correctly:
```bash
@@ -95,12 +102,14 @@ You must install `boto3` dependency to aider's virtual environment installed via
uv tool run --from aider-chat pip install boto3
```
-
-## Running Aider with Bedrock
+## Get Started
Once your AWS credentials are set up, you can run Aider with the `--model` command line switch, specifying the Bedrock model you want to use:
```bash
+# Change directory into your codebase
+cd /to/your/project
+
aider --model bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0
```
diff --git a/aider/website/docs/llms/cohere.md b/aider/website/docs/llms/cohere.md
index 66ab3c842..ce3e1a795 100644
--- a/aider/website/docs/llms/cohere.md
+++ b/aider/website/docs/llms/cohere.md
@@ -10,13 +10,22 @@ Their Command-R+ model works well with aider
as a *very basic* coding assistant.
You'll need a [Cohere API key](https://dashboard.cohere.com/welcome/login).
-To use **Command-R+**:
+First, install aider:
+
+{% include install.md %}
+
+Then configure your API keys:
```
-python -m pip install -U aider-chat
-
export COHERE_API_KEY= # Mac/Linux
setx COHERE_API_KEY # Windows, restart shell after setx
+```
+
+Start working with aider and Cohere on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
aider --model command-r-plus-08-2024
diff --git a/aider/website/docs/llms/deepseek.md b/aider/website/docs/llms/deepseek.md
index 72073c1df..0abbf51a9 100644
--- a/aider/website/docs/llms/deepseek.md
+++ b/aider/website/docs/llms/deepseek.md
@@ -9,11 +9,22 @@ Aider can connect to the DeepSeek.com API.
To work with DeepSeek's models, you need to set the `DEEPSEEK_API_KEY` environment variable with your [DeepSeek API key](https://platform.deepseek.com/api_keys).
The DeepSeek Chat V3 model has a top score on aider's code editing benchmark.
-```
-python -m pip install -U aider-chat
+First, install aider:
+{% include install.md %}
+
+Then configure your API keys:
+
+```
export DEEPSEEK_API_KEY= # Mac/Linux
setx DEEPSEEK_API_KEY # Windows, restart shell after setx
+```
+
+Start working with aider and DeepSeek on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
# Use DeepSeek Chat v3
aider --model deepseek/deepseek-chat
diff --git a/aider/website/docs/llms/groq.md b/aider/website/docs/llms/groq.md
index f258e6848..b8e60e719 100644
--- a/aider/website/docs/llms/groq.md
+++ b/aider/website/docs/llms/groq.md
@@ -10,13 +10,22 @@ The Llama 3 70B model works
well with aider and is comparable to GPT-3.5 in code editing performance.
You'll need a [Groq API key](https://console.groq.com/keys).
-To use **Llama3 70B**:
+First, install aider:
+
+{% include install.md %}
+
+Then configure your API keys:
```
-python -m pip install -U aider-chat
-
export GROQ_API_KEY= # Mac/Linux
setx GROQ_API_KEY # Windows, restart shell after setx
+```
+
+Start working with aider and Groq on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
aider --model groq/llama3-70b-8192
diff --git a/aider/website/docs/llms/lm-studio.md b/aider/website/docs/llms/lm-studio.md
index 909d3afe1..be9e53845 100644
--- a/aider/website/docs/llms/lm-studio.md
+++ b/aider/website/docs/llms/lm-studio.md
@@ -5,11 +5,15 @@ nav_order: 400
# LM Studio
-To use LM Studio:
+Aider can connect to models served by LM Studio.
+
+First, install aider:
+
+{% include install.md %}
+
+Then configure your API key and endpoint:
```
-python -m pip install -U aider-chat
-
# Must set a value here even if its a dummy value
export LM_STUDIO_API_KEY=dummy-api-key # Mac/Linux
setx LM_STUDIO_API_KEY dummy-api-key # Windows, restart shell after setx
@@ -17,12 +21,19 @@ setx LM_STUDIO_API_KEY dummy-api-key # Windows, restart shell after setx
# LM Studio default server URL is http://localhost:1234/v1
export LM_STUDIO_API_BASE=http://localhost:1234/v1 # Mac/Linux
setx LM_STUDIO_API_BASE http://localhost:1234/v1 # Windows, restart shell after setx
-
-aider --model lm_studio/
```
**Note:** Even though LM Studio doesn't require an API Key out of the box the `LM_STUDIO_API_KEY` must have a dummy value like `dummy-api-key` set or the client request will fail trying to send an empty `Bearer` token.
+Start working with aider and LM Studio on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
+
+aider --model lm_studio/
+```
+
See the [model warnings](warnings.html)
section for information on warnings which will occur
when working with models that aider is not familiar with.
diff --git a/aider/website/docs/llms/ollama.md b/aider/website/docs/llms/ollama.md
index 463dc4a3e..a9dbf6c07 100644
--- a/aider/website/docs/llms/ollama.md
+++ b/aider/website/docs/llms/ollama.md
@@ -7,6 +7,19 @@ nav_order: 500
Aider can connect to local Ollama models.
+First, install aider:
+
+{% include install.md %}
+
+Then configure your Ollama API endpoint (usually the default):
+
+```bash
+export OLLAMA_API_BASE=http://127.0.0.1:11434 # Mac/Linux
+setx OLLAMA_API_BASE http://127.0.0.1:11434 # Windows, restart shell after setx
+```
+
+Start working with aider and Ollama on your codebase:
+
```
# Pull the model
ollama pull
@@ -14,11 +27,8 @@ ollama pull
# Start your ollama server, increasing the context window to 8k tokens
OLLAMA_CONTEXT_LENGTH=8192 ollama serve
-# In another terminal window...
-python -m pip install -U aider-chat
-
-export OLLAMA_API_BASE=http://127.0.0.1:11434 # Mac/Linux
-setx OLLAMA_API_BASE http://127.0.0.1:11434 # Windows, restart shell after setx
+# In another terminal window, change directory into your codebase
+cd /to/your/project
aider --model ollama_chat/
```
diff --git a/aider/website/docs/llms/openai-compat.md b/aider/website/docs/llms/openai-compat.md
index e1b2a73f2..ea45a574f 100644
--- a/aider/website/docs/llms/openai-compat.md
+++ b/aider/website/docs/llms/openai-compat.md
@@ -7,10 +7,13 @@ nav_order: 500
Aider can connect to any LLM which is accessible via an OpenAI compatible API endpoint.
-```
-python -m pip install aider-install
-aider-install
+First, install aider:
+{% include install.md %}
+
+Then configure your API key and endpoint:
+
+```
# Mac/Linux:
export OPENAI_API_BASE=
export OPENAI_API_KEY=
@@ -19,6 +22,13 @@ export OPENAI_API_KEY=
setx OPENAI_API_BASE
setx OPENAI_API_KEY
# ... restart shell after setx commands
+```
+
+Start working with aider and your OpenAI compatible API on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
# Prefix the model name with openai/
aider --model openai/
diff --git a/aider/website/docs/llms/openai.md b/aider/website/docs/llms/openai.md
index a9d907afb..e88944644 100644
--- a/aider/website/docs/llms/openai.md
+++ b/aider/website/docs/llms/openai.md
@@ -10,27 +10,34 @@ To work with OpenAI's models, you need to provide your
either in the `OPENAI_API_KEY` environment variable or
via the `--api-key openai=` command line switch.
-Aider has some built in shortcuts for the most popular OpenAI models and
-has been tested and benchmarked to work well with them:
+First, install aider:
+
+{% include install.md %}
+
+Then configure your API keys:
```
-python -m pip install -U aider-chat
+export OPENAI_API_KEY= # Mac/Linux
+setx OPENAI_API_KEY # Windows, restart shell after setx
+```
+
+Start working with aider and OpenAI on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
# o3-mini
-aider --model o3-mini --api-key openai=
+aider --model o3-mini
# o1-mini
-aider --model o1-mini --api-key openai=
+aider --model o1-mini
# GPT-4o
-aider --model gpt-4o --api-key openai=
+aider --model gpt-4o
# List models available from OpenAI
aider --list-models openai/
-
-# You can also store you API key in environment variables (or .env)
-export OPENAI_API_KEY= # Mac/Linux
-setx OPENAI_API_KEY # Windows, restart shell after setx
```
You can use `aider --model ` to use any other OpenAI model.
diff --git a/aider/website/docs/llms/openrouter.md b/aider/website/docs/llms/openrouter.md
index f9ec3ea0d..e5e8a48cc 100644
--- a/aider/website/docs/llms/openrouter.md
+++ b/aider/website/docs/llms/openrouter.md
@@ -8,11 +8,22 @@ nav_order: 500
Aider can connect to [models provided by OpenRouter](https://openrouter.ai/models?o=top-weekly):
You'll need an [OpenRouter API key](https://openrouter.ai/keys).
-```
-python -m pip install -U aider-chat
+First, install aider:
+{% include install.md %}
+
+Then configure your API keys:
+
+```
export OPENROUTER_API_KEY= # Mac/Linux
setx OPENROUTER_API_KEY # Windows, restart shell after setx
+```
+
+Start working with aider and OpenRouter on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
# Or any other open router model
aider --model openrouter//
@@ -23,16 +34,6 @@ aider --list-models openrouter/
In particular, many aider users access Sonnet via OpenRouter:
-```
-python -m pip install -U aider-chat
-
-export OPENROUTER_API_KEY= # Mac/Linux
-setx OPENROUTER_API_KEY # Windows, restart shell after setx
-
-aider --model openrouter/anthropic/claude-3.7-sonnet
-```
-
-
{: .tip }
If you get errors, check your
[OpenRouter privacy settings](https://openrouter.ai/settings/privacy).
diff --git a/aider/website/docs/llms/vertex.md b/aider/website/docs/llms/vertex.md
index b7afee42f..9dc82ea38 100644
--- a/aider/website/docs/llms/vertex.md
+++ b/aider/website/docs/llms/vertex.md
@@ -13,6 +13,10 @@ or service account with permission to use the Vertex AI API.
With your chosen login method, the gcloud CLI should automatically set the
`GOOGLE_APPLICATION_CREDENTIALS` environment variable which points to the credentials file.
+First, install aider:
+
+{% include install.md %}
+
To configure Aider to use the Vertex AI API, you need to set `VERTEXAI_PROJECT` (the GCP project ID)
and `VERTEXAI_LOCATION` (the GCP region) [environment variables for Aider](/docs/config/dotenv.html).
@@ -27,9 +31,12 @@ VERTEXAI_PROJECT=my-project
VERTEXAI_LOCATION=us-east5
```
-Then you can run aider with the `--model` command line switch, like this:
+Start working with aider and Vertex AI on your codebase:
```
+# Change directory into your codebase
+cd /to/your/project
+
aider --model vertex_ai/claude-3-5-sonnet@20240620
```
diff --git a/aider/website/docs/llms/xai.md b/aider/website/docs/llms/xai.md
index 3374cf487..c2334fa3c 100644
--- a/aider/website/docs/llms/xai.md
+++ b/aider/website/docs/llms/xai.md
@@ -7,14 +7,22 @@ nav_order: 400
You'll need a [xAI API key](https://console.x.ai.).
-To use xAI:
+First, install aider:
+
+{% include install.md %}
+
+Then configure your API keys:
```bash
-python -m pip install aider-install
-aider-install
-
export XAI_API_KEY= # Mac/Linux
setx XAI_API_KEY # Windows, restart shell after setx
+```
+
+Start working with aider and xAI on your codebase:
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
# Grok 3
aider --model xai/grok-3-beta
From 328a3c317846c15e198ed816e01fe7aa5688baf3 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 10:34:12 -0700
Subject: [PATCH 17/66] docs: Improve Amazon Bedrock setup instructions
---
aider/website/docs/llms/bedrock.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/aider/website/docs/llms/bedrock.md b/aider/website/docs/llms/bedrock.md
index f3e2131c7..c38631a36 100644
--- a/aider/website/docs/llms/bedrock.md
+++ b/aider/website/docs/llms/bedrock.md
@@ -6,7 +6,8 @@ nav_order: 560
# Amazon Bedrock
Aider can connect to models provided by Amazon Bedrock.
-You will need to have an AWS account with access to the Bedrock service and the specific models you wish to use.
+To configure Aider to use the Amazon Bedrock API, you need to set up your AWS credentials.
+This can be done using the AWS CLI or by setting environment variables.
## Select a Model from Amazon Bedrock
@@ -68,7 +69,7 @@ export AWS_PROFILE=your-profile
```
You can add these to your
-`.env` file.
+[.env file](/docs/config/dotenv.html).
### Set Environment Variables with PowerShell
From 7a50b7779a22abf753e190a8c6564362393bc304 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 10:34:13 -0700
Subject: [PATCH 18/66] docs: Update boto3 install instructions for Bedrock
---
aider/website/docs/llms/bedrock.md | 24 ++++++++----------------
1 file changed, 8 insertions(+), 16 deletions(-)
diff --git a/aider/website/docs/llms/bedrock.md b/aider/website/docs/llms/bedrock.md
index c38631a36..5d31beac7 100644
--- a/aider/website/docs/llms/bedrock.md
+++ b/aider/website/docs/llms/bedrock.md
@@ -82,25 +82,17 @@ $env:AWS_REGION = 'us-west-2' # Put whichever AWS region that you'd like, that
```
## Install boto3
-
-Aider needs the `boto3` library to connect to Bedrock.
-
-The AWS Bedrock provider requires the `boto3` package in order to function correctly:
-
-```bash
-pip install boto3
-```
-
-To use aider installed via `pipx` with AWS Bedrock, you must add the `boto3` dependency to aider's virtual environment by running
-
-```bash
-pipx inject aider-chat boto3
-```
-
-You must install `boto3` dependency to aider's virtual environment installed via one-liner or uv by running
+You may need to install the `boto3` package.
```bash
+# If you installed with aider-install or `uv tool`
uv tool run --from aider-chat pip install boto3
+
+# Or with pipx...
+pipx inject aider-chat boto3
+
+# Or with pip
+pip install -U boto3
```
## Get Started
From 84c3ac93ef1bcfb83fead60ef3326e143eab6513 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 10:37:14 -0700
Subject: [PATCH 19/66] copy
---
aider/website/_includes/get-started.md | 11 ++++++----
aider/website/_includes/install.md | 5 +++++
aider/website/docs/llms/bedrock.md | 27 ++++++++++++-----------
aider/website/docs/llms/gemini.md | 30 ++++++++++++++++++++------
4 files changed, 50 insertions(+), 23 deletions(-)
create mode 100644 aider/website/_includes/install.md
diff --git a/aider/website/_includes/get-started.md b/aider/website/_includes/get-started.md
index d5d3ff8c6..eb15d2797 100644
--- a/aider/website/_includes/get-started.md
+++ b/aider/website/_includes/get-started.md
@@ -1,10 +1,13 @@
-If you already have python 3.8-3.13 installed, you can get started quickly like this:
+If you already have python 3.8-3.13 installed, you can get started quickly like this.
+
+First, install aider:
+
+{% include install.md %}
+
+Start working with aider on your codebase:
```bash
-python -m pip install aider-install
-aider-install
-
# Change directory into your codebase
cd /to/your/project
diff --git a/aider/website/_includes/install.md b/aider/website/_includes/install.md
new file mode 100644
index 000000000..f42be5656
--- /dev/null
+++ b/aider/website/_includes/install.md
@@ -0,0 +1,5 @@
+
+```bash
+python -m pip install aider-install
+aider-install
+```
diff --git a/aider/website/docs/llms/bedrock.md b/aider/website/docs/llms/bedrock.md
index 5d31beac7..51a7d0822 100644
--- a/aider/website/docs/llms/bedrock.md
+++ b/aider/website/docs/llms/bedrock.md
@@ -81,19 +81,6 @@ $env:AWS_SECRET_ACCESS_KEY = 'your_secret_key'
$env:AWS_REGION = 'us-west-2' # Put whichever AWS region that you'd like, that the Bedrock service supports.
```
-## Install boto3
-You may need to install the `boto3` package.
-
-```bash
-# If you installed with aider-install or `uv tool`
-uv tool run --from aider-chat pip install boto3
-
-# Or with pipx...
-pipx inject aider-chat boto3
-
-# Or with pip
-pip install -U boto3
-```
## Get Started
@@ -123,6 +110,20 @@ aider --list-models bedrock/
Make sure you have access to these models in your AWS account before attempting to use them with Aider.
+## Install boto3
+You may need to install the `boto3` package.
+
+```bash
+# If you installed with aider-install or `uv tool`
+uv tool run --from aider-chat pip install boto3
+
+# Or with pipx...
+pipx inject aider-chat boto3
+
+# Or with pip
+pip install -U boto3
+```
+
# More info
For more information on Amazon Bedrock and its models, refer to the [official AWS documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html).
diff --git a/aider/website/docs/llms/gemini.md b/aider/website/docs/llms/gemini.md
index 8cd70d5de..719f51760 100644
--- a/aider/website/docs/llms/gemini.md
+++ b/aider/website/docs/llms/gemini.md
@@ -7,17 +7,23 @@ nav_order: 300
You'll need a [Gemini API key](https://aistudio.google.com/app/u/2/apikey).
-```
-python -m pip install -U aider-chat
+First, install aider:
-# You may need to install google-generativeai
-pip install -U google-generativeai
+{% include install.md %}
-# Or with pipx...
-pipx inject aider-chat google-generativeai
+Then configure your API keys:
+```bash
export GEMINI_API_KEY= # Mac/Linux
setx GEMINI_API_KEY # Windows, restart shell after setx
+```
+
+Start working with aider and Gemini on your codebase:
+
+
+```bash
+# Change directory into your codebase
+cd /to/your/project
# You can run the Gemini 2.5 Pro model with:
aider --model gemini-2.5-pro
@@ -26,3 +32,15 @@ aider --model gemini-2.5-pro
aider --list-models gemini/
```
+You may need to install the `google-generativeai` package.
+
+```bash
+# If you installed with aider-install or `uv tool`
+uv tool run --from aider-chat pip install google-generativeai
+
+# Or with pipx...
+pipx inject aider-chat google-generativeai
+
+# Or with pip
+pip install -U google-generativeai
+```
From e560ab61b6852ddf2794f9ce719298d12f359a51 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 10:48:39 -0700
Subject: [PATCH 20/66] copy
---
aider/website/docs/llms.md | 9 ++++-----
aider/website/docs/llms/gemini.md | 7 +++++--
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/aider/website/docs/llms.md b/aider/website/docs/llms.md
index 23d4007a7..2180f9b63 100644
--- a/aider/website/docs/llms.md
+++ b/aider/website/docs/llms.md
@@ -16,9 +16,10 @@ description: Aider can connect to most LLMs for AI pair programming.
Aider works best with these models, which are skilled at editing code:
+- [Gemini 2.5 Pro](/docs/gemini.html)
- [DeepSeek R1 and V3](/docs/llms/deepseek.html)
- [Claude 3.7 Sonnet](/docs/llms/anthropic.html)
-- [OpenAI o1, o3-mini and GPT-4o](/docs/llms/openai.html)
+- [OpenAI o3, o4-mini and GPT-4.1](/docs/llms/openai.html)
## Free models
@@ -26,10 +27,8 @@ Aider works best with these models, which are skilled at editing code:
Aider works with a number of **free** API providers:
-- Google's [Gemini 1.5 Pro](/docs/llms/gemini.html) works with aider, with
-code editing capabilities similar to GPT-3.5.
-- You can use [Llama 3 70B on Groq](/docs/llms/groq.html) which is comparable to GPT-3.5 in code editing performance.
-- Cohere also offers free API access to their [Command-R+ model](/docs/llms/cohere.html), which works with aider as a *very basic* coding assistant.
+- [OpenRouter offers free access to many models](https://openrouter.ai/models/?q=free), with limitations on daily usage.
+- Google's [Gemini 2.5 Pro Exp](/docs/llms/gemini.html) works very well with aider.
## Local models
{: .no_toc }
diff --git a/aider/website/docs/llms/gemini.md b/aider/website/docs/llms/gemini.md
index 719f51760..261512fda 100644
--- a/aider/website/docs/llms/gemini.md
+++ b/aider/website/docs/llms/gemini.md
@@ -25,8 +25,11 @@ Start working with aider and Gemini on your codebase:
# Change directory into your codebase
cd /to/your/project
-# You can run the Gemini 2.5 Pro model with:
-aider --model gemini-2.5-pro
+# You can run the Gemini 2.5 Pro model with this shortcut:
+aider --model gemini
+
+# You can run the Gemini 2.5 Pro Exp for free, with usage limits:
+aider --model gemini-exp
# List models available from Gemini
aider --list-models gemini/
From d45a5747eab17cee28b91431cad078eb61b2b3ad Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 10:58:37 -0700
Subject: [PATCH 21/66] feat: Add script to clean metadata from files
---
scripts/clean_metadata.py | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 scripts/clean_metadata.py
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
new file mode 100644
index 000000000..e69de29bb
From 7bde345b831dd403c1c346dc86a59a5203793b00 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 10:58:38 -0700
Subject: [PATCH 22/66] feat: Add script to find common models in metadata
files.
---
scripts/clean_metadata.py | 54 +++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index e69de29bb..29328c9e8 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+
+import json
+from pathlib import Path
+
+
+def main():
+ script_dir = Path(__file__).parent.resolve()
+ litellm_path = script_dir / "../litellm/model_prices_and_context_window.json"
+ aider_path = script_dir / "../aider/resources/model-metadata.json"
+
+ if not litellm_path.exists():
+ print(f"Error: LiteLLM metadata file not found at {litellm_path}")
+ return
+
+ if not aider_path.exists():
+ print(f"Error: Aider metadata file not found at {aider_path}")
+ return
+
+ try:
+ with open(litellm_path, "r") as f:
+ litellm_data = json.load(f)
+ except json.JSONDecodeError as e:
+ print(f"Error decoding JSON from {litellm_path}: {e}")
+ return
+ except Exception as e:
+ print(f"Error reading {litellm_path}: {e}")
+ return
+
+ try:
+ with open(aider_path, "r") as f:
+ aider_data = json.load(f)
+ except json.JSONDecodeError as e:
+ print(f"Error decoding JSON from {aider_path}: {e}")
+ return
+ except Exception as e:
+ print(f"Error reading {aider_path}: {e}")
+ return
+
+ litellm_keys = set(litellm_data.keys())
+ aider_keys = set(aider_data.keys())
+
+ common_keys = litellm_keys.intersection(aider_keys)
+
+ if common_keys:
+ print("Common models found in both files:")
+ for key in sorted(list(common_keys)):
+ print(f"- {key}")
+ else:
+ print("No common models found between the two files.")
+
+
+if __name__ == "__main__":
+ main()
From 19a94e5f15e7f438bcdfe3e826b1fbbd03d10203 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 10:59:59 -0700
Subject: [PATCH 23/66] fix: Update litellm_path to correctly locate JSON file
---
scripts/clean_metadata.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 29328c9e8..3f57bbfef 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -6,7 +6,7 @@ from pathlib import Path
def main():
script_dir = Path(__file__).parent.resolve()
- litellm_path = script_dir / "../litellm/model_prices_and_context_window.json"
+ litellm_path = script_dir / "../../litellm/model_prices_and_context_window.json"
aider_path = script_dir / "../aider/resources/model-metadata.json"
if not litellm_path.exists():
From 8596f0d4a3712cad11b0169ad1ceacf5550bf85e Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:00:00 -0700
Subject: [PATCH 24/66] feat: Use json5 to load model metadata for lenient
parsing
---
scripts/clean_metadata.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 3f57bbfef..3466f683b 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -1,6 +1,7 @@
#!/usr/bin/env python
import json
+import json5
from pathlib import Path
@@ -28,8 +29,9 @@ def main():
return
try:
+ # Use json5 for the aider metadata file as it might contain comments
with open(aider_path, "r") as f:
- aider_data = json.load(f)
+ aider_data = json5.load(f)
except json.JSONDecodeError as e:
print(f"Error decoding JSON from {aider_path}: {e}")
return
From be44b6509568f172c4c37f7283acabe263b354a5 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:00:03 -0700
Subject: [PATCH 25/66] style: Apply linting to clean_metadata.py
---
scripts/clean_metadata.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 3466f683b..dcdfbb5f4 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -1,9 +1,10 @@
#!/usr/bin/env python
import json
-import json5
from pathlib import Path
+import json5
+
def main():
script_dir = Path(__file__).parent.resolve()
From 82b26daf37e25d3a6e3a3ebce0a0857185180823 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:00:49 -0700
Subject: [PATCH 26/66] feat: display matching entries side-by-side with diff
highlighting
---
scripts/clean_metadata.py | 39 +++++++++++++++++++++++++++++++++++----
1 file changed, 35 insertions(+), 4 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index dcdfbb5f4..defca1606 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -1,6 +1,7 @@
#!/usr/bin/env python
import json
+import difflib
from pathlib import Path
import json5
@@ -43,12 +44,42 @@ def main():
litellm_keys = set(litellm_data.keys())
aider_keys = set(aider_data.keys())
- common_keys = litellm_keys.intersection(aider_keys)
+ common_keys = sorted(list(litellm_keys.intersection(aider_keys)))
if common_keys:
- print("Common models found in both files:")
- for key in sorted(list(common_keys)):
- print(f"- {key}")
+ print("Comparing common models found in both files:\n")
+ for key in common_keys:
+ print(f"--- {key} (litellm) ---")
+ print(f"+++ {key} (aider) +++")
+
+ litellm_entry = litellm_data.get(key, {})
+ aider_entry = aider_data.get(key, {})
+
+ # Convert dicts to formatted JSON strings for comparison
+ litellm_json = json.dumps(litellm_entry, indent=4, sort_keys=True).splitlines()
+ aider_json = json.dumps(aider_entry, indent=4, sort_keys=True).splitlines()
+
+ # Generate unified diff
+ diff = difflib.unified_diff(
+ litellm_json,
+ aider_json,
+ fromfile=f"{key} (litellm)",
+ tofile=f"{key} (aider)",
+ lineterm="",
+ n=max(len(litellm_json), len(aider_json)), # Show all lines
+ )
+
+ # Print the diff, skipping the header lines generated by unified_diff
+ diff_lines = list(diff)[2:]
+ if not diff_lines:
+ print("(No differences found)")
+ else:
+ for line in diff_lines:
+ # Add color for better readability (optional, requires a library like 'termcolor' or manual ANSI codes)
+ # Simple +/- indication is standard for diffs
+ print(line)
+ print("\n" + "=" * 40 + "\n")
+
else:
print("No common models found between the two files.")
From 876569613bdda75c25bbb6535ab38eb8ba83b6ff Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:00:52 -0700
Subject: [PATCH 27/66] style: Apply linting to clean_metadata.py
---
scripts/clean_metadata.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index defca1606..024818d61 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
-import json
import difflib
+import json
from pathlib import Path
import json5
From 758020c574ff5329b67c491d2dac797db2a7c8b3 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:01:40 -0700
Subject: [PATCH 28/66] fix: Flip diff order to be from aider -> litellm in
script
---
scripts/clean_metadata.py | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 024818d61..4bd80925e 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -49,8 +49,8 @@ def main():
if common_keys:
print("Comparing common models found in both files:\n")
for key in common_keys:
- print(f"--- {key} (litellm) ---")
- print(f"+++ {key} (aider) +++")
+ print(f"--- {key} (aider) ---")
+ print(f"+++ {key} (litellm) +++")
litellm_entry = litellm_data.get(key, {})
aider_entry = aider_data.get(key, {})
@@ -61,10 +61,10 @@ def main():
# Generate unified diff
diff = difflib.unified_diff(
- litellm_json,
aider_json,
- fromfile=f"{key} (litellm)",
- tofile=f"{key} (aider)",
+ litellm_json,
+ fromfile=f"{key} (aider)",
+ tofile=f"{key} (litellm)",
lineterm="",
n=max(len(litellm_json), len(aider_json)), # Show all lines
)
From b2d541f1ebb0abf25674b2858266d4fa66667b64 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:02:00 -0700
Subject: [PATCH 29/66] style: Fix line length in clean_metadata.py for flake8
compliance
---
scripts/clean_metadata.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 4bd80925e..6ae06a3eb 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -75,7 +75,8 @@ def main():
print("(No differences found)")
else:
for line in diff_lines:
- # Add color for better readability (optional, requires a library like 'termcolor' or manual ANSI codes)
+ # Add color for better readability (optional, requires a library
+ # like 'termcolor' or manual ANSI codes)
# Simple +/- indication is standard for diffs
print(line)
print("\n" + "=" * 40 + "\n")
From 226108d05d8c27450349143a4fc77c5541975a14 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:02:37 -0700
Subject: [PATCH 30/66] feat: Prompt user to remove entries from
model-metadata.json
---
scripts/clean_metadata.py | 45 +++++++++++++++++++++++++++++++++++++--
1 file changed, 43 insertions(+), 2 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 6ae06a3eb..d86eaae77 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -9,7 +9,8 @@ import json5
def main():
script_dir = Path(__file__).parent.resolve()
- litellm_path = script_dir / "../../litellm/model_prices_and_context_window.json"
+ # Adjust path relative to the script's location in the aider repo
+ litellm_path = script_dir.parent / "../litellm/model_prices_and_context_window.json"
aider_path = script_dir / "../aider/resources/model-metadata.json"
if not litellm_path.exists():
@@ -44,6 +45,7 @@ def main():
litellm_keys = set(litellm_data.keys())
aider_keys = set(aider_data.keys())
+ keys_to_remove = set()
common_keys = sorted(list(litellm_keys.intersection(aider_keys)))
if common_keys:
@@ -79,10 +81,49 @@ def main():
# like 'termcolor' or manual ANSI codes)
# Simple +/- indication is standard for diffs
print(line)
- print("\n" + "=" * 40 + "\n")
+ print("\n" + "=" * 40)
+
+ # Ask user if they want to remove the entry from aider's metadata
+ response = input(
+ f"Remove '{key}' from aider/resources/model-metadata.json? (y/N): "
+ ).strip().lower()
+ if response == 'y':
+ keys_to_remove.add(key)
+ print(f"Marked '{key}' for removal.")
+ else:
+ print(f"Keeping '{key}'.")
+ print("-" * 40 + "\n") # Separator for the next model
else:
print("No common models found between the two files.")
+ return # Exit if no common keys
+
+ # Remove marked keys after iterating through all common models
+ if keys_to_remove:
+ print("\nRemoving marked entries from aider data...")
+ removed_count = 0
+ for key in keys_to_remove:
+ if key in aider_data:
+ del aider_data[key]
+ print(f" - Removed {key}")
+ removed_count += 1
+
+ if removed_count > 0:
+ # Write the modified data back to the aider metadata file
+ try:
+ with open(aider_path, "w") as f:
+ # Use json.dump for standard, clean JSON output
+ # Using sort_keys=True for consistent ordering
+ json.dump(aider_data, f, indent=4, sort_keys=True)
+ # Add a trailing newline for POSIX compatibility
+ f.write("\n")
+ print(f"\nSuccessfully updated {aider_path} with {removed_count} removal(s).")
+ except Exception as e:
+ print(f"\nError writing updated data to {aider_path}: {e}")
+ else:
+ print("\nNo entries were actually removed (perhaps they were already gone?).")
+ else:
+ print("\nNo entries marked for removal.")
if __name__ == "__main__":
From ce1266be68d526eebd80041e5454814be3ea1687 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:02:40 -0700
Subject: [PATCH 31/66] style: Run linter on clean_metadata.py
---
scripts/clean_metadata.py | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index d86eaae77..2607c7302 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -84,10 +84,12 @@ def main():
print("\n" + "=" * 40)
# Ask user if they want to remove the entry from aider's metadata
- response = input(
- f"Remove '{key}' from aider/resources/model-metadata.json? (y/N): "
- ).strip().lower()
- if response == 'y':
+ response = (
+ input(f"Remove '{key}' from aider/resources/model-metadata.json? (y/N): ")
+ .strip()
+ .lower()
+ )
+ if response == "y":
keys_to_remove.add(key)
print(f"Marked '{key}' for removal.")
else:
@@ -96,7 +98,7 @@ def main():
else:
print("No common models found between the two files.")
- return # Exit if no common keys
+ return # Exit if no common keys
# Remove marked keys after iterating through all common models
if keys_to_remove:
@@ -121,7 +123,7 @@ def main():
except Exception as e:
print(f"\nError writing updated data to {aider_path}: {e}")
else:
- print("\nNo entries were actually removed (perhaps they were already gone?).")
+ print("\nNo entries were actually removed (perhaps they were already gone?).")
else:
print("\nNo entries marked for removal.")
From b4673fdc85fa209a3eb95691c6bddfd215651603 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:03:41 -0700
Subject: [PATCH 32/66] Refactor: Remove keys immediately in clean_metadata.py
---
scripts/clean_metadata.py | 48 ++++++++++++++++-----------------------
1 file changed, 20 insertions(+), 28 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 2607c7302..d28e45420 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -45,8 +45,8 @@ def main():
litellm_keys = set(litellm_data.keys())
aider_keys = set(aider_data.keys())
- keys_to_remove = set()
common_keys = sorted(list(litellm_keys.intersection(aider_keys)))
+ removed_count = 0
if common_keys:
print("Comparing common models found in both files:\n")
@@ -90,8 +90,21 @@ def main():
.lower()
)
if response == "y":
- keys_to_remove.add(key)
- print(f"Marked '{key}' for removal.")
+ if key in aider_data:
+ print(f"Removing '{key}' from aider data...")
+ del aider_data[key]
+ removed_count += 1
+ # Write the modified data back immediately
+ try:
+ with open(aider_path, "w") as f:
+ json.dump(aider_data, f, indent=4, sort_keys=True)
+ f.write("\n")
+ print(f"Successfully removed '{key}' and updated {aider_path}.")
+ except Exception as e:
+ print(f"Error writing updated data to {aider_path} after removing {key}: {e}")
+ # Exit or handle error appropriately? For now, just print.
+ else:
+ print(f"'{key}' not found in aider data (already removed?).")
else:
print(f"Keeping '{key}'.")
print("-" * 40 + "\n") # Separator for the next model
@@ -100,32 +113,11 @@ def main():
print("No common models found between the two files.")
return # Exit if no common keys
- # Remove marked keys after iterating through all common models
- if keys_to_remove:
- print("\nRemoving marked entries from aider data...")
- removed_count = 0
- for key in keys_to_remove:
- if key in aider_data:
- del aider_data[key]
- print(f" - Removed {key}")
- removed_count += 1
-
- if removed_count > 0:
- # Write the modified data back to the aider metadata file
- try:
- with open(aider_path, "w") as f:
- # Use json.dump for standard, clean JSON output
- # Using sort_keys=True for consistent ordering
- json.dump(aider_data, f, indent=4, sort_keys=True)
- # Add a trailing newline for POSIX compatibility
- f.write("\n")
- print(f"\nSuccessfully updated {aider_path} with {removed_count} removal(s).")
- except Exception as e:
- print(f"\nError writing updated data to {aider_path}: {e}")
- else:
- print("\nNo entries were actually removed (perhaps they were already gone?).")
+ # Final summary message
+ if removed_count > 0:
+ print(f"\nFinished comparing. A total of {removed_count} entr(y/ies) were removed.")
else:
- print("\nNo entries marked for removal.")
+ print("\nFinished comparing. No entries were removed.")
if __name__ == "__main__":
From 6656b5d973da485ff6f0cf9895489f6db2a92fa0 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:03:44 -0700
Subject: [PATCH 33/66] style: Apply linting to clean_metadata.py
---
scripts/clean_metadata.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index d28e45420..d07c41003 100644
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -101,7 +101,9 @@ def main():
f.write("\n")
print(f"Successfully removed '{key}' and updated {aider_path}.")
except Exception as e:
- print(f"Error writing updated data to {aider_path} after removing {key}: {e}")
+ print(
+ f"Error writing updated data to {aider_path} after removing {key}: {e}"
+ )
# Exit or handle error appropriately? For now, just print.
else:
print(f"'{key}' not found in aider data (already removed?).")
From ba2c4d1eb753b7a5f289f62e8a227321ab4da66d Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 11:05:35 -0700
Subject: [PATCH 34/66] chore: Make clean_metadata.py executable
---
scripts/clean_metadata.py | 0
1 file changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 scripts/clean_metadata.py
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
old mode 100644
new mode 100755
From 58f4db4e524e7d6d1579cd1f75ca0939eac2a344 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:05:36 -0700
Subject: [PATCH 35/66] feat: Implement surgical removal of JSON blocks from
metadata file
---
scripts/clean_metadata.py | 136 +++++++++++++++++++++++++++++++++-----
1 file changed, 121 insertions(+), 15 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index d07c41003..feb9a87ac 100755
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -3,10 +3,124 @@
import difflib
import json
from pathlib import Path
+import re
import json5
+
+def find_block_lines(lines, key_to_remove):
+ """Finds the start and end line indices for a top-level key's block."""
+ start_line_idx = -1
+ # Regex to find the line starting the key definition, allowing for whitespace
+ # and ensuring it's the key we want (e.g., avoid matching "key1_extra": ...)
+ key_pattern = re.compile(r'^\s*"' + re.escape(key_to_remove) + r'"\s*:\s*{?')
+
+ for i, line in enumerate(lines):
+ if key_pattern.match(line.strip()):
+ start_line_idx = i
+ break
+
+ if start_line_idx == -1:
+ # Key might not start with '{' on the same line, check if it starts immediately after
+ key_pattern_no_brace = re.compile(r'^\s*"' + re.escape(key_to_remove) + r'"\s*:\s*$')
+ potential_start = -1
+ for i, line in enumerate(lines):
+ if key_pattern_no_brace.match(line.strip()):
+ potential_start = i
+ # Look for the opening brace on the next non-empty/comment line
+ j = i + 1
+ while j < len(lines):
+ stripped_next_line = lines[j].strip()
+ if not stripped_next_line or stripped_next_line.startswith("//"):
+ j += 1
+ continue
+ if stripped_next_line.startswith("{"):
+ start_line_idx = i # Start from the key definition line
+ break
+ else:
+ potential_start = -1 # False alarm
+ break
+ if start_line_idx != -1:
+ break
+
+ if start_line_idx == -1:
+ print(f"Warning: Could not reliably find start line for '{key_to_remove}'. Skipping removal.")
+ return None, None # Key block start not found clearly
+
+ brace_level = 0
+ in_string = False
+ escape_next = False
+ block_started = False
+ end_line_idx = -1
+
+ # Start brace counting from the identified start line
+ for i in range(start_line_idx, len(lines)):
+ line = lines[i]
+ # Simple brace counting - might be fooled by braces in comments or strings
+ # This is a limitation of pure text processing without full parsing
+ for char_idx, char in enumerate(line):
+ # Rudimentary string detection
+ if char == '"':
+ # Check if preceded by an odd number of backslashes (escaped quote)
+ backslashes = 0
+ temp_idx = char_idx - 1
+ while temp_idx >= 0 and line[temp_idx] == '\\':
+ backslashes += 1
+ temp_idx -= 1
+ if backslashes % 2 == 0:
+ in_string = not in_string
+
+ if not in_string:
+ if char == '{':
+ brace_level += 1
+ block_started = True # Mark that we've entered the block
+ elif char == '}':
+ brace_level -= 1
+
+ # Check if the block ends *after* processing the entire line
+ if block_started and brace_level == 0:
+ end_line_idx = i
+ break
+
+ if end_line_idx == -1:
+ print(f"Warning: Could not find end of block for '{key_to_remove}' starting at line {start_line_idx+1}. Skipping removal.")
+ return None, None # Block end not found
+
+ return start_line_idx, end_line_idx
+
+
+def remove_block_surgically(file_path, key_to_remove):
+ """Reads the file, removes the block for the key, writes back."""
+ try:
+ # Read with universal newlines, but keep track for writing
+ with open(file_path, "r") as f:
+ content = f.read()
+ lines = content.splitlines(keepends=True) # Keep original line endings
+ except Exception as e:
+ print(f"Error reading {file_path} for removal: {e}")
+ return False
+
+ start_idx, end_idx = find_block_lines(lines, key_to_remove)
+
+ if start_idx is None or end_idx is None:
+ return False # Error message already printed by find_block_lines
+
+ # Prepare the lines to be written, excluding the identified block
+ output_lines = lines[:start_idx] + lines[end_idx + 1 :]
+
+ # Note: Comma handling is omitted for simplicity. User may need manual fix.
+
+ try:
+ with open(file_path, "w") as f:
+ f.writelines(output_lines)
+ print(f"Successfully removed '{key_to_remove}' block and updated {file_path}.")
+ return True
+ except Exception as e:
+ print(f"Error writing updated data to {file_path} after removing {key_to_remove}: {e}")
+ return False
+
+
def main():
script_dir = Path(__file__).parent.resolve()
# Adjust path relative to the script's location in the aider repo
@@ -90,23 +204,15 @@ def main():
.lower()
)
if response == "y":
- if key in aider_data:
- print(f"Removing '{key}' from aider data...")
- del aider_data[key]
+ # Perform surgical removal from the text file
+ if remove_block_surgically(aider_path, key):
removed_count += 1
- # Write the modified data back immediately
- try:
- with open(aider_path, "w") as f:
- json.dump(aider_data, f, indent=4, sort_keys=True)
- f.write("\n")
- print(f"Successfully removed '{key}' and updated {aider_path}.")
- except Exception as e:
- print(
- f"Error writing updated data to {aider_path} after removing {key}: {e}"
- )
- # Exit or handle error appropriately? For now, just print.
+ # Optional: Also remove from the in-memory dict if needed later,
+ # but it's not strictly necessary if we reload or finish now.
+ # if key in aider_data: del aider_data[key]
else:
- print(f"'{key}' not found in aider data (already removed?).")
+ print(f"Failed to remove '{key}' block surgically.")
+ # Key might still be in aider_data if removal failed
else:
print(f"Keeping '{key}'.")
print("-" * 40 + "\n") # Separator for the next model
From ebfce5b0f20487c1dc469cd710b214ab1f0409ec Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:05:39 -0700
Subject: [PATCH 36/66] style: Run linter on clean_metadata.py
---
scripts/clean_metadata.py | 44 +++++++++++++++++++++------------------
1 file changed, 24 insertions(+), 20 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index feb9a87ac..26b599633 100755
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -2,13 +2,12 @@
import difflib
import json
-from pathlib import Path
import re
+from pathlib import Path
import json5
-
def find_block_lines(lines, key_to_remove):
"""Finds the start and end line indices for a top-level key's block."""
start_line_idx = -1
@@ -36,16 +35,18 @@ def find_block_lines(lines, key_to_remove):
j += 1
continue
if stripped_next_line.startswith("{"):
- start_line_idx = i # Start from the key definition line
+ start_line_idx = i # Start from the key definition line
break
else:
- potential_start = -1 # False alarm
+ potential_start = -1 # False alarm
break
if start_line_idx != -1:
break
if start_line_idx == -1:
- print(f"Warning: Could not reliably find start line for '{key_to_remove}'. Skipping removal.")
+ print(
+ f"Warning: Could not reliably find start line for '{key_to_remove}'. Skipping removal."
+ )
return None, None # Key block start not found clearly
brace_level = 0
@@ -62,20 +63,20 @@ def find_block_lines(lines, key_to_remove):
for char_idx, char in enumerate(line):
# Rudimentary string detection
if char == '"':
- # Check if preceded by an odd number of backslashes (escaped quote)
- backslashes = 0
- temp_idx = char_idx - 1
- while temp_idx >= 0 and line[temp_idx] == '\\':
- backslashes += 1
- temp_idx -= 1
- if backslashes % 2 == 0:
- in_string = not in_string
+ # Check if preceded by an odd number of backslashes (escaped quote)
+ backslashes = 0
+ temp_idx = char_idx - 1
+ while temp_idx >= 0 and line[temp_idx] == "\\":
+ backslashes += 1
+ temp_idx -= 1
+ if backslashes % 2 == 0:
+ in_string = not in_string
if not in_string:
- if char == '{':
+ if char == "{":
brace_level += 1
- block_started = True # Mark that we've entered the block
- elif char == '}':
+ block_started = True # Mark that we've entered the block
+ elif char == "}":
brace_level -= 1
# Check if the block ends *after* processing the entire line
@@ -84,8 +85,11 @@ def find_block_lines(lines, key_to_remove):
break
if end_line_idx == -1:
- print(f"Warning: Could not find end of block for '{key_to_remove}' starting at line {start_line_idx+1}. Skipping removal.")
- return None, None # Block end not found
+ print(
+ f"Warning: Could not find end of block for '{key_to_remove}' starting at line"
+ f" {start_line_idx+1}. Skipping removal."
+ )
+ return None, None # Block end not found
return start_line_idx, end_line_idx
@@ -96,7 +100,7 @@ def remove_block_surgically(file_path, key_to_remove):
# Read with universal newlines, but keep track for writing
with open(file_path, "r") as f:
content = f.read()
- lines = content.splitlines(keepends=True) # Keep original line endings
+ lines = content.splitlines(keepends=True) # Keep original line endings
except Exception as e:
print(f"Error reading {file_path} for removal: {e}")
return False
@@ -104,7 +108,7 @@ def remove_block_surgically(file_path, key_to_remove):
start_idx, end_idx = find_block_lines(lines, key_to_remove)
if start_idx is None or end_idx is None:
- return False # Error message already printed by find_block_lines
+ return False # Error message already printed by find_block_lines
# Prepare the lines to be written, excluding the identified block
output_lines = lines[:start_idx] + lines[end_idx + 1 :]
From 48ac1de8d370f9ec950acc95d45a1606e0a9be2a Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:05:56 -0700
Subject: [PATCH 37/66] fix: Remove unused variables and fix whitespace in
clean_metadata.py
---
scripts/clean_metadata.py | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 26b599633..c8c0eb077 100755
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -23,10 +23,8 @@ def find_block_lines(lines, key_to_remove):
if start_line_idx == -1:
# Key might not start with '{' on the same line, check if it starts immediately after
key_pattern_no_brace = re.compile(r'^\s*"' + re.escape(key_to_remove) + r'"\s*:\s*$')
- potential_start = -1
for i, line in enumerate(lines):
if key_pattern_no_brace.match(line.strip()):
- potential_start = i
# Look for the opening brace on the next non-empty/comment line
j = i + 1
while j < len(lines):
@@ -51,7 +49,6 @@ def find_block_lines(lines, key_to_remove):
brace_level = 0
in_string = False
- escape_next = False
block_started = False
end_line_idx = -1
@@ -87,7 +84,7 @@ def find_block_lines(lines, key_to_remove):
if end_line_idx == -1:
print(
f"Warning: Could not find end of block for '{key_to_remove}' starting at line"
- f" {start_line_idx+1}. Skipping removal."
+ f" {start_line_idx + 1}. Skipping removal."
)
return None, None # Block end not found
From 506c3c928e65112a4cd108d316bdff9a15949d57 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:06:20 -0700
Subject: [PATCH 38/66] refactor: Remove unused variable in find_block_lines
function
---
scripts/clean_metadata.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index c8c0eb077..8028d7491 100755
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -36,7 +36,7 @@ def find_block_lines(lines, key_to_remove):
start_line_idx = i # Start from the key definition line
break
else:
- potential_start = -1 # False alarm
+ # False alarm, the line after the key wasn't '{'
break
if start_line_idx != -1:
break
From d8caa76bc822669a576b0c26ae7d6d51a2d4ab58 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:08:53 -0700
Subject: [PATCH 39/66] feat: Compare dicts directly to avoid spurious diffs in
metadata cleaning
---
scripts/clean_metadata.py | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 8028d7491..7ee3648ea 100755
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -173,10 +173,17 @@ def main():
aider_entry = aider_data.get(key, {})
# Convert dicts to formatted JSON strings for comparison
- litellm_json = json.dumps(litellm_entry, indent=4, sort_keys=True).splitlines()
- aider_json = json.dumps(aider_entry, indent=4, sort_keys=True).splitlines()
+ # First, compare the dictionaries directly for semantic equality
+ if litellm_entry == aider_entry:
+ print(f"'{key}': Entries are semantically identical.")
+ print("\n" + "=" * 40)
+ print("-" * 40 + "\n") # Separator for the next model
+ continue # Skip diff and removal prompt for identical entries
# Generate unified diff
+ # If dictionaries differ, generate JSON strings to show the diff
+ litellm_json = json.dumps(litellm_entry, indent=4, sort_keys=True).splitlines()
+ aider_json = json.dumps(aider_entry, indent=4, sort_keys=True).splitlines()
diff = difflib.unified_diff(
aider_json,
litellm_json,
@@ -189,7 +196,9 @@ def main():
# Print the diff, skipping the header lines generated by unified_diff
diff_lines = list(diff)[2:]
if not diff_lines:
- print("(No differences found)")
+ # This case should ideally not be reached if dict comparison was done first,
+ # but kept as a fallback.
+ print("(No textual differences found, though dictionaries might differ in type/order)")
else:
for line in diff_lines:
# Add color for better readability (optional, requires a library
From 2f38cd184cbac8516f7d82d006194fc32c972c06 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:08:57 -0700
Subject: [PATCH 40/66] style: Format clean_metadata.py with black linter
---
scripts/clean_metadata.py | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 7ee3648ea..0a9bcb2be 100755
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -177,8 +177,8 @@ def main():
if litellm_entry == aider_entry:
print(f"'{key}': Entries are semantically identical.")
print("\n" + "=" * 40)
- print("-" * 40 + "\n") # Separator for the next model
- continue # Skip diff and removal prompt for identical entries
+ print("-" * 40 + "\n") # Separator for the next model
+ continue # Skip diff and removal prompt for identical entries
# Generate unified diff
# If dictionaries differ, generate JSON strings to show the diff
@@ -198,7 +198,9 @@ def main():
if not diff_lines:
# This case should ideally not be reached if dict comparison was done first,
# but kept as a fallback.
- print("(No textual differences found, though dictionaries might differ in type/order)")
+ print(
+ "(No textual differences found, though dictionaries might differ in type/order)"
+ )
else:
for line in diff_lines:
# Add color for better readability (optional, requires a library
From de28178369f2f899f2aaf2105c19f6b065141926 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:10:58 -0700
Subject: [PATCH 41/66] feat: Add dummy key to JSON dumps for diffing, then
remove it.
---
scripts/clean_metadata.py | 28 +++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 0a9bcb2be..73ba2b713 100755
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -182,15 +182,33 @@ def main():
# Generate unified diff
# If dictionaries differ, generate JSON strings to show the diff
- litellm_json = json.dumps(litellm_entry, indent=4, sort_keys=True).splitlines()
- aider_json = json.dumps(aider_entry, indent=4, sort_keys=True).splitlines()
+ # Add a dummy key to ensure the *real* last key gets a comma
+ litellm_entry_copy = litellm_entry.copy()
+ aider_entry_copy = aider_entry.copy()
+ dummy_key = "zzzdummykey"
+ litellm_entry_copy[dummy_key] = True
+ aider_entry_copy[dummy_key] = True
+
+ litellm_json_lines = json.dumps(
+ litellm_entry_copy, indent=4, sort_keys=True
+ ).splitlines()
+ aider_json_lines = json.dumps(
+ aider_entry_copy, indent=4, sort_keys=True
+ ).splitlines()
+
+ # Remove the dummy key line before diffing
+ litellm_json_filtered = [
+ line for line in litellm_json_lines if dummy_key not in line
+ ]
+ aider_json_filtered = [line for line in aider_json_lines if dummy_key not in line]
+
diff = difflib.unified_diff(
- aider_json,
- litellm_json,
+ aider_json_filtered,
+ litellm_json_filtered,
fromfile=f"{key} (aider)",
tofile=f"{key} (litellm)",
lineterm="",
- n=max(len(litellm_json), len(aider_json)), # Show all lines
+ n=max(len(litellm_json_filtered), len(aider_json_filtered)), # Show all lines
)
# Print the diff, skipping the header lines generated by unified_diff
From 13b3e75d0e328d30481fc315cd131738fe1e4a2e Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:11:01 -0700
Subject: [PATCH 42/66] style: Apply linting to clean_metadata.py
---
scripts/clean_metadata.py | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/scripts/clean_metadata.py b/scripts/clean_metadata.py
index 73ba2b713..c1031857b 100755
--- a/scripts/clean_metadata.py
+++ b/scripts/clean_metadata.py
@@ -192,14 +192,10 @@ def main():
litellm_json_lines = json.dumps(
litellm_entry_copy, indent=4, sort_keys=True
).splitlines()
- aider_json_lines = json.dumps(
- aider_entry_copy, indent=4, sort_keys=True
- ).splitlines()
+ aider_json_lines = json.dumps(aider_entry_copy, indent=4, sort_keys=True).splitlines()
# Remove the dummy key line before diffing
- litellm_json_filtered = [
- line for line in litellm_json_lines if dummy_key not in line
- ]
+ litellm_json_filtered = [line for line in litellm_json_lines if dummy_key not in line]
aider_json_filtered = [line for line in aider_json_lines if dummy_key not in line]
diff = difflib.unified_diff(
From 51e0fff82247d6a378f74ee83cc647ed58ca02d2 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 11:12:20 -0700
Subject: [PATCH 43/66] cleanup metadata that is now in litellm
---
aider/resources/model-metadata.json | 202 ----------------------------
1 file changed, 202 deletions(-)
diff --git a/aider/resources/model-metadata.json b/aider/resources/model-metadata.json
index 8cd469dce..336c6bee8 100644
--- a/aider/resources/model-metadata.json
+++ b/aider/resources/model-metadata.json
@@ -15,22 +15,6 @@
//"supports_tool_choice": true,
"supports_prompt_caching": true
},
- "openrouter/deepseek/deepseek-r1": {
- "max_tokens": 8192,
- "max_input_tokens": 64000,
- "max_output_tokens": 8192,
- "input_cost_per_token": 0.00000055,
- "input_cost_per_token_cache_hit": 0.00000014,
- "cache_read_input_token_cost": 0.00000014,
- "cache_creation_input_token_cost": 0.0,
- "output_cost_per_token": 0.00000219,
- "litellm_provider": "openrouter",
- "mode": "chat",
- //"supports_function_calling": true,
- "supports_assistant_prefill": true,
- //"supports_tool_choice": true,
- "supports_prompt_caching": true
- },
"openrouter/deepseek/deepseek-r1:free": {
"max_tokens": 8192,
"max_input_tokens": 64000,
@@ -99,15 +83,6 @@
"output_cost_per_token": 0.000008,
"mode": "chat",
},
- "fireworks_ai/accounts/fireworks/models/deepseek-v3": {
- "max_tokens": 128000,
- "max_input_tokens": 100000,
- "max_output_tokens": 8192,
- "litellm_provider": "fireworks_ai",
- "input_cost_per_token": 0.0000009,
- "output_cost_per_token": 0.0000009,
- "mode": "chat",
- },
"fireworks_ai/accounts/fireworks/models/deepseek-v3-0324": {
"max_tokens": 160000,
"max_input_tokens": 100000,
@@ -117,54 +92,6 @@
"output_cost_per_token": 0.0000009,
"mode": "chat",
},
- "o3-mini": {
- "max_tokens": 100000,
- "max_input_tokens": 200000,
- "max_output_tokens": 100000,
- "input_cost_per_token": 0.0000011,
- "output_cost_per_token": 0.0000044,
- "cache_read_input_token_cost": 0.00000055,
- "litellm_provider": "openai",
- "mode": "chat",
- "supports_function_calling": true,
- "supports_parallel_function_calling": true,
- "supports_vision": true,
- "supports_prompt_caching": true,
- "supports_system_messages": true,
- "supports_response_schema": true
- },
- "openrouter/openai/o3-mini": {
- "max_tokens": 100000,
- "max_input_tokens": 200000,
- "max_output_tokens": 100000,
- "input_cost_per_token": 0.0000011,
- "output_cost_per_token": 0.0000044,
- "cache_read_input_token_cost": 0.00000055,
- "litellm_provider": "openrouter",
- "mode": "chat",
- "supports_function_calling": true,
- "supports_parallel_function_calling": true,
- "supports_vision": true,
- "supports_prompt_caching": true,
- "supports_system_messages": true,
- "supports_response_schema": true
- },
- "openrouter/openai/o3-mini-high": {
- "max_tokens": 100000,
- "max_input_tokens": 200000,
- "max_output_tokens": 100000,
- "input_cost_per_token": 0.0000011,
- "output_cost_per_token": 0.0000044,
- "cache_read_input_token_cost": 0.00000055,
- "litellm_provider": "openrouter",
- "mode": "chat",
- "supports_function_calling": true,
- "supports_parallel_function_calling": true,
- "supports_vision": true,
- "supports_prompt_caching": true,
- "supports_system_messages": true,
- "supports_response_schema": true
- },
"openrouter/openrouter/quasar-alpha": {
"max_input_tokens": 1000000,
"max_output_tokens": 32000,
@@ -203,26 +130,6 @@
"supports_prompt_caching": true,
"supports_system_messages": true
},
- "claude-3-7-sonnet-20250219": {
- "max_tokens": 8192,
- "max_input_tokens": 200000,
- "max_output_tokens": 8192,
- "input_cost_per_token": 0.000003,
- "output_cost_per_token": 0.000015,
- "cache_creation_input_token_cost": 0.00000375,
- "cache_read_input_token_cost": 0.0000003,
- "litellm_provider": "anthropic",
- "mode": "chat",
- "supports_function_calling": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 159,
- "supports_assistant_prefill": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_response_schema": true,
- "deprecation_date": "2025-10-01",
- "supports_tool_choice": true
- },
"anthropic/claude-3-7-sonnet-20250219": {
"max_tokens": 8192,
"max_input_tokens": 200000,
@@ -243,43 +150,6 @@
"deprecation_date": "2025-10-01",
"supports_tool_choice": true
},
- "openrouter/anthropic/claude-3.7-sonnet": {
- "max_tokens": 8192,
- "max_input_tokens": 200000,
- "max_output_tokens": 8192,
- "input_cost_per_token": 0.000003,
- "output_cost_per_token": 0.000015,
- "cache_creation_input_token_cost": 0.00000375,
- "cache_read_input_token_cost": 0.0000003,
- "litellm_provider": "openrouter",
- "mode": "chat",
- "supports_function_calling": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 159,
- "supports_assistant_prefill": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_response_schema": true,
- "deprecation_date": "2025-10-01",
- "supports_tool_choice": true
- },
- "gpt-4.5-preview": {
- "max_tokens": 16384,
- "max_input_tokens": 128000,
- "max_output_tokens": 16384,
- "input_cost_per_token": 0.000075,
- "output_cost_per_token": 0.00015,
- "cache_read_input_token_cost": 0.0000375,
- "litellm_provider": "openai",
- "mode": "chat",
- "supports_function_calling": true,
- "supports_parallel_function_calling": true,
- "supports_response_schema": true,
- "supports_vision": true,
- "supports_prompt_caching": true,
- "supports_system_messages": true,
- "supports_tool_choice": true
- },
"openai/gpt-4.5-preview": {
"max_tokens": 16384,
"max_input_tokens": 128000,
@@ -334,42 +204,6 @@
"supports_tool_choice": true,
"source": "https://cloud.google.com/vertex-ai/generative-ai/pricing"
},
- "gemini/gemini-2.5-pro-preview-03-25": {
- "max_tokens": 8192,
- "max_input_tokens": 1048576,
- "max_output_tokens": 64000,
- "max_images_per_prompt": 3000,
- "max_videos_per_prompt": 10,
- "max_video_length": 1,
- "max_audio_length_hours": 8.4,
- "max_audio_per_prompt": 1,
- "max_pdf_size_mb": 30,
- "input_cost_per_image": 0,
- "input_cost_per_video_per_second": 0,
- "input_cost_per_audio_per_second": 0,
- "input_cost_per_token": 0.00000125,
- "input_cost_per_character": 0,
- "input_cost_per_token_above_128k_tokens": 0,
- "input_cost_per_character_above_128k_tokens": 0,
- "input_cost_per_image_above_128k_tokens": 0,
- "input_cost_per_video_per_second_above_128k_tokens": 0,
- "input_cost_per_audio_per_second_above_128k_tokens": 0,
- "output_cost_per_token": 0.000010,
- "output_cost_per_character": 0,
- "output_cost_per_token_above_128k_tokens": 0,
- "output_cost_per_character_above_128k_tokens": 0,
- "litellm_provider": "gemini",
- "mode": "chat",
- "supports_system_messages": true,
- "supports_function_calling": true,
- "supports_vision": true,
- "supports_audio_input": true,
- "supports_video_input": true,
- "supports_pdf_input": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing"
- },
"vertex_ai/gemini-2.5-pro-exp-03-25": {
"max_tokens": 8192,
"max_input_tokens": 1048576,
@@ -523,15 +357,6 @@
"litellm_provider": "openrouter",
"mode": "chat"
},
- "xai/grok-3-beta": {
- "max_tokens": 131072,
- "max_input_tokens": 131072,
- "max_output_tokens": 131072,
- "input_cost_per_token": 0.000003,
- "output_cost_per_token": 0.000015,
- "litellm_provider": "xai",
- "mode": "chat"
- },
"openrouter/x-ai/grok-3-mini-beta": {
"max_tokens": 131072,
"max_input_tokens": 131072,
@@ -541,15 +366,6 @@
"litellm_provider": "openrouter",
"mode": "chat"
},
- "xai/grok-3-mini-beta": {
- "max_tokens": 131072,
- "max_input_tokens": 131072,
- "max_output_tokens": 131072,
- "input_cost_per_token": 0.0000003,
- "output_cost_per_token": 0.0000005,
- "litellm_provider": "xai",
- "mode": "chat"
- },
"openrouter/x-ai/grok-3-fast-beta": {
"max_tokens": 131072,
"max_input_tokens": 131072,
@@ -559,15 +375,6 @@
"litellm_provider": "openrouter",
"mode": "chat"
},
- "xai/grok-3-fast-beta": {
- "max_tokens": 131072,
- "max_input_tokens": 131072,
- "max_output_tokens": 131072,
- "input_cost_per_token": 0.000005,
- "output_cost_per_token": 0.000025,
- "litellm_provider": "xai",
- "mode": "chat"
- },
"openrouter/x-ai/grok-3-mini-fast-beta": {
"max_tokens": 131072,
"max_input_tokens": 131072,
@@ -577,15 +384,6 @@
"litellm_provider": "openrouter",
"mode": "chat"
},
- "xai/grok-3-mini-fast-beta": {
- "max_tokens": 131072,
- "max_input_tokens": 131072,
- "max_output_tokens": 131072,
- "input_cost_per_token": 0.0000006,
- "output_cost_per_token": 0.000004,
- "litellm_provider": "xai",
- "mode": "chat"
- },
"openrouter/google/gemini-2.0-flash-exp:free": {
"max_tokens": 8192,
"max_input_tokens": 1048576,
From 20a29e5cd18f85180d451603f2fbc63e2e7b7593 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 11:12:54 -0700
Subject: [PATCH 44/66] copy
---
aider/website/docs/llms.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/website/docs/llms.md b/aider/website/docs/llms.md
index 2180f9b63..c2475431c 100644
--- a/aider/website/docs/llms.md
+++ b/aider/website/docs/llms.md
@@ -16,7 +16,7 @@ description: Aider can connect to most LLMs for AI pair programming.
Aider works best with these models, which are skilled at editing code:
-- [Gemini 2.5 Pro](/docs/gemini.html)
+- [Gemini 2.5 Pro](/docs/llms/gemini.html)
- [DeepSeek R1 and V3](/docs/llms/deepseek.html)
- [Claude 3.7 Sonnet](/docs/llms/anthropic.html)
- [OpenAI o3, o4-mini and GPT-4.1](/docs/llms/openai.html)
From 1a4d3927e7eab362a8d19d54149d0963a0a91436 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:29:33 -0700
Subject: [PATCH 45/66] feat: Add --thinking-tokens option to benchmark script
---
benchmark/benchmark.py | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index 71d3cec3e..a3c2ca850 100755
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -209,6 +209,9 @@ def main(
reasoning_effort: Optional[str] = typer.Option(
None, "--reasoning-effort", help="Set reasoning effort for models that support it"
),
+ thinking_tokens: Optional[int] = typer.Option(
+ None, "--thinking-tokens", help="Set thinking tokens for models that support it"
+ ),
exercises_dir: str = typer.Option(
EXERCISES_DIR_DEFAULT, "--exercises-dir", help="Directory with exercise files"
),
@@ -366,6 +369,7 @@ def main(
num_ctx,
sleep,
reasoning_effort,
+ thinking_tokens,
)
all_results.append(results)
@@ -391,6 +395,7 @@ def main(
num_ctx,
sleep,
reasoning_effort,
+ thinking_tokens,
)
all_results = run_test_threaded.gather(tqdm=True)
@@ -489,6 +494,7 @@ def summarize_results(dirname, stats_languages=None):
res.lazy_comments = 0
res.reasoning_effort = None
+ res.thinking_tokens = None
variants = defaultdict(set)
for results in all_results:
@@ -518,6 +524,7 @@ def summarize_results(dirname, stats_languages=None):
res.indentation_errors += results.get("indentation_errors", 0)
res.reasoning_effort = results.get("reasoning_effort")
+ res.thinking_tokens = results.get("thinking_tokens")
for key in "model edit_format commit_hash editor_model editor_edit_format".split():
val = results.get(key)
@@ -564,6 +571,8 @@ def summarize_results(dirname, stats_languages=None):
if res.reasoning_effort is not None:
print(f" reasoning_effort: {res.reasoning_effort}")
+ if res.thinking_tokens is not None:
+ print(f" thinking_tokens: {res.thinking_tokens}")
for i in range(tries):
print(f" pass_rate_{i + 1}: {percents[i]:.1f}")
@@ -650,15 +659,14 @@ def get_replayed_content(replay_dname, test_dname):
def run_test(original_dname, testdir, *args, **kwargs):
try:
return run_test_real(original_dname, testdir, *args, **kwargs)
- except Exception as err:
+ except Exception:
print("=" * 40)
print("Test failed")
- print(err)
traceback.print_exc()
testdir = Path(testdir)
results_fname = testdir / ".aider.results.json"
- results_fname.write_text(json.dumps(dict(exception=str(err))))
+ results_fname.write_text(json.dumps(dict(exception=traceback.format_exc())))
def run_test_real(
@@ -677,6 +685,7 @@ def run_test_real(
num_ctx=None,
sleep=0,
reasoning_effort: Optional[str] = None,
+ thinking_tokens: Optional[int] = None,
read_model_settings=None,
):
if not os.path.isdir(testdir):
@@ -787,6 +796,9 @@ def run_test_real(
if reasoning_effort is not None:
main_model.set_reasoning_effort(reasoning_effort)
+ if thinking_tokens is not None:
+ main_model.set_thinking_tokens(thinking_tokens)
+
dump(main_model.max_chat_history_tokens)
if num_ctx:
@@ -938,6 +950,7 @@ def run_test_real(
indentation_errors=indentation_errors,
lazy_comments=lazy_comments, # Add the count of pattern matches to the results
reasoning_effort=reasoning_effort,
+ thinking_tokens=thinking_tokens,
chat_hashes=list(
zip(
coder.chat_completion_call_hashes,
From 8c3f167e8c48ed86ab4f746f7787e3a2ad04c90b Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 11:31:55 -0700
Subject: [PATCH 46/66] feat: Add simple unified diff coder
---
aider/coders/udiff_simple.py | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 aider/coders/udiff_simple.py
diff --git a/aider/coders/udiff_simple.py b/aider/coders/udiff_simple.py
new file mode 100644
index 000000000..e69de29bb
From 3ca3f39f1d22ca03ed85b7e5a023ffd0e06a7b15 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:31:55 -0700
Subject: [PATCH 47/66] feat: Add UnifiedDiffSimpleCoder with simpler prompt
for code edits
---
aider/coders/udiff_simple.py | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/aider/coders/udiff_simple.py b/aider/coders/udiff_simple.py
index e69de29bb..290178ed4 100644
--- a/aider/coders/udiff_simple.py
+++ b/aider/coders/udiff_simple.py
@@ -0,0 +1,16 @@
+from .udiff_coder import UnifiedDiffCoder
+
+
+class UnifiedDiffSimpleCoder(UnifiedDiffCoder):
+ """
+ A coder that uses unified diff format for code modifications.
+ This variant uses a simpler prompt that doesn't mention specific
+ diff rules like using `@@ ... @@` lines or avoiding line numbers.
+ """
+
+ edit_format = "udiff-simple"
+
+ # We can inherit the prompts if they are suitable or override them here
+ # For now, let's assume the base UnifiedDiffPrompts are sufficient
+ # If specific prompts are needed for the "simple" version, they would be defined here.
+ # gpt_prompts = UnifiedDiffSimplePrompts()
From ab11118c8afd8e309a84fab0ef1666a9c7b8ee14 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 11:32:41 -0700
Subject: [PATCH 48/66] feat: Add simple prompts for unified diff coder
---
aider/coders/udiff_simple_prompts.py | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 aider/coders/udiff_simple_prompts.py
diff --git a/aider/coders/udiff_simple_prompts.py b/aider/coders/udiff_simple_prompts.py
new file mode 100644
index 000000000..e69de29bb
From ba4d613cbc7dd261d400dab61931df089d92ba6b Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:32:42 -0700
Subject: [PATCH 49/66] feat: Give udiff-simple its own prompts, inheriting
from udiff prompts
---
aider/coders/udiff_simple.py | 6 ++----
aider/coders/udiff_simple_prompts.py | 16 ++++++++++++++++
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/aider/coders/udiff_simple.py b/aider/coders/udiff_simple.py
index 290178ed4..9cc51991d 100644
--- a/aider/coders/udiff_simple.py
+++ b/aider/coders/udiff_simple.py
@@ -1,4 +1,5 @@
from .udiff_coder import UnifiedDiffCoder
+from .udiff_simple_prompts import UnifiedDiffSimplePrompts
class UnifiedDiffSimpleCoder(UnifiedDiffCoder):
@@ -10,7 +11,4 @@ class UnifiedDiffSimpleCoder(UnifiedDiffCoder):
edit_format = "udiff-simple"
- # We can inherit the prompts if they are suitable or override them here
- # For now, let's assume the base UnifiedDiffPrompts are sufficient
- # If specific prompts are needed for the "simple" version, they would be defined here.
- # gpt_prompts = UnifiedDiffSimplePrompts()
+ gpt_prompts = UnifiedDiffSimplePrompts()
diff --git a/aider/coders/udiff_simple_prompts.py b/aider/coders/udiff_simple_prompts.py
index e69de29bb..b604f78dc 100644
--- a/aider/coders/udiff_simple_prompts.py
+++ b/aider/coders/udiff_simple_prompts.py
@@ -0,0 +1,16 @@
+from .udiff_prompts import UnifiedDiffPrompts
+
+
+class UnifiedDiffSimplePrompts(UnifiedDiffPrompts):
+ """
+ Prompts for the UnifiedDiffSimpleCoder.
+ Inherits from UnifiedDiffPrompts and can override specific prompts
+ if a simpler wording is desired for this edit format.
+ """
+
+ # For now, we inherit all prompts. Override specific ones below if needed.
+ # For example, to override the main_system prompt:
+ # main_system = """
+ # A simpler version of the main system prompt for udiff-simple.
+ # """
+ pass
From 5423ffe51837e6b5062907a565dc8d86dc1fc1ee Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 11:34:10 -0700
Subject: [PATCH 50/66] feat: Add UnifiedDiffSimpleCoder to coders module
---
aider/coders/__init__.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/aider/coders/__init__.py b/aider/coders/__init__.py
index e494fa3e4..88bcddfaa 100644
--- a/aider/coders/__init__.py
+++ b/aider/coders/__init__.py
@@ -10,6 +10,7 @@ from .editor_whole_coder import EditorWholeFileCoder
from .help_coder import HelpCoder
from .patch_coder import PatchCoder
from .udiff_coder import UnifiedDiffCoder
+from .udiff_simple import UnifiedDiffSimpleCoder
from .wholefile_coder import WholeFileCoder
# from .single_wholefile_func_coder import SingleWholeFileFunctionCoder
@@ -23,6 +24,7 @@ __all__ = [
WholeFileCoder,
PatchCoder,
UnifiedDiffCoder,
+ UnifiedDiffSimpleCoder,
# SingleWholeFileFunctionCoder,
ArchitectCoder,
EditorEditBlockCoder,
From ac1ff231e05b923ce1a09007dde3442aeb12459c Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 12:38:09 -0700
Subject: [PATCH 51/66] better prompt
---
aider/coders/udiff_simple_prompts.py | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/aider/coders/udiff_simple_prompts.py b/aider/coders/udiff_simple_prompts.py
index b604f78dc..706bb1026 100644
--- a/aider/coders/udiff_simple_prompts.py
+++ b/aider/coders/udiff_simple_prompts.py
@@ -8,9 +8,18 @@ class UnifiedDiffSimplePrompts(UnifiedDiffPrompts):
if a simpler wording is desired for this edit format.
"""
- # For now, we inherit all prompts. Override specific ones below if needed.
- # For example, to override the main_system prompt:
- # main_system = """
- # A simpler version of the main system prompt for udiff-simple.
- # """
- pass
+ example_messages = []
+
+ system_reminder = """# File editing rules:
+
+Return edits similar to unified diffs that `diff -U0` would produce.
+
+The user's patch tool needs CORRECT patches that apply cleanly against the current contents of the file!
+Think carefully and make sure you include and mark all lines that need to be removed or changed as `-` lines.
+Make sure you mark all new or modified lines with `+`.
+Don't leave out any lines or the diff patch won't apply correctly.
+
+To make a new file, show a diff from `--- /dev/null` to `+++ path/to/new/file.ext`.
+
+{lazy_prompt}
+"""
From c94340d4931617bd7d384d1e5cf4ce64a5de32c6 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 13:18:57 -0700
Subject: [PATCH 52/66] less ram
---
benchmark/docker.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/benchmark/docker.sh b/benchmark/docker.sh
index 3edde7c66..6f97b865e 100755
--- a/benchmark/docker.sh
+++ b/benchmark/docker.sh
@@ -2,8 +2,8 @@
docker run \
-it --rm \
- --memory=25g \
- --memory-swap=25g \
+ --memory=12g \
+ --memory-swap=12g \
--add-host=host.docker.internal:host-gateway \
-v `pwd`:/aider \
-v `pwd`/tmp.benchmarks/.:/benchmarks \
From 230e5065c1b07b43525916d92e39ec8e715bd5a1 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 15:47:34 -0700
Subject: [PATCH 53/66] feat: Add gemini-2.5-flash-preview-04-17 model and
leaderboard entry
---
aider/resources/model-settings.yml | 4 +++
aider/website/_data/polyglot_leaderboard.yml | 28 +++++++++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 7b5970d6e..4f1c8ec80 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1367,3 +1367,7 @@
# extra_body:
# reasoning_effort: high
+- name: gemini/gemini-2.5-flash-preview-04-17
+ edit_format: diff
+ use_repo_map: true
+ accepts_settings: ["thinking_tokens"]
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 5d7c651ae..0af93a8de 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1197,4 +1197,30 @@
date: 2025-04-19
versions: 0.82.2.dev
seconds_per_case: 195.6
- total_cost: 0.0000
\ No newline at end of file
+ total_cost: 0.0000
+
+- dirname: 2025-04-20-19-54-31--flash25-diff-no-think
+ test_cases: 225
+ model: gemini-2.5-flash-preview-04-17 (default)
+ edit_format: diff
+ commit_hash: 7fcce5d-dirty
+ pass_rate_1: 21.8
+ pass_rate_2: 47.1
+ pass_num_1: 49
+ pass_num_2: 106
+ percent_cases_well_formed: 85.3
+ error_outputs: 60
+ num_malformed_responses: 55
+ num_with_malformed_responses: 33
+ user_asks: 82
+ lazy_comments: 1
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 5
+ test_timeouts: 4
+ total_tests: 225
+ command: aider --model gemini/gemini-2.5-flash-preview-04-17
+ date: 2025-04-20
+ versions: 0.82.3.dev
+ seconds_per_case: 50.1
+ total_cost: 1.8451
\ No newline at end of file
From 19de93ae39c18cb5798cd1992451089788645d92 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 15:58:54 -0700
Subject: [PATCH 54/66] fix: Update weak model name for
gemini-2.5-pro-exp-03-25
---
aider/resources/model-settings.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 4f1c8ec80..870d6b669 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -965,7 +965,7 @@
- name: gemini/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
use_repo_map: true
- weak_model_name: gemini/gemini-2.0-flash
+ weak_model_name: gemini/gemini-2.5-flash-preview-04-17
- name: openrouter/google/gemini-2.5-pro-exp-03-25:free
edit_format: diff-fenced
From bbab0cea5e8c722814053e021eeba3cbc95b8dfd Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 16:01:03 -0700
Subject: [PATCH 55/66] feat: Add model settings for
gemini-2.5-flash-preview-04-17 models
---
aider/resources/model-settings.yml | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 870d6b669..8355e0c92 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1371,3 +1371,13 @@
edit_format: diff
use_repo_map: true
accepts_settings: ["thinking_tokens"]
+
+- name: gemini-2.5-flash-preview-04-17
+ edit_format: diff
+ use_repo_map: true
+ accepts_settings: ["thinking_tokens"]
+
+- name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ edit_format: diff
+ use_repo_map: true
+ accepts_settings: ["thinking_tokens"]
From 16fbff8de1e26686c962414419fb4b5841eb6cc2 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 16:04:04 -0700
Subject: [PATCH 56/66] Feat: Add gemini-2.5-flash-preview-04-17 as editor/weak
model name
---
aider/resources/model-settings.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 8355e0c92..43ec1438d 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -975,14 +975,14 @@
- name: vertex_ai/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
use_repo_map: true
- # Need metadata for this one...
- #weak_model_name: vertex_ai/gemini-2.0-flash
+ weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- name: vertex_ai/gemini-2.5-pro-preview-03-25
edit_format: diff-fenced
use_repo_map: true
- # Need metadata for this one...
- #weak_model_name: vertex_ai/gemini-2.0-flash
+ weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- name: openrouter/openrouter/quasar-alpha
use_repo_map: true
From 48733a315b61192f07b294881a99cb0105cb9f89 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 16:25:54 -0700
Subject: [PATCH 57/66] fix: Handle filenames starting with fence chars in
editblock coder
---
aider/coders/editblock_coder.py | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/aider/coders/editblock_coder.py b/aider/coders/editblock_coder.py
index 4d7776278..471a0c37c 100644
--- a/aider/coders/editblock_coder.py
+++ b/aider/coders/editblock_coder.py
@@ -412,7 +412,13 @@ def strip_filename(filename, fence):
return
start_fence = fence[0]
- if filename.startswith(start_fence) or filename.startswith(triple_backticks):
+ if filename.startswith(start_fence):
+ candidate = filename[len(start_fence):]
+ if candidate and "." in candidate:
+ return candidate
+
+ if filename.startswith(triple_backticks):
+ candidate = # ai!
return
filename = filename.rstrip(":")
From f28504a2eb96be99433e76a8501fd909ce6d8e46 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 16:25:55 -0700
Subject: [PATCH 58/66] fix: Properly handle filenames starting with triple
backticks
---
aider/coders/editblock_coder.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/aider/coders/editblock_coder.py b/aider/coders/editblock_coder.py
index 471a0c37c..32020f30f 100644
--- a/aider/coders/editblock_coder.py
+++ b/aider/coders/editblock_coder.py
@@ -418,8 +418,7 @@ def strip_filename(filename, fence):
return candidate
if filename.startswith(triple_backticks):
- candidate = # ai!
- return
+ filename = filename[len(triple_backticks):]
filename = filename.rstrip(":")
filename = filename.lstrip("#")
From c6ce87170060ea76507903622f0e47b2ed58a980 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Sun, 20 Apr 2025 16:25:59 -0700
Subject: [PATCH 59/66] style: Apply linter to editblock_coder.py
---
aider/coders/editblock_coder.py | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/aider/coders/editblock_coder.py b/aider/coders/editblock_coder.py
index 32020f30f..bb0a01914 100644
--- a/aider/coders/editblock_coder.py
+++ b/aider/coders/editblock_coder.py
@@ -413,12 +413,12 @@ def strip_filename(filename, fence):
start_fence = fence[0]
if filename.startswith(start_fence):
- candidate = filename[len(start_fence):]
+ candidate = filename[len(start_fence) :]
if candidate and "." in candidate:
return candidate
if filename.startswith(triple_backticks):
- filename = filename[len(triple_backticks):]
+ filename = filename[len(triple_backticks) :]
filename = filename.rstrip(":")
filename = filename.lstrip("#")
@@ -461,8 +461,12 @@ def find_original_update_blocks(content, fence=DEFAULT_FENCE, valid_fnames=None)
]
# Check if the next line or the one after that is an editblock
- next_is_editblock = (i + 1 < len(lines) and head_pattern.match(lines[i + 1].strip())
- or i + 2 < len(lines) and head_pattern.match(lines[i + 2].strip()))
+ next_is_editblock = (
+ i + 1 < len(lines)
+ and head_pattern.match(lines[i + 1].strip())
+ or i + 2 < len(lines)
+ and head_pattern.match(lines[i + 2].strip())
+ )
if any(line.strip().startswith(start) for start in shell_starts) and not next_is_editblock:
shell_content = []
From 5e210c700d8f3f6f24248981bd259acdfd0410b9 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 16:36:36 -0700
Subject: [PATCH 60/66] fix: Handle filenames starting with fences or triple
backticks correctly
---
aider/coders/editblock_coder.py | 8 ++++--
tests/basic/test_editblock.py | 45 ++++++++-------------------------
2 files changed, 16 insertions(+), 37 deletions(-)
diff --git a/aider/coders/editblock_coder.py b/aider/coders/editblock_coder.py
index bb0a01914..d8f85da52 100644
--- a/aider/coders/editblock_coder.py
+++ b/aider/coders/editblock_coder.py
@@ -414,11 +414,15 @@ def strip_filename(filename, fence):
start_fence = fence[0]
if filename.startswith(start_fence):
candidate = filename[len(start_fence) :]
- if candidate and "." in candidate:
+ if candidate and ("." in candidate or "/" in candidate):
return candidate
+ return
if filename.startswith(triple_backticks):
- filename = filename[len(triple_backticks) :]
+ candidate = filename[len(triple_backticks) :]
+ if candidate and ("." in candidate or "/" in candidate):
+ return candidate
+ return
filename = filename.rstrip(":")
filename = filename.lstrip("#")
diff --git a/tests/basic/test_editblock.py b/tests/basic/test_editblock.py
index d80952bbe..e93edb7c3 100644
--- a/tests/basic/test_editblock.py
+++ b/tests/basic/test_editblock.py
@@ -108,29 +108,6 @@ Hope you like it!
edits = list(eb.find_original_update_blocks(edit))
self.assertEqual(edits, [("foo.txt", "Two\n", "Tooooo\n")])
- def test_find_original_update_blocks_mangled_filename_w_source_tag(self):
- source = "source"
-
- edit = """
-Here's the change:
-
-<%s>foo.txt
-<<<<<<< SEARCH
-One
-=======
-Two
->>>>>>> REPLACE
-%s>
-
-Hope you like it!
-""" % (source, source)
-
- fence = ("<%s>" % source, "%s>" % source)
-
- with self.assertRaises(ValueError) as cm:
- _edits = list(eb.find_original_update_blocks(edit, fence))
- self.assertIn("missing filename", str(cm.exception))
-
def test_find_original_update_blocks_quote_below_filename(self):
edit = """
Here's the change:
@@ -181,10 +158,11 @@ Tooooo
oops!
+>>>>>>> REPLACE
"""
with self.assertRaises(ValueError) as cm:
- list(eb.find_original_update_blocks(edit))
+ _blocks = list(eb.find_original_update_blocks(edit))
self.assertIn("filename", str(cm.exception))
def test_find_original_update_blocks_no_final_newline(self):
@@ -575,7 +553,7 @@ Hope you like it!
edits = list(eb.find_original_update_blocks(edit, fence=quad_backticks))
self.assertEqual(edits, [("foo.txt", "", "Tooooo\n")])
- #Test for shell script blocks with sh language identifier (issue #3785)
+ # Test for shell script blocks with sh language identifier (issue #3785)
def test_find_original_update_blocks_with_sh_language_identifier(self):
# https://github.com/Aider-AI/aider/issues/3785
edit = """
@@ -609,13 +587,13 @@ exit 0
# Check that the content contains the expected shell script elements
result_content = edits[0][2]
self.assertIn("#!/bin/bash", result_content)
- self.assertIn("if [ \"$#\" -ne 1 ];", result_content)
- self.assertIn("echo \"Usage: $0 \"", result_content)
+ self.assertIn('if [ "$#" -ne 1 ];', result_content)
+ self.assertIn('echo "Usage: $0 "', result_content)
self.assertIn("exit 1", result_content)
- self.assertIn("echo \"$1\"", result_content)
+ self.assertIn('echo "$1"', result_content)
self.assertIn("exit 0", result_content)
- #Test for C# code blocks with csharp language identifier
+ # Test for C# code blocks with csharp language identifier
def test_find_original_update_blocks_with_csharp_language_identifier(self):
edit = """
Here's a C# code change:
@@ -631,12 +609,9 @@ Console.WriteLine("Hello, C# World!");
"""
edits = list(eb.find_original_update_blocks(edit))
- search_text = "Console.WriteLine(\"Hello World!\");\n"
- replace_text = "Console.WriteLine(\"Hello, C# World!\");\n"
- self.assertEqual(
- edits,
- [("Program.cs", search_text, replace_text)]
- )
+ search_text = 'Console.WriteLine("Hello World!");\n'
+ replace_text = 'Console.WriteLine("Hello, C# World!");\n'
+ self.assertEqual(edits, [("Program.cs", search_text, replace_text)])
if __name__ == "__main__":
From 7719eae0234ccdcfbb27dd1415d8225db83d7398 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 16:41:58 -0700
Subject: [PATCH 61/66] copy
---
HISTORY.md | 8 +
aider/website/HISTORY.md | 8 +
aider/website/assets/sample-analytics.jsonl | 440 +++++++++---------
.../website/docs/config/adv-model-settings.md | 24 +-
aider/website/docs/faq.md | 14 +-
5 files changed, 266 insertions(+), 228 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index f3f839e7d..337a05e6c 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,5 +1,13 @@
# Release history
+### main branch
+
+- Add support for `gemini-2.5-flash-preview-04-17` models.
+- Improved "diff" format for Gemini 2.5 Flash by accepting filenames provided on the same line as the opening fence.
+- Add new `udiff-simple` edit format, for Gemini 2.5 Pro.
+- Update default weak/editor models for Gemini 2.5 Pro models to use `gemini-2.5-flash-preview-04-17`.
+- Aider wrote 69% of the code in this release.
+
### Aider v0.82.2
- Fix editing shell files with diff-fenced, by zjy1412.
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index fa3fdcb22..abce8bd1d 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -24,6 +24,14 @@ cog.out(text)
]]]-->
+### main branch
+
+- Add support for `gemini-2.5-flash-preview-04-17` models.
+- Improved "diff" format for Gemini 2.5 Flash by accepting filenames provided on the same line as the opening fence.
+- Add new `udiff-simple` edit format, for Gemini 2.5 Pro.
+- Update default weak/editor models for Gemini 2.5 Pro models to use `gemini-2.5-flash-preview-04-17`.
+- Aider wrote 69% of the code in this release.
+
### Aider v0.82.2
- Fix editing shell files with diff-fenced, by zjy1412.
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 3c18d8c53..90d6e65dd 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,223 +1,3 @@
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 13075, "completion_tokens": 2645, "total_tokens": 15720, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744587358}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591225}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591226}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591226}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591226}
-{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591241}
-{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591241}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591241}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 14867, "completion_tokens": 214, "total_tokens": 15081, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591248}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591285}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 15502, "completion_tokens": 173, "total_tokens": 15675, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591288}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591289}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 16016, "completion_tokens": 49, "total_tokens": 16065, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744591293}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744593859}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744606398}
-{"event": "exit", "properties": {"reason": "Listed models"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744606400}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644920}
-{"event": "repo", "properties": {"num_files": 205}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644926}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644926}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644929}
-{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644932}
-{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644932}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644932}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 6260, "completion_tokens": 112, "total_tokens": 6372, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644943}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744644959}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648515}
-{"event": "repo", "properties": {"num_files": 205}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648516}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648516}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648516}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648538}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648543}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648544}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 3917, "completion_tokens": 433, "total_tokens": 4350, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648558}
-{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648573}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648574}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 6666, "completion_tokens": 192, "total_tokens": 6858, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648578}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648601}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648632}
-{"event": "repo", "properties": {"num_files": 209}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648632}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648632}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648633}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648645}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 6426, "completion_tokens": 113, "total_tokens": 6539, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648649}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648658}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648729}
-{"event": "repo", "properties": {"num_files": 209}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648729}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648729}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648729}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648746}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 6386, "completion_tokens": 150, "total_tokens": 6536, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648754}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648848}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 6704, "completion_tokens": 222, "total_tokens": 6926, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648858}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648889}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 6951, "completion_tokens": 215, "total_tokens": 7166, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648896}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648911}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 7181, "completion_tokens": 181, "total_tokens": 7362, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744648917}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744649052}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 7409, "completion_tokens": 365, "total_tokens": 7774, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744649062}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744649118}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744663883}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744663885}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744663885}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744663885}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664016}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664025}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664027}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664027}
-{"event": "cli session", "properties": {"main_model": "gpt-4.1", "weak_model": "gpt-4.1", "editor_model": "gpt-4.1", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664027}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664029}
-{"event": "message_send", "properties": {"main_model": "gpt-4.1", "weak_model": "gpt-4.1", "editor_model": "gpt-4.1", "edit_format": "diff", "prompt_tokens": 10637, "completion_tokens": 50, "total_tokens": 10687, "cost": 0.021674, "total_cost": 0.021674}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664034}
-{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664040}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664048}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664051}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664051}
-{"event": "cli session", "properties": {"main_model": "gpt-4.1", "weak_model": "gpt-4.1", "editor_model": "gpt-4.1", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664051}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664071}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664182}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664183}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664183}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664183}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664319}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 14361, "completion_tokens": 809, "total_tokens": 15170, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664339}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664340}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 15983, "completion_tokens": 334, "total_tokens": 16317, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664349}
-{"event": "command_architect", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664636}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664639}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664643}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664649}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664650}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 12108, "completion_tokens": 649, "total_tokens": 12757, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664664}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664664}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 9878, "completion_tokens": 936, "total_tokens": 10814, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664674}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664709}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664727}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 12196, "completion_tokens": 178, "total_tokens": 12374, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664733}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664733}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 9525, "completion_tokens": 217, "total_tokens": 9742, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664738}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664814}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 12464, "completion_tokens": 452, "total_tokens": 12916, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664831}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664832}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 9839, "completion_tokens": 957, "total_tokens": 10796, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664848}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664885}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664886}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664892}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664918}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 12204, "completion_tokens": 92, "total_tokens": 12296, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664926}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664926}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 9439, "completion_tokens": 114, "total_tokens": 9553, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664932}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664961}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664963}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 12251, "completion_tokens": 305, "total_tokens": 12556, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664980}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664980}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 9674, "completion_tokens": 73, "total_tokens": 9747, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744664984}
-{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665447}
-{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665455}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665459}
-{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665471}
-{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665484}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665533}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 24637, "completion_tokens": 2765, "total_tokens": 27402, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665600}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665600}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 24366, "completion_tokens": 121, "total_tokens": 24487, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665607}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665905}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665906}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665906}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665906}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665914}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665949}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665951}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665951}
-{"event": "cli session", "properties": {"main_model": "gpt-4.1", "weak_model": "gpt-4.1-mini", "editor_model": "gpt-4.1-mini", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665951}
-{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665952}
-{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665952}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665966}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 16140, "completion_tokens": 311, "total_tokens": 16451, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665977}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665978}
-{"event": "command_architect", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665984}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665986}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665987}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 13886, "completion_tokens": 174, "total_tokens": 14060, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665994}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665994}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 11452, "completion_tokens": 290, "total_tokens": 11742, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665999}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744665999}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 12204, "completion_tokens": 317, "total_tokens": 12521, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666007}
-{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666080}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666094}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666096}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666096}
-{"event": "cli session", "properties": {"main_model": "gpt-4.1-mini", "weak_model": "gpt-4.1-mini", "editor_model": "gpt-4.1-mini", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666096}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666098}
-{"event": "message_send", "properties": {"main_model": "gpt-4.1-mini", "weak_model": "gpt-4.1-mini", "editor_model": "gpt-4.1-mini", "edit_format": "diff", "prompt_tokens": 11733, "completion_tokens": 42, "total_tokens": 11775, "cost": 0.0047604, "total_cost": 0.0047604}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666101}
-{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666102}
-{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666102}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666302}
-{"event": "repo", "properties": {"num_files": 590}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666303}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666303}
-{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666303}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666308}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666367}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 27445, "completion_tokens": 2380, "total_tokens": 29825, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666387}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666387}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 23982, "completion_tokens": 2376, "total_tokens": 26358, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666406}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666590}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 30380, "completion_tokens": 987, "total_tokens": 31367, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666601}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666602}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 31879, "completion_tokens": 238, "total_tokens": 32117, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666613}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666619}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 32674, "completion_tokens": 169, "total_tokens": 32843, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666622}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666704}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666704}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 29052, "completion_tokens": 1012, "total_tokens": 30064, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666742}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666873}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666877}
-{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666885}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666893}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666893}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666923}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 14154, "completion_tokens": 137, "total_tokens": 14291, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666930}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666931}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 17505, "completion_tokens": 1217, "total_tokens": 18722, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666932}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 11623, "completion_tokens": 226, "total_tokens": 11849, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666939}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744666971}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667034}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 19170, "completion_tokens": 5717, "total_tokens": 24887, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667035}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667035}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 14509, "completion_tokens": 7991, "total_tokens": 22500, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667108}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667115}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 26817, "completion_tokens": 629, "total_tokens": 27446, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667123}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667145}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667155}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667155}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 14926, "completion_tokens": 1210, "total_tokens": 16136, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667199}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667332}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667350}
-{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667366}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667367}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667408}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 14827, "completion_tokens": 2438, "total_tokens": 17265, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667443}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667449}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 15669, "completion_tokens": 2562, "total_tokens": 18231, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667470}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667479}
-{"event": "command_chat-mode", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667492}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667498}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 15842, "completion_tokens": 1819, "total_tokens": 17661, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667522}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667523}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 18852, "completion_tokens": 2212, "total_tokens": 21064, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667547}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667547}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667563}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667564}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667659}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 11633, "completion_tokens": 1878, "total_tokens": 13511, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667686}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667738}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667769}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667769}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 11319, "completion_tokens": 1373, "total_tokens": 12692, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667791}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667864}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667877}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 12727, "completion_tokens": 1245, "total_tokens": 13972, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667888}
-{"event": "command_chat-mode", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667907}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667913}
{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "whole", "prompt_tokens": 13359, "completion_tokens": 1287, "total_tokens": 14646, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667925}
{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667990}
{"event": "command_architect", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667991}
@@ -998,3 +778,223 @@
{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163513}
{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163513}
{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163513}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745163518}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169424}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169425}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169425}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169425}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169504}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169513}
+{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169513}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169513}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169515}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169818}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169922}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 12540, "completion_tokens": 4598, "total_tokens": 17138, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169961}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169983}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169986}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745169991}
+{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745170026}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745170032}
+{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745170033}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745170035}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 11415, "completion_tokens": 3674, "total_tokens": 15089, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745170079}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745170445}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 15533, "completion_tokens": 259, "total_tokens": 15792, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745170451}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171263}
+{"event": "repo", "properties": {"num_files": 612}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171263}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171263}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171264}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 8867, "completion_tokens": 17, "total_tokens": 8884, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171269}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171269}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171274}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171276}
+{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171302}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171306}
+{"event": "repo", "properties": {"num_files": 612}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171307}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171307}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171307}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 9113, "completion_tokens": 17, "total_tokens": 9130, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171312}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171312}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171723}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171757}
+{"event": "repo", "properties": {"num_files": 612}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171758}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171758}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171758}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171761}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171764}
+{"event": "repo", "properties": {"num_files": 612}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171765}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171765}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-preview-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-preview-03-25", "edit_format": "diff-fenced"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171765}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171829}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171854}
+{"event": "repo", "properties": {"num_files": 612}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171854}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171854}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171854}
+{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171874}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171909}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 12362, "completion_tokens": 445, "total_tokens": 12807, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171917}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171960}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 13269, "completion_tokens": 262, "total_tokens": 13531, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171970}
+{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171985}
+{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171988}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171994}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 20636, "completion_tokens": 177, "total_tokens": 20813, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745171998}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172037}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 20894, "completion_tokens": 496, "total_tokens": 21390, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172048}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172095}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 21739, "completion_tokens": 251, "total_tokens": 21990, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172099}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172115}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 22364, "completion_tokens": 155, "total_tokens": 22519, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172119}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172137}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 22589, "completion_tokens": 696, "total_tokens": 23285, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172157}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172200}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172211}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 23740, "completion_tokens": 695, "total_tokens": 24435, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172220}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172282}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 24460, "completion_tokens": 1797, "total_tokens": 26257, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172335}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172348}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 27939, "completion_tokens": 314, "total_tokens": 28253, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172356}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172356}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 28199, "completion_tokens": 1732, "total_tokens": 29931, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172379}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172493}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172522}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 19352, "completion_tokens": 467, "total_tokens": 19819, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172532}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172581}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172586}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172594}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 20067, "completion_tokens": 327, "total_tokens": 20394, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172610}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172650}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 22284, "completion_tokens": 426, "total_tokens": 22710, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172657}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172722}
+{"event": "repo", "properties": {"num_files": 613}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172724}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172724}
+{"event": "cli session", "properties": {"main_model": "xai/grok-3-fast-beta", "weak_model": "xai/grok-3-fast-beta", "editor_model": "xai/grok-3-fast-beta", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172724}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172725}
+{"event": "message_send", "properties": {"main_model": "xai/grok-3-fast-beta", "weak_model": "xai/grok-3-fast-beta", "editor_model": "xai/grok-3-fast-beta", "edit_format": "diff", "prompt_tokens": 10210, "completion_tokens": 78, "total_tokens": 10288, "cost": 0.053000000000000005, "total_cost": 0.053000000000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172729}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172730}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172730}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745172883}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173009}
+{"event": "repo", "properties": {"num_files": 613}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173009}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173009}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-flash-preview-04-17", "weak_model": "gemini/gemini-2.5-flash-preview-04-17", "editor_model": "gemini/gemini-2.5-flash-preview-04-17", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173009}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173017}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-flash-preview-04-17", "weak_model": "gemini/gemini-2.5-flash-preview-04-17", "editor_model": "gemini/gemini-2.5-flash-preview-04-17", "edit_format": "whole", "prompt_tokens": 8315, "completion_tokens": 25, "total_tokens": 8340, "cost": 0.00126225, "total_cost": 0.00126225}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173024}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173227}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173231}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173234}
+{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173235}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173477}
+{"event": "repo", "properties": {"num_files": 613}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173478}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173478}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173478}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173651}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 13344, "completion_tokens": 1294, "total_tokens": 14638, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173666}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173674}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 15409, "completion_tokens": 651, "total_tokens": 16060, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173687}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173750}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173754}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173757}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173764}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 13350, "completion_tokens": 721, "total_tokens": 14071, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173772}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173790}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173796}
+{"event": "repo", "properties": {"num_files": 613}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173796}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173796}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173796}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173798}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173798}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173873}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173898}
+{"event": "repo", "properties": {"num_files": 613}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173898}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173898}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173898}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173908}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 8723, "completion_tokens": 179, "total_tokens": 8902, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173914}
+{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173939}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173954}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 7633, "completion_tokens": 328, "total_tokens": 7961, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173960}
+{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173967}
+{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173985}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173997}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 25866, "completion_tokens": 543, "total_tokens": 26409, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174004}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174035}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174044}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 26460, "completion_tokens": 137, "total_tokens": 26597, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174049}
+{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174055}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174056}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174056}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174643}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174643}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174643}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174643}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174645}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745174645}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745175891}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745175892}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745175892}
+{"event": "exit", "properties": {"reason": "Showed prompts"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745175896}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189251}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189251}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189251}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189254}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189929}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189931}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189931}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189934}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189982}
+{"event": "exit", "properties": {"reason": "Listed models"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189984}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745189999}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190000}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190000}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190000}
+{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190007}
+{"event": "command_edit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190022}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190053}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple", "prompt_tokens": 16858, "completion_tokens": 143, "total_tokens": 17001, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190062}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190237}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple", "prompt_tokens": 17173, "completion_tokens": 312, "total_tokens": 17485, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190243}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190249}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190249}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190260}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190262}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190262}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190262}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-flash-preview-04-17", "weak_model": "gemini/gemini-2.5-flash-preview-04-17", "editor_model": "gemini/gemini-2.5-flash-preview-04-17", "edit_format": "diff", "prompt_tokens": 10189, "completion_tokens": 116, "total_tokens": 10305, "cost": 0.0015979499999999999, "total_cost": 0.0015979499999999999}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190272}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190955}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190955}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190955}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190955}
+{"event": "command_edit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745190964}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191011}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191011}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 8442, "completion_tokens": 417, "total_tokens": 8859, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191025}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191054}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191054}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191127}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple", "prompt_tokens": 14287, "completion_tokens": 1995, "total_tokens": 16282, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191145}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191182}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191214}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191214}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191224}
+{"event": "command_edit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191228}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191286}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191286}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 8481, "completion_tokens": 1848, "total_tokens": 10329, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191334}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191533}
+{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191535}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191535}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple", "prompt_tokens": 8611, "completion_tokens": 89, "total_tokens": 8700, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745191553}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192191}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192191}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192191}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192196}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192301}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192301}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192301}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192301}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple", "prompt_tokens": 7873, "completion_tokens": 147, "total_tokens": 8020, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192314}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192314}
+{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192315}
+{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192318}
diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md
index ded10691a..e3c17035c 100644
--- a/aider/website/docs/config/adv-model-settings.md
+++ b/aider/website/docs/config/adv-model-settings.md
@@ -674,6 +674,12 @@ cog.out("```\n")
editor_edit_format: editor-diff
reasoning_tag: think
+- name: gemini-2.5-flash-preview-04-17
+ edit_format: diff
+ use_repo_map: true
+ accepts_settings:
+ - thinking_tokens
+
- name: gemini/gemini-1.5-flash-002
- name: gemini/gemini-1.5-flash-exp-0827
@@ -702,9 +708,15 @@ cog.out("```\n")
edit_format: diff
use_repo_map: true
+- name: gemini/gemini-2.5-flash-preview-04-17
+ edit_format: diff
+ use_repo_map: true
+ accepts_settings:
+ - thinking_tokens
+
- name: gemini/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
- weak_model_name: gemini/gemini-2.0-flash
+ weak_model_name: gemini/gemini-2.5-flash-preview-04-17
use_repo_map: true
- name: gemini/gemini-2.5-pro-preview-03-25
@@ -1446,6 +1458,12 @@ cog.out("```\n")
accepts_settings:
- thinking_tokens
+- name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ edit_format: diff
+ use_repo_map: true
+ accepts_settings:
+ - thinking_tokens
+
- name: vertex_ai/claude-3-5-haiku@20241022
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
@@ -1496,11 +1514,15 @@ cog.out("```\n")
- name: vertex_ai/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
+ weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
use_repo_map: true
+ editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- name: vertex_ai/gemini-2.5-pro-preview-03-25
edit_format: diff-fenced
+ weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
use_repo_map: true
+ editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- name: vertex_ai/gemini-pro-experimental
edit_format: diff-fenced
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index 71bb34aef..ba1207ba8 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -264,13 +264,13 @@ tr:hover { background-color: #f5f5f5; }
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 2,084,414 | 91.2% |
-o3 | 100,777 | 4.4% |
-openrouter/anthropic/claude-3.7-sonnet | 35,268 | 1.5% |
-gemini/gemini-2.5-pro-preview-03-25 | 16,524 | 0.7% |
-o4-mini | 16,499 | 0.7% |
-gpt-4.1-mini | 11,775 | 0.5% |
-gpt-4.1 | 10,687 | 0.5% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,852,969 | 90.0% |
+o3 | 100,777 | 4.9% |
+openrouter/anthropic/claude-3.7-sonnet | 35,268 | 1.7% |
+gemini/gemini-2.5-flash-preview-04-17 | 18,645 | 0.9% |
+gemini/gemini-2.5-pro-preview-03-25 | 16,524 | 0.8% |
+o4-mini | 16,499 | 0.8% |
+xai/grok-3-fast-beta | 10,288 | 0.5% |
None | 8,001 | 0.4% |
gemini/REDACTED | 606 | 0.0% |
From 7c0aac745460528c45cb7d12dd1f4fda698f80c9 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 16:43:35 -0700
Subject: [PATCH 62/66] chore: Update Gemini flash model alias to preview
version
---
aider/models.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index a31061f87..dd0abd452 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -88,7 +88,7 @@ MODEL_ALIASES = {
"3": "gpt-3.5-turbo",
# Other models
"deepseek": "deepseek/deepseek-chat",
- "flash": "gemini/gemini-2.0-flash-exp",
+ "flash": "gemini/gemini-2.5-flash-preview-04-17",
"quasar": "openrouter/openrouter/quasar-alpha",
"r1": "deepseek/deepseek-reasoner",
"gemini-2.5-pro": "gemini/gemini-2.5-pro-exp-03-25",
From b3d32f65d3b6b64d245e572e75c8979775087c61 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 17:29:42 -0700
Subject: [PATCH 63/66] fixed quote
---
README.md | 4 ++--
aider/website/assets/home.css | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index e9db1be80..688506ab5 100644
--- a/README.md
+++ b/README.md
@@ -140,7 +140,7 @@ See the [installation instructions](https://aider.chat/docs/install.html) and [u
## Kind Words From Users
-- *"My life has changed this week. There's finally an AI coding tool that's good enough to keep up with me... Aider... It's going to rock your world."* — [Eric S. Raymond](https://x.com/esrtweet/status/1910809356381413593)
+- *"My life has changed... There's finally an AI coding tool that's good enough to keep up with me... Aider... It's going to rock your world."* — [Eric S. Raymond](https://x.com/esrtweet/status/1910809356381413593)
- *"The best free open source AI coding assistant."* — [IndyDevDan](https://youtu.be/YALpX8oOn78)
- *"The best AI coding assistant so far."* — [Matthew Berman](https://www.youtube.com/watch?v=df8afeb1FY8)
- *"Aider ... has easily quadrupled my coding productivity."* — [SOLAR_FIELDS](https://news.ycombinator.com/item?id=36212100)
@@ -168,7 +168,7 @@ See the [installation instructions](https://aider.chat/docs/install.html) and [u
- *"Aider is also my best friend."* — [jzn21](https://www.reddit.com/r/ChatGPTCoding/comments/1heuvuo/aider_vs_cline_vs_windsurf_vs_cursor/m27dcnb/)
- *"Try Aider, it's worth it."* — [jorgejhms](https://www.reddit.com/r/ChatGPTCoding/comments/1heuvuo/aider_vs_cline_vs_windsurf_vs_cursor/m27cp99/)
- *"I like aider :)"* — [Chenwei Cui](https://x.com/ccui42/status/1904965344999145698)
-- *"Aider is the precision tool of LLM code gen. It is minimal, thoughtful and capable of surgical changes to your codebase all while keeping the developer in control."* — [Reilly Sweetland](https://x.com/rsweetland/status/1904963807237259586)
+- *"Aider is the precision tool of LLM code gen... Minimal, thoughtful and capable of surgical changes to your codebase all while keeping the developer in control."* — [Reilly Sweetland](https://x.com/rsweetland/status/1904963807237259586)
- *"Cannot believe aider vibe coded a 650 LOC feature across service and cli today in 1 shot."* - [autopoietist](https://discord.com/channels/1131200896827654144/1131200896827654149/1355675042259796101)
- *"Oh no the secret is out! Yes, Aider is the best coding tool around. I highly, highly recommend it to anyone."* — [Joshua D Vander Hook](https://x.com/jodavaho/status/1911154899057795218)
- *"thanks to aider, i have started and finished three personal projects within the last two days"* — [joseph stalzyn](https://x.com/anitaheeder/status/1908338609645904160)
diff --git a/aider/website/assets/home.css b/aider/website/assets/home.css
index b46efaa23..9d64fd2e1 100644
--- a/aider/website/assets/home.css
+++ b/aider/website/assets/home.css
@@ -446,7 +446,7 @@ code, pre, .code-block {
}
.testimonial-text::before {
- content: "\201C"; /* Opening fancy quote */
+ content: "\201C\00A0"; /* Opening fancy quote */
color: var(--primary);
margin-right: 4px;
vertical-align: -0.3em;
From 303645cffae597123237967f831e0892e225d784 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Sun, 20 Apr 2025 17:30:06 -0700
Subject: [PATCH 64/66] copy
---
aider/website/assets/sample-analytics.jsonl | 80 ++++++++++-----------
aider/website/docs/config/model-aliases.md | 2 +-
aider/website/docs/faq.md | 6 +-
aider/website/index.html | 4 +-
4 files changed, 46 insertions(+), 46 deletions(-)
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 90d6e65dd..18005a8c6 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,43 +1,3 @@
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "whole", "prompt_tokens": 13359, "completion_tokens": 1287, "total_tokens": 14646, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667925}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667990}
-{"event": "command_architect", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667991}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744667996}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668002}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668016}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 21550, "completion_tokens": 885, "total_tokens": 22435, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668037}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668063}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 28286, "completion_tokens": 231, "total_tokens": 28517, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668076}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668077}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 24153, "completion_tokens": 230, "total_tokens": 24383, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668081}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668082}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 24627, "completion_tokens": 137, "total_tokens": 24764, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668088}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668088}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 25094, "completion_tokens": 201, "total_tokens": 25295, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668096}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668136}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 28588, "completion_tokens": 226, "total_tokens": 28814, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668140}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668140}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 24152, "completion_tokens": 322, "total_tokens": 24474, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668144}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668205}
-{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668206}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668210}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668212}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 10474, "completion_tokens": 570, "total_tokens": 11044, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668262}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668263}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "editor-diff-fenced", "prompt_tokens": 7990, "completion_tokens": 342, "total_tokens": 8332, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668268}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668312}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668319}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668324}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668337}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668337}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668349}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668349}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668352}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668352}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 10679, "completion_tokens": 744, "total_tokens": 11423, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668379}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668395}
-{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668414}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668414}
-{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "ask", "prompt_tokens": 26914, "completion_tokens": 596, "total_tokens": 27510, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668429}
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668482}
{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "architect", "prompt_tokens": 28214, "completion_tokens": 358, "total_tokens": 28572, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668500}
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744668500}
@@ -998,3 +958,43 @@
{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192314}
{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192315}
{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192318}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192612}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192612}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192612}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745192615}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194554}
+{"event": "repo", "properties": {"num_files": 615}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194556}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194556}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194556}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194568}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194656}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple", "prompt_tokens": 17860, "completion_tokens": 168, "total_tokens": 18028, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194665}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194715}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple", "prompt_tokens": 18087, "completion_tokens": 253, "total_tokens": 18340, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194725}
+{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194753}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194758}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194776}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194789}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19552, "completion_tokens": 1375, "total_tokens": 20927, "cost": 0.25052, "total_cost": 0.25052}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194806}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194833}
+{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194837}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194840}
+{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 20025, "completion_tokens": 286, "total_tokens": 20311, "cost": 0.064365, "total_cost": 0.314885}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194850}
+{"event": "command_think-tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194889}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194910}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194912}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194925}
+{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.7-sonnet", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19887, "completion_tokens": 819, "total_tokens": 20706, "cost": 0.071946, "total_cost": 0.38683100000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194945}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194972}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194973}
+{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194975}
+{"event": "command_reasoning-effort", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194980}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194982}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745194985}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19561, "completion_tokens": 3339, "total_tokens": 22900, "cost": 0.32917, "total_cost": 0.7160010000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745195020}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745195108}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 19855, "completion_tokens": 876, "total_tokens": 20731, "cost": 0.23359000000000002, "total_cost": 0.9495910000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745195117}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745195161}
+{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 20114, "completion_tokens": 1504, "total_tokens": 21618, "cost": 0.26130000000000003, "total_cost": 1.2108910000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745195174}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745195213}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745195363}
diff --git a/aider/website/docs/config/model-aliases.md b/aider/website/docs/config/model-aliases.md
index a9b218f47..73eed2937 100644
--- a/aider/website/docs/config/model-aliases.md
+++ b/aider/website/docs/config/model-aliases.md
@@ -79,7 +79,7 @@ for alias, model in sorted(MODEL_ALIASES.items()):
- `4-turbo`: gpt-4-1106-preview
- `4o`: gpt-4o
- `deepseek`: deepseek/deepseek-chat
-- `flash`: gemini/gemini-2.0-flash-exp
+- `flash`: gemini/gemini-2.5-flash-preview-04-17
- `gemini`: gemini/gemini-2.5-pro-preview-03-25
- `gemini-2.5-pro`: gemini/gemini-2.5-pro-exp-03-25
- `gemini-exp`: gemini/gemini-2.5-pro-exp-03-25
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index ba1207ba8..eaaaa4fc2 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -264,9 +264,9 @@ tr:hover { background-color: #f5f5f5; }
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 1,852,969 | 90.0% |
-o3 | 100,777 | 4.9% |
-openrouter/anthropic/claude-3.7-sonnet | 35,268 | 1.7% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,637,700 | 83.1% |
+o3 | 186,953 | 9.5% |
+openrouter/anthropic/claude-3.7-sonnet | 76,285 | 3.9% |
gemini/gemini-2.5-flash-preview-04-17 | 18,645 | 0.9% |
gemini/gemini-2.5-pro-preview-03-25 | 16,524 | 0.8% |
o4-mini | 16,499 | 0.8% |
diff --git a/aider/website/index.html b/aider/website/index.html
index 80611f3a9..50947389d 100644
--- a/aider/website/index.html
+++ b/aider/website/index.html
@@ -269,7 +269,7 @@ cog.out(text)