From c980fd0e775e2d61d4bd88f7cc85f29717b0d1e6 Mon Sep 17 00:00:00 2001
From: Jon Keys
Date: Tue, 25 Feb 2025 18:26:36 -0800
Subject: [PATCH 001/133] use playwright if available when invoking scraper via
cli
---
aider/gui.py | 4 ++--
aider/scrape.py | 14 ++++++++++++--
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/aider/gui.py b/aider/gui.py
index 7fa90bc38..6c5b012dc 100755
--- a/aider/gui.py
+++ b/aider/gui.py
@@ -11,7 +11,7 @@ from aider.coders import Coder
from aider.dump import dump # noqa: F401
from aider.io import InputOutput
from aider.main import main as cli_main
-from aider.scrape import Scraper
+from aider.scrape import Scraper, has_playwright
class CaptureIO(InputOutput):
@@ -484,7 +484,7 @@ class GUI:
url = self.web_content
if not self.state.scraper:
- self.scraper = Scraper(print_error=self.info)
+ self.scraper = Scraper(print_error=self.info, playwright_available=has_playwright())
content = self.scraper.scrape(url) or ""
if content.strip():
diff --git a/aider/scrape.py b/aider/scrape.py
index 7977a8548..04e44bc81 100755
--- a/aider/scrape.py
+++ b/aider/scrape.py
@@ -14,7 +14,7 @@ aider_user_agent = f"Aider/{__version__} +{urls.website}"
# platforms.
-def install_playwright(io):
+def check_env():
try:
from playwright.sync_api import sync_playwright
@@ -29,6 +29,16 @@ def install_playwright(io):
except Exception:
has_chromium = False
+ return has_pip, has_chromium
+
+
+def has_playwright():
+ has_pip, has_chromium = check_env()
+ return has_pip and has_chromium
+
+
+def install_playwright(io):
+ has_pip, has_chromium = check_env()
if has_pip and has_chromium:
return True
@@ -261,7 +271,7 @@ def slimdown_html(soup):
def main(url):
- scraper = Scraper()
+ scraper = Scraper(playwright_available=has_playwright())
content = scraper.scrape(url)
print(content)
From c1b2ff20de98236c3f2bff4af578619eec1003a2 Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:02:19 +0700
Subject: [PATCH 002/133] feat: Add method to fetch model info from openrouter
pages
---
aider/models.py | 45 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 42 insertions(+), 3 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index cc54f03d3..8289a424a 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -211,7 +211,7 @@ class ModelInfoManager:
def get_model_info(self, model):
cached_info = self.get_model_from_cached_json_db(model)
-
+
litellm_info = None
if litellm._lazy_module or not cached_info:
try:
@@ -219,13 +219,52 @@ class ModelInfoManager:
except Exception as ex:
if "model_prices_and_context_window.json" not in str(ex):
print(str(ex))
-
+
if litellm_info:
return litellm_info
-
+
+ if not cached_info and model.startswith("openrouter/"):
+ openrouter_info = self.fetch_openrouter_model_info(model)
+ if openrouter_info:
+ return openrouter_info
+
return cached_info
+ def fetch_openrouter_model_info(self, model):
+ """
+ Fetch model info by scraping the openrouter model page.
+ Expected URL: https://openrouter.ai/
+ Example: openrouter/qwen/qwen-2.5-72b-instruct:free
+ Returns a dict with keys: max_input_tokens, input_cost, output_cost.
+ """
+ url_part = model[len("openrouter/"):]
+ url = "https://openrouter.ai/" + url_part
+ import requests
+ try:
+ response = requests.get(url, timeout=5)
+ if response.status_code != 200:
+ return {}
+ html = response.text
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html, "html.parser")
+ text = soup.get_text()
+ import re
+ context_match = re.search(r"([\d,]+)\s*context", text)
+ if context_match:
+ context_str = context_match.group(1).replace(",", "")
+ context_size = int(context_str)
+ else:
+ context_size = None
+ input_cost_match = re.search(r"\$\s*0\s*/M input tokens", text, re.IGNORECASE)
+ output_cost_match = re.search(r"\$\s*0\s*/M output tokens", text, re.IGNORECASE)
+ input_cost = 0 if input_cost_match else None
+ output_cost = 0 if output_cost_match else None
+ return {"max_input_tokens": context_size, "input_cost": input_cost, "output_cost": output_cost}
+ except Exception as e:
+ print("Error fetching openrouter info:", str(e))
+ return {}
+
model_info_manager = ModelInfoManager()
From 4600dbcda5c991b9f630cfd571bb8f884c5e41ab Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:05:55 +0700
Subject: [PATCH 003/133] feat: Print parsed model parameters in
fetch_openrouter_model_info() method
---
aider/models.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index 8289a424a..108dd9a97 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -260,7 +260,9 @@ class ModelInfoManager:
output_cost_match = re.search(r"\$\s*0\s*/M output tokens", text, re.IGNORECASE)
input_cost = 0 if input_cost_match else None
output_cost = 0 if output_cost_match else None
- return {"max_input_tokens": context_size, "input_cost": input_cost, "output_cost": output_cost}
+ params = {"max_input_tokens": context_size, "input_cost": input_cost, "output_cost": output_cost}
+ print("Parsed model parameters:", params)
+ return params
except Exception as e:
print("Error fetching openrouter info:", str(e))
return {}
From 08d48f42ad6c826ad108d5d3becef2c602c27fe3 Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:08:57 +0700
Subject: [PATCH 004/133] refactor: Remove BeautifulSoup dependency and use
regex to strip HTML tags
---
aider/models.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index 108dd9a97..28bc05f85 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -246,10 +246,8 @@ class ModelInfoManager:
if response.status_code != 200:
return {}
html = response.text
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(html, "html.parser")
- text = soup.get_text()
import re
+ text = re.sub(r'<[^>]+>', ' ', html)
context_match = re.search(r"([\d,]+)\s*context", text)
if context_match:
context_str = context_match.group(1).replace(",", "")
From 5e48f6898d17163e94a30c15df4507a6c23711cb Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:10:23 +0700
Subject: [PATCH 005/133] fix: Improve print statement to include model name in
parameters output
---
aider/models.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index 28bc05f85..fbe6ed181 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -259,7 +259,7 @@ class ModelInfoManager:
input_cost = 0 if input_cost_match else None
output_cost = 0 if output_cost_match else None
params = {"max_input_tokens": context_size, "input_cost": input_cost, "output_cost": output_cost}
- print("Parsed model parameters:", params)
+ print(f"Model '{model}': Parsed parameters: {params}")
return params
except Exception as e:
print("Error fetching openrouter info:", str(e))
From 44e5525e6f46f04b020b3feea19b63669d214dd7 Mon Sep 17 00:00:00 2001
From: Stefan Hladnik
Date: Tue, 18 Mar 2025 03:17:56 +0700
Subject: [PATCH 006/133] style: Remove unnecessary blank lines in
ModelInfoManager class
---
aider/models.py | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index fbe6ed181..1bf2168b6 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -211,7 +211,7 @@ class ModelInfoManager:
def get_model_info(self, model):
cached_info = self.get_model_from_cached_json_db(model)
-
+
litellm_info = None
if litellm._lazy_module or not cached_info:
try:
@@ -219,15 +219,15 @@ class ModelInfoManager:
except Exception as ex:
if "model_prices_and_context_window.json" not in str(ex):
print(str(ex))
-
+
if litellm_info:
return litellm_info
-
+
if not cached_info and model.startswith("openrouter/"):
openrouter_info = self.fetch_openrouter_model_info(model)
if openrouter_info:
return openrouter_info
-
+
return cached_info
@@ -264,7 +264,7 @@ class ModelInfoManager:
except Exception as e:
print("Error fetching openrouter info:", str(e))
return {}
-
+
model_info_manager = ModelInfoManager()
From 2651d9967681accad317e1b7023a7303e20c1a0a Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:17:57 +0700
Subject: [PATCH 007/133] feat: Update cost extraction to capture non-zero
input/output costs
---
aider/models.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index 1bf2168b6..53b99c772 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -254,10 +254,10 @@ class ModelInfoManager:
context_size = int(context_str)
else:
context_size = None
- input_cost_match = re.search(r"\$\s*0\s*/M input tokens", text, re.IGNORECASE)
- output_cost_match = re.search(r"\$\s*0\s*/M output tokens", text, re.IGNORECASE)
- input_cost = 0 if input_cost_match else None
- output_cost = 0 if output_cost_match else None
+ input_cost_match = re.search(r"\$\s*([\d.]+)\s*/M input tokens", text, re.IGNORECASE)
+ output_cost_match = re.search(r"\$\s*([\d.]+)\s*/M output tokens", text, re.IGNORECASE)
+ input_cost = float(input_cost_match.group(1)) if input_cost_match else None
+ output_cost = float(output_cost_match.group(1)) if output_cost_match else None
params = {"max_input_tokens": context_size, "input_cost": input_cost, "output_cost": output_cost}
print(f"Model '{model}': Parsed parameters: {params}")
return params
From 29587cd07cc824ce2795f9b255540dd4c7f66575 Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:24:04 +0700
Subject: [PATCH 008/133] fix: Update return keys in
fetch_openrouter_model_info() to match JSON metadata
---
aider/models.py | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index 53b99c772..1ca6276fd 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -236,7 +236,7 @@ class ModelInfoManager:
Fetch model info by scraping the openrouter model page.
Expected URL: https://openrouter.ai/
Example: openrouter/qwen/qwen-2.5-72b-instruct:free
- Returns a dict with keys: max_input_tokens, input_cost, output_cost.
+ Returns a dict with keys: max_tokens, max_input_tokens, max_output_tokens, input_cost_per_token, output_cost_per_token.
"""
url_part = model[len("openrouter/"):]
url = "https://openrouter.ai/" + url_part
@@ -258,7 +258,13 @@ class ModelInfoManager:
output_cost_match = re.search(r"\$\s*([\d.]+)\s*/M output tokens", text, re.IGNORECASE)
input_cost = float(input_cost_match.group(1)) if input_cost_match else None
output_cost = float(output_cost_match.group(1)) if output_cost_match else None
- params = {"max_input_tokens": context_size, "input_cost": input_cost, "output_cost": output_cost}
+ params = {
+ "max_input_tokens": context_size,
+ "max_tokens": context_size,
+ "max_output_tokens": context_size,
+ "input_cost_per_token": input_cost,
+ "output_cost_per_token": output_cost,
+ }
print(f"Model '{model}': Parsed parameters: {params}")
return params
except Exception as e:
From 4765a90f97722b124ea9166c7442b4baec6d48ef Mon Sep 17 00:00:00 2001
From: Stefan Hladnik
Date: Tue, 18 Mar 2025 03:38:24 +0700
Subject: [PATCH 009/133] fix: Adjust input and output cost calculations to use
million scale
---
aider/models.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index 1ca6276fd..3499e7820 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -256,8 +256,8 @@ class ModelInfoManager:
context_size = None
input_cost_match = re.search(r"\$\s*([\d.]+)\s*/M input tokens", text, re.IGNORECASE)
output_cost_match = re.search(r"\$\s*([\d.]+)\s*/M output tokens", text, re.IGNORECASE)
- input_cost = float(input_cost_match.group(1)) if input_cost_match else None
- output_cost = float(output_cost_match.group(1)) if output_cost_match else None
+ input_cost = float(input_cost_match.group(1)) / 1000000 if input_cost_match else None
+ output_cost = float(output_cost_match.group(1)) / 1000000 if output_cost_match else None
params = {
"max_input_tokens": context_size,
"max_tokens": context_size,
From b37773c6300428c5d7ac277f927862431601b01b Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:38:25 +0700
Subject: [PATCH 010/133] style: Update import location and add SSL
verification in fetch_openrouter_model_info()
---
aider/models.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index 3499e7820..ed014bb54 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -240,9 +240,9 @@ class ModelInfoManager:
"""
url_part = model[len("openrouter/"):]
url = "https://openrouter.ai/" + url_part
- import requests
try:
- response = requests.get(url, timeout=5)
+ import requests
+ response = requests.get(url, timeout=5, verify=self.verify_ssl)
if response.status_code != 200:
return {}
html = response.text
From 87ccacb99f79aeab6d3747d3b6c05d55377d9e30 Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:46:36 +0700
Subject: [PATCH 011/133] fix: Return empty dict if any required parameters are
missing
---
aider/models.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/aider/models.py b/aider/models.py
index ed014bb54..749b2c79c 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -258,6 +258,8 @@ class ModelInfoManager:
output_cost_match = re.search(r"\$\s*([\d.]+)\s*/M output tokens", text, re.IGNORECASE)
input_cost = float(input_cost_match.group(1)) / 1000000 if input_cost_match else None
output_cost = float(output_cost_match.group(1)) / 1000000 if output_cost_match else None
+ if context_size is None or input_cost is None or output_cost is None:
+ return {}
params = {
"max_input_tokens": context_size,
"max_tokens": context_size,
From d64427d726685f8687bd7400041b16fce2170c95 Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:49:59 +0700
Subject: [PATCH 012/133] feat: Add error handling for unavailable model in
response text
---
aider/models.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/aider/models.py b/aider/models.py
index 749b2c79c..dc55e0a8a 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -246,6 +246,9 @@ class ModelInfoManager:
if response.status_code != 200:
return {}
html = response.text
+ if f'The model "{url_part}" is not available' in html:
+ print(f"Error: Model '{url_part}' is not available")
+ sys.exit(1)
import re
text = re.sub(r'<[^>]+>', ' ', html)
context_match = re.search(r"([\d,]+)\s*context", text)
From 21cca34392a8bac0bb6ffbc1226a8877578944ad Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:53:27 +0700
Subject: [PATCH 013/133] fix: Allow arbitrary characters in model availability
check regex
---
aider/models.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index dc55e0a8a..fe92e8aa5 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -246,10 +246,10 @@ class ModelInfoManager:
if response.status_code != 200:
return {}
html = response.text
- if f'The model "{url_part}" is not available' in html:
+ import re
+ if re.search(rf'The model\s*.*{re.escape(url_part)}.* is not available', html, re.IGNORECASE):
print(f"Error: Model '{url_part}' is not available")
sys.exit(1)
- import re
text = re.sub(r'<[^>]+>', ' ', html)
context_match = re.search(r"([\d,]+)\s*context", text)
if context_match:
From cdd730e627e7e9f2a18d77e72c96b1600706e6eb Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 03:54:27 +0700
Subject: [PATCH 014/133] feat: Print error message in red for unavailable
models
---
aider/models.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index fe92e8aa5..f78376948 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -248,7 +248,7 @@ class ModelInfoManager:
html = response.text
import re
if re.search(rf'The model\s*.*{re.escape(url_part)}.* is not available', html, re.IGNORECASE):
- print(f"Error: Model '{url_part}' is not available")
+ print(f"\033[91mError: Model '{url_part}' is not available\033[0m")
sys.exit(1)
text = re.sub(r'<[^>]+>', ' ', html)
context_match = re.search(r"([\d,]+)\s*context", text)
From 7c3d96d0e7a9360f60e4148c585f6553bb73b2c5 Mon Sep 17 00:00:00 2001
From: Stefan Hladnik
Date: Tue, 18 Mar 2025 04:13:40 +0700
Subject: [PATCH 015/133] fix: Remove debug print statement from
ModelInfoManager class
---
aider/models.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index f78376948..a190f5f97 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -270,7 +270,6 @@ class ModelInfoManager:
"input_cost_per_token": input_cost,
"output_cost_per_token": output_cost,
}
- print(f"Model '{model}': Parsed parameters: {params}")
return params
except Exception as e:
print("Error fetching openrouter info:", str(e))
From b3d9e0d1b058da0f9a560e3a6637b0cd446da7d8 Mon Sep 17 00:00:00 2001
From: "Stefan Hladnik (aider)"
Date: Tue, 18 Mar 2025 12:18:48 +0700
Subject: [PATCH 016/133] fix: Return empty dict instead of exiting on model
availability error
---
aider/models.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index a190f5f97..bc1d54e12 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -249,7 +249,7 @@ class ModelInfoManager:
import re
if re.search(rf'The model\s*.*{re.escape(url_part)}.* is not available', html, re.IGNORECASE):
print(f"\033[91mError: Model '{url_part}' is not available\033[0m")
- sys.exit(1)
+ return {}
text = re.sub(r'<[^>]+>', ' ', html)
context_match = re.search(r"([\d,]+)\s*context", text)
if context_match:
From e980973621da2a20d95b6a477756cb01e3f8cca9 Mon Sep 17 00:00:00 2001
From: Andrey Popp <8mayday@gmail.com>
Date: Sun, 30 Mar 2025 22:09:06 +0400
Subject: [PATCH 017/133] feat: add repomap support for ocaml/ocaml_interface
---
.../tree-sitter-language-pack/ocaml-tags.scm | 115 ++++++++++++++++++
.../ocaml_interface-tags.scm | 98 +++++++++++++++
.../ocaml_interface-tags.scm | 98 +++++++++++++++
tests/basic/test_repomap.py | 9 +-
.../languages/ocaml_interface/test.mli | 14 +++
5 files changed, 332 insertions(+), 2 deletions(-)
create mode 100644 aider/queries/tree-sitter-language-pack/ocaml-tags.scm
create mode 100644 aider/queries/tree-sitter-language-pack/ocaml_interface-tags.scm
create mode 100644 aider/queries/tree-sitter-languages/ocaml_interface-tags.scm
create mode 100644 tests/fixtures/languages/ocaml_interface/test.mli
diff --git a/aider/queries/tree-sitter-language-pack/ocaml-tags.scm b/aider/queries/tree-sitter-language-pack/ocaml-tags.scm
new file mode 100644
index 000000000..52d5a857e
--- /dev/null
+++ b/aider/queries/tree-sitter-language-pack/ocaml-tags.scm
@@ -0,0 +1,115 @@
+; Modules
+;--------
+
+(
+ (comment)? @doc .
+ (module_definition (module_binding (module_name) @name.definition.module) @definition.module)
+ (#strip! @doc "^\\(\\*\\*?\\s*|\\s\\*\\)$")
+)
+
+(module_path (module_name) @name.reference.module) @reference.module
+
+; Module types
+;--------------
+
+(
+ (comment)? @doc .
+ (module_type_definition (module_type_name) @name.definition.interface) @definition.interface
+ (#strip! @doc "^\\(\\*\\*?\\s*|\\s\\*\\)$")
+)
+
+(module_type_path (module_type_name) @name.reference.implementation) @reference.implementation
+
+; Functions
+;----------
+
+(
+ (comment)? @doc .
+ (value_definition
+ [
+ (let_binding
+ pattern: (value_name) @name.definition.function
+ (parameter))
+ (let_binding
+ pattern: (value_name) @name.definition.function
+ body: [(fun_expression) (function_expression)])
+ ] @definition.function
+ )
+ (#strip! @doc "^\\(\\*\\*?\\s*|\\s\\*\\)$")
+)
+
+(
+ (comment)? @doc .
+ (external (value_name) @name.definition.function) @definition.function
+ (#strip! @doc "^\\(\\*\\*?\\s*|\\s\\*\\)$")
+)
+
+(application_expression
+ function: (value_path (value_name) @name.reference.call)) @reference.call
+
+(infix_expression
+ left: (value_path (value_name) @name.reference.call)
+ operator: (concat_operator) @reference.call
+ (#eq? @reference.call "@@"))
+
+(infix_expression
+ operator: (rel_operator) @reference.call
+ right: (value_path (value_name) @name.reference.call)
+ (#eq? @reference.call "|>"))
+
+; Operator
+;---------
+
+(
+ (comment)? @doc .
+ (value_definition
+ (let_binding
+ pattern: (parenthesized_operator (_) @name.definition.function)) @definition.function)
+ (#strip! @doc "^\\(\\*\\*?\\s*|\\s\\*\\)$")
+)
+
+[
+ (prefix_operator)
+ (sign_operator)
+ (pow_operator)
+ (mult_operator)
+ (add_operator)
+ (concat_operator)
+ (rel_operator)
+ (and_operator)
+ (or_operator)
+ (assign_operator)
+ (hash_operator)
+ (indexing_operator)
+ (let_operator)
+ (let_and_operator)
+ (match_operator)
+] @name.reference.call @reference.call
+
+; Classes
+;--------
+
+(
+ (comment)? @doc .
+ [
+ (class_definition (class_binding (class_name) @name.definition.class) @definition.class)
+ (class_type_definition (class_type_binding (class_type_name) @name.definition.class) @definition.class)
+ ]
+ (#strip! @doc "^\\(\\*\\*?\\s*|\\s\\*\\)$")
+)
+
+[
+ (class_path (class_name) @name.reference.class)
+ (class_type_path (class_type_name) @name.reference.class)
+] @reference.class
+
+; Methods
+;--------
+
+(
+ (comment)? @doc .
+ (method_definition (method_name) @name.definition.method) @definition.method
+ (#strip! @doc "^\\(\\*\\*?\\s*|\\s\\*\\)$")
+)
+
+(method_invocation (method_name) @name.reference.call) @reference.call
diff --git a/aider/queries/tree-sitter-language-pack/ocaml_interface-tags.scm b/aider/queries/tree-sitter-language-pack/ocaml_interface-tags.scm
new file mode 100644
index 000000000..d7a8f8b97
--- /dev/null
+++ b/aider/queries/tree-sitter-language-pack/ocaml_interface-tags.scm
@@ -0,0 +1,98 @@
+; Modules
+;--------
+
+(
+ (comment)? @doc .
+ (module_definition
+ (module_binding (module_name) @name) @definition.module
+ )
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(module_path (module_name) @name) @reference.module
+(extended_module_path (module_name) @name) @reference.module
+
+(
+ (comment)? @doc .
+ (module_type_definition (module_type_name) @name) @definition.interface
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(module_type_path (module_type_name) @name) @reference.implementation
+
+
+; Classes
+;--------
+
+(
+ (comment)? @doc .
+ [
+ (class_definition
+ (class_binding (class_name) @name) @definition.class
+ )
+ (class_type_definition
+ (class_type_binding (class_type_name) @name) @definition.class
+ )
+ ]
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+[
+ (class_path (class_name) @name)
+ (class_type_path (class_type_name) @name)
+] @reference.class
+
+(
+ (comment)? @doc .
+ (method_definition (method_name) @name) @definition.method
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(method_invocation (method_name) @name) @reference.call
+
+
+; Types
+;------
+
+(
+ (comment)? @doc .
+ (type_definition
+ (type_binding
+ name: [
+ (type_constructor) @name
+ (type_constructor_path (type_constructor) @name)
+ ]
+ ) @definition.type
+ )
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(type_constructor_path (type_constructor) @name) @reference.type
+
+[
+ (constructor_declaration (constructor_name) @name)
+ (tag_specification (tag) @name)
+] @definition.enum_variant
+
+[
+ (constructor_path (constructor_name) @name)
+ (tag) @name
+] @reference.enum_variant
+
+(field_declaration (field_name) @name) @definition.field
+
+(field_path (field_name) @name) @reference.field
+
+(
+ (comment)? @doc .
+ (external (value_name) @name) @definition.function
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(
+ (comment)? @doc .
+ (value_specification
+ (value_name) @name.definition.function
+ ) @definition.function
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
diff --git a/aider/queries/tree-sitter-languages/ocaml_interface-tags.scm b/aider/queries/tree-sitter-languages/ocaml_interface-tags.scm
new file mode 100644
index 000000000..d7a8f8b97
--- /dev/null
+++ b/aider/queries/tree-sitter-languages/ocaml_interface-tags.scm
@@ -0,0 +1,98 @@
+; Modules
+;--------
+
+(
+ (comment)? @doc .
+ (module_definition
+ (module_binding (module_name) @name) @definition.module
+ )
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(module_path (module_name) @name) @reference.module
+(extended_module_path (module_name) @name) @reference.module
+
+(
+ (comment)? @doc .
+ (module_type_definition (module_type_name) @name) @definition.interface
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(module_type_path (module_type_name) @name) @reference.implementation
+
+
+; Classes
+;--------
+
+(
+ (comment)? @doc .
+ [
+ (class_definition
+ (class_binding (class_name) @name) @definition.class
+ )
+ (class_type_definition
+ (class_type_binding (class_type_name) @name) @definition.class
+ )
+ ]
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+[
+ (class_path (class_name) @name)
+ (class_type_path (class_type_name) @name)
+] @reference.class
+
+(
+ (comment)? @doc .
+ (method_definition (method_name) @name) @definition.method
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(method_invocation (method_name) @name) @reference.call
+
+
+; Types
+;------
+
+(
+ (comment)? @doc .
+ (type_definition
+ (type_binding
+ name: [
+ (type_constructor) @name
+ (type_constructor_path (type_constructor) @name)
+ ]
+ ) @definition.type
+ )
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(type_constructor_path (type_constructor) @name) @reference.type
+
+[
+ (constructor_declaration (constructor_name) @name)
+ (tag_specification (tag) @name)
+] @definition.enum_variant
+
+[
+ (constructor_path (constructor_name) @name)
+ (tag) @name
+] @reference.enum_variant
+
+(field_declaration (field_name) @name) @definition.field
+
+(field_path (field_name) @name) @reference.field
+
+(
+ (comment)? @doc .
+ (external (value_name) @name) @definition.function
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
+
+(
+ (comment)? @doc .
+ (value_specification
+ (value_name) @name.definition.function
+ ) @definition.function
+ (#strip! @doc "^\\(\\*+\\s*|\\s*\\*+\\)$")
+)
diff --git a/tests/basic/test_repomap.py b/tests/basic/test_repomap.py
index 17a5753c3..322bac954 100644
--- a/tests/basic/test_repomap.py
+++ b/tests/basic/test_repomap.py
@@ -314,8 +314,6 @@ class TestRepoMapAllLanguages(unittest.TestCase):
def test_language_lua(self):
self._test_language_repo_map("lua", "lua", "greet")
- # "ocaml": ("ml", "Greeter"), # not supported in tsl-pack (yet?)
-
def test_language_php(self):
self._test_language_repo_map("php", "php", "greet")
@@ -384,6 +382,12 @@ class TestRepoMapAllLanguages(unittest.TestCase):
def test_language_scala(self):
self._test_language_repo_map("scala", "scala", "Greeter")
+ def test_language_ocaml(self):
+ self._test_language_repo_map("ocaml", "ml", "Greeter")
+
+ def test_language_ocaml_interface(self):
+ self._test_language_repo_map("ocaml_interface", "mli", "Greeter")
+
def _test_language_repo_map(self, lang, key, symbol):
"""Helper method to test repo map generation for a specific language."""
# Get the fixture file path and name based on language
@@ -407,6 +411,7 @@ class TestRepoMapAllLanguages(unittest.TestCase):
dump(lang)
dump(result)
+ print(result)
self.assertGreater(len(result.strip().splitlines()), 1)
# Check if the result contains all the expected files and symbols
diff --git a/tests/fixtures/languages/ocaml_interface/test.mli b/tests/fixtures/languages/ocaml_interface/test.mli
new file mode 100644
index 000000000..8289f9fc5
--- /dev/null
+++ b/tests/fixtures/languages/ocaml_interface/test.mli
@@ -0,0 +1,14 @@
+(* Module definition *)
+module Greeter : sig
+ type person = {
+ name: string;
+ age: int
+ }
+
+ val create_person : string -> int -> person
+
+ val greet : person -> unit
+end
+
+(* Outside the module *)
+val main : unit -> unit
From 67bb4f95524d1d4d47cf55f17be2189626784569 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 16:52:45 +0300
Subject: [PATCH 018/133] feat: add co-authored-by commit attribution
---
aider/args.py | 6 +++
aider/coders/base_coder.py | 4 +-
aider/repo.py | 76 +++++++++++++++++++++++++++++++-------
3 files changed, 70 insertions(+), 16 deletions(-)
diff --git a/aider/args.py b/aider/args.py
index 6df19778b..4f91a9cbd 100644
--- a/aider/args.py
+++ b/aider/args.py
@@ -448,6 +448,12 @@ def get_parser(default_config_files, git_root):
default=False,
help="Prefix all commit messages with 'aider: ' (default: False)",
)
+ group.add_argument(
+ "--attribute-co-authored-by",
+ action=argparse.BooleanOptionalAction,
+ default=False,
+ help="Attribute aider edits using the Co-authored-by trailer in the commit message (default: False).",
+ )
group.add_argument(
"--git-commit-verify",
action=argparse.BooleanOptionalAction,
diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py
index 19d375afb..5c64475eb 100755
--- a/aider/coders/base_coder.py
+++ b/aider/coders/base_coder.py
@@ -2248,7 +2248,7 @@ class Coder:
context = self.get_context_from_history(self.cur_messages)
try:
- res = self.repo.commit(fnames=edited, context=context, aider_edits=True)
+ res = self.repo.commit(fnames=edited, context=context, aider_edits=True, coder=self)
if res:
self.show_auto_commit_outcome(res)
commit_hash, commit_message = res
@@ -2284,7 +2284,7 @@ class Coder:
if not self.repo:
return
- self.repo.commit(fnames=self.need_commit_before_edits)
+ self.repo.commit(fnames=self.need_commit_before_edits, coder=self)
# files changed, move cur messages back behind the files messages
# self.move_back_cur_messages(self.gpt_prompts.files_content_local_edits)
diff --git a/aider/repo.py b/aider/repo.py
index 5ece5147c..999a07269 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -111,7 +111,7 @@ class GitRepo:
if aider_ignore_file:
self.aider_ignore_file = Path(aider_ignore_file)
- def commit(self, fnames=None, context=None, message=None, aider_edits=False):
+ def commit(self, fnames=None, context=None, message=None, aider_edits=False, coder=None):
if not fnames and not self.repo.is_dirty():
return
@@ -124,15 +124,52 @@ class GitRepo:
else:
commit_message = self.get_commit_message(diffs, context)
- if aider_edits and self.attribute_commit_message_author:
- commit_message = "aider: " + commit_message
- elif self.attribute_commit_message_committer:
- commit_message = "aider: " + commit_message
+ commit_message_trailer = ""
+ if aider_edits:
+ # Use coder.args if available, otherwise default to config/defaults
+ attribute_author = (
+ coder.args.attribute_author
+ if coder and hasattr(coder, "args")
+ else self.attribute_author
+ )
+ attribute_committer = (
+ coder.args.attribute_committer
+ if coder and hasattr(coder, "args")
+ else self.attribute_committer
+ )
+ attribute_commit_message_author = (
+ coder.args.attribute_commit_message_author
+ if coder and hasattr(coder, "args")
+ else self.attribute_commit_message_author
+ )
+ attribute_commit_message_committer = (
+ coder.args.attribute_commit_message_committer
+ if coder and hasattr(coder, "args")
+ else self.attribute_commit_message_committer
+ )
+ attribute_co_authored_by = (
+ coder.args.attribute_co_authored_by
+ if coder and hasattr(coder, "args")
+ else False # Default to False if not found
+ )
+
+ # Add Co-authored-by trailer if configured
+ if attribute_co_authored_by:
+ model_name = "unknown-model"
+ if coder and hasattr(coder, "main_model") and coder.main_model.name:
+ model_name = coder.main_model.name
+ commit_message_trailer = (
+ f"\n\nCo-authored-by: aider ({model_name}) "
+ )
+
+ # Prefix commit message if configured
+ if attribute_commit_message_author or attribute_commit_message_committer:
+ commit_message = "aider: " + commit_message
if not commit_message:
commit_message = "(no commit message provided)"
- full_commit_message = commit_message
+ full_commit_message = commit_message + commit_message_trailer
# if context:
# full_commit_message += "\n\n# Aider chat conversation:\n\n" + context
@@ -152,13 +189,25 @@ class GitRepo:
original_user_name = self.repo.git.config("--get", "user.name")
original_committer_name_env = os.environ.get("GIT_COMMITTER_NAME")
+ original_author_name_env = os.environ.get("GIT_AUTHOR_NAME")
committer_name = f"{original_user_name} (aider)"
- if self.attribute_committer:
+ # Use coder.args if available, otherwise default to config/defaults
+ use_attribute_committer = (
+ coder.args.attribute_committer
+ if coder and hasattr(coder, "args")
+ else self.attribute_committer
+ )
+ use_attribute_author = (
+ coder.args.attribute_author
+ if coder and hasattr(coder, "args")
+ else self.attribute_author
+ )
+
+ if use_attribute_committer:
os.environ["GIT_COMMITTER_NAME"] = committer_name
- if aider_edits and self.attribute_author:
- original_author_name_env = os.environ.get("GIT_AUTHOR_NAME")
+ if aider_edits and use_attribute_author:
os.environ["GIT_AUTHOR_NAME"] = committer_name
try:
@@ -170,17 +219,16 @@ class GitRepo:
self.io.tool_error(f"Unable to commit: {err}")
finally:
# Restore the env
-
- if self.attribute_committer:
+ if use_attribute_committer:
if original_committer_name_env is not None:
os.environ["GIT_COMMITTER_NAME"] = original_committer_name_env
- else:
+ elif "GIT_COMMITTER_NAME" in os.environ:
del os.environ["GIT_COMMITTER_NAME"]
- if aider_edits and self.attribute_author:
+ if aider_edits and use_attribute_author:
if original_author_name_env is not None:
os.environ["GIT_AUTHOR_NAME"] = original_author_name_env
- else:
+ elif "GIT_AUTHOR_NAME" in os.environ:
del os.environ["GIT_AUTHOR_NAME"]
def get_rel_repo_dir(self):
From b6b8f30378cae0cab844989142eec5efb39f6554 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 16:57:21 +0300
Subject: [PATCH 019/133] test: add tests for co-authored-by commit attribution
---
tests/basic/test_repo.py | 83 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 82 insertions(+), 1 deletion(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index aa863c570..7e288e063 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -4,7 +4,7 @@ import tempfile
import time
import unittest
from pathlib import Path
-from unittest.mock import patch
+from unittest.mock import MagicMock, patch
import git
@@ -211,6 +211,87 @@ class TestRepo(unittest.TestCase):
original_author_name = os.environ.get("GIT_AUTHOR_NAME")
self.assertIsNone(original_author_name)
+ def test_commit_with_co_authored_by(self):
+ # Cleanup of the git temp dir explodes on windows
+ if platform.system() == "Windows":
+ return
+
+ with GitTemporaryDirectory():
+ # new repo
+ raw_repo = git.Repo()
+ raw_repo.config_writer().set_value("user", "name", "Test User").release()
+ raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
+
+ # add a file and commit it
+ fname = Path("file.txt")
+ fname.touch()
+ raw_repo.git.add(str(fname))
+ raw_repo.git.commit("-m", "initial commit")
+
+ # Mock coder args
+ mock_coder = MagicMock()
+ mock_coder.args.attribute_co_authored_by = True
+ mock_coder.args.attribute_author = None # Explicitly None to test override
+ mock_coder.args.attribute_committer = None # Explicitly None to test override
+ mock_coder.args.attribute_commit_message_author = False
+ mock_coder.args.attribute_commit_message_committer = False
+ mock_coder.model.name = "gpt-test"
+
+ io = InputOutput()
+ git_repo = GitRepo(io, None, None)
+
+ # commit a change with aider_edits=True and co-authored-by flag
+ fname.write_text("new content")
+ git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider edit")
+
+ # check the commit message and author/committer
+ commit = raw_repo.head.commit
+ self.assertIn("Co-authored-by: aider (gpt-test) ", commit.message)
+ self.assertEqual(commit.message.splitlines()[0], "Aider edit")
+ self.assertEqual(commit.author.name, "Test User") # Should NOT be modified
+ self.assertEqual(commit.committer.name, "Test User") # Should NOT be modified
+
+ def test_commit_without_co_authored_by(self):
+ # Cleanup of the git temp dir explodes on windows
+ if platform.system() == "Windows":
+ return
+
+ with GitTemporaryDirectory():
+ # new repo
+ raw_repo = git.Repo()
+ raw_repo.config_writer().set_value("user", "name", "Test User").release()
+ raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
+
+ # add a file and commit it
+ fname = Path("file.txt")
+ fname.touch()
+ raw_repo.git.add(str(fname))
+ raw_repo.git.commit("-m", "initial commit")
+
+ # Mock coder args (default behavior)
+ mock_coder = MagicMock()
+ mock_coder.args.attribute_co_authored_by = False
+ mock_coder.args.attribute_author = True
+ mock_coder.args.attribute_committer = True
+ mock_coder.args.attribute_commit_message_author = False
+ mock_coder.args.attribute_commit_message_committer = False
+ mock_coder.model.name = "gpt-test"
+
+ io = InputOutput()
+ git_repo = GitRepo(io, None, None)
+
+ # commit a change with aider_edits=True and default flags
+ fname.write_text("new content")
+ git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider edit")
+
+ # check the commit message and author/committer
+ commit = raw_repo.head.commit
+ self.assertNotIn("Co-authored-by:", commit.message)
+ self.assertEqual(commit.message.splitlines()[0], "Aider edit")
+ self.assertEqual(commit.author.name, "Test User (aider)") # Should be modified
+ self.assertEqual(commit.committer.name, "Test User (aider)") # Should be modified
+
+
def test_get_tracked_files(self):
# Create a temporary directory
tempdir = Path(tempfile.mkdtemp())
From eb28e228913fdc0c90b62168bb4b57475a91e22c Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:07:41 +0300
Subject: [PATCH 020/133] test: fix mock setup for model name in co-authored-by
test
---
tests/basic/test_repo.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 7e288e063..4ff694714 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -235,7 +235,9 @@ class TestRepo(unittest.TestCase):
mock_coder.args.attribute_committer = None # Explicitly None to test override
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
- mock_coder.model.name = "gpt-test"
+ # Set the model name correctly on the nested mock
+ mock_coder.model = MagicMock(name="gpt-test")
+
io = InputOutput()
git_repo = GitRepo(io, None, None)
From 192f8bec26ca0348cf43b1ec7bf00ac7e459f565 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:09:12 +0300
Subject: [PATCH 021/133] test: fix mock model name setup in co-authored-by
test
---
tests/basic/test_repo.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 4ff694714..d0441a4da 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -236,7 +236,8 @@ class TestRepo(unittest.TestCase):
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
# Set the model name correctly on the nested mock
- mock_coder.model = MagicMock(name="gpt-test")
+ mock_coder.model = MagicMock()
+ mock_coder.model.configure_mock(name="gpt-test")
io = InputOutput()
From a5327af5e9ef31b68a4345a6679b66b72a9c09fc Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:12:30 +0300
Subject: [PATCH 022/133] test: fix mock setup for co-authored-by commit test
---
tests/basic/test_repo.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index d0441a4da..631e6f606 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -236,8 +236,9 @@ class TestRepo(unittest.TestCase):
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
# Set the model name correctly on the nested mock
- mock_coder.model = MagicMock()
- mock_coder.model.configure_mock(name="gpt-test")
+ # The code uses coder.main_model.name for the co-authored-by line
+ mock_coder.main_model = MagicMock()
+ mock_coder.main_model.name = "gpt-test"
io = InputOutput()
From b22c9b8542cda2a5e45df0a919039d484378d2b9 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:32:15 +0300
Subject: [PATCH 023/133] feat: implement Co-authored-by attribution option
---
aider/repo.py | 74 ++++++++++++++++++++--------------------
tests/basic/test_repo.py | 55 +++++++++++++++++++++++++++--
2 files changed, 89 insertions(+), 40 deletions(-)
diff --git a/aider/repo.py b/aider/repo.py
index 999a07269..efa0fda8c 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -125,7 +125,41 @@ class GitRepo:
commit_message = self.get_commit_message(diffs, context)
commit_message_trailer = ""
+ attribute_author = self.attribute_author
+ attribute_committer = self.attribute_committer
+ attribute_commit_message_author = self.attribute_commit_message_author
+ attribute_commit_message_committer = self.attribute_commit_message_committer
+ attribute_co_authored_by = False # Default if coder or args not available
+
+ if coder and hasattr(coder, "args"):
+ attribute_author = coder.args.attribute_author
+ attribute_committer = coder.args.attribute_committer
+ attribute_commit_message_author = coder.args.attribute_commit_message_author
+ attribute_commit_message_committer = coder.args.attribute_commit_message_committer
+ attribute_co_authored_by = coder.args.attribute_co_authored_by
+
if aider_edits:
+ # Add Co-authored-by trailer if configured
+ if attribute_co_authored_by:
+ model_name = "unknown-model"
+ if coder and hasattr(coder, "main_model") and coder.main_model.name:
+ model_name = coder.main_model.name
+ commit_message_trailer = (
+ f"\n\nCo-authored-by: aider ({model_name}) "
+ )
+
+ # Prefix commit message if configured
+ if attribute_commit_message_author or attribute_commit_message_committer:
+ commit_message = "aider: " + commit_message
+
+ # Prepare author/committer modification flags (used later)
+ use_attribute_author = attribute_author
+ use_attribute_committer = attribute_committer
+ else:
+ # Don't modify author/committer/message for non-aider edits
+ use_attribute_author = False
+ use_attribute_committer = self.attribute_committer # Keep committer modification for non-aider edits if configured
+
# Use coder.args if available, otherwise default to config/defaults
attribute_author = (
coder.args.attribute_author
@@ -143,29 +177,6 @@ class GitRepo:
else self.attribute_commit_message_author
)
attribute_commit_message_committer = (
- coder.args.attribute_commit_message_committer
- if coder and hasattr(coder, "args")
- else self.attribute_commit_message_committer
- )
- attribute_co_authored_by = (
- coder.args.attribute_co_authored_by
- if coder and hasattr(coder, "args")
- else False # Default to False if not found
- )
-
- # Add Co-authored-by trailer if configured
- if attribute_co_authored_by:
- model_name = "unknown-model"
- if coder and hasattr(coder, "main_model") and coder.main_model.name:
- model_name = coder.main_model.name
- commit_message_trailer = (
- f"\n\nCo-authored-by: aider ({model_name}) "
- )
-
- # Prefix commit message if configured
- if attribute_commit_message_author or attribute_commit_message_committer:
- commit_message = "aider: " + commit_message
-
if not commit_message:
commit_message = "(no commit message provided)"
@@ -192,22 +203,11 @@ class GitRepo:
original_author_name_env = os.environ.get("GIT_AUTHOR_NAME")
committer_name = f"{original_user_name} (aider)"
- # Use coder.args if available, otherwise default to config/defaults
- use_attribute_committer = (
- coder.args.attribute_committer
- if coder and hasattr(coder, "args")
- else self.attribute_committer
- )
- use_attribute_author = (
- coder.args.attribute_author
- if coder and hasattr(coder, "args")
- else self.attribute_author
- )
-
+ # Apply author/committer modifications based on flags determined earlier
if use_attribute_committer:
os.environ["GIT_COMMITTER_NAME"] = committer_name
- if aider_edits and use_attribute_author:
+ if use_attribute_author: # Already checks for aider_edits implicitly
os.environ["GIT_AUTHOR_NAME"] = committer_name
try:
@@ -225,7 +225,7 @@ class GitRepo:
elif "GIT_COMMITTER_NAME" in os.environ:
del os.environ["GIT_COMMITTER_NAME"]
- if aider_edits and use_attribute_author:
+ if use_attribute_author: # Already checks for aider_edits implicitly
if original_author_name_env is not None:
os.environ["GIT_AUTHOR_NAME"] = original_author_name_env
elif "GIT_AUTHOR_NAME" in os.environ:
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 631e6f606..945de84f8 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -229,10 +229,11 @@ class TestRepo(unittest.TestCase):
raw_repo.git.commit("-m", "initial commit")
# Mock coder args
+ # Mock coder args: Co-authored-by enabled, author/committer modification disabled
mock_coder = MagicMock()
mock_coder.args.attribute_co_authored_by = True
- mock_coder.args.attribute_author = None # Explicitly None to test override
- mock_coder.args.attribute_committer = None # Explicitly None to test override
+ mock_coder.args.attribute_author = False # Explicitly disable name modification
+ mock_coder.args.attribute_committer = False # Explicitly disable name modification
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
# Set the model name correctly on the nested mock
@@ -255,6 +256,51 @@ class TestRepo(unittest.TestCase):
self.assertEqual(commit.author.name, "Test User") # Should NOT be modified
self.assertEqual(commit.committer.name, "Test User") # Should NOT be modified
+ def test_commit_with_co_authored_by_and_name_modification(self):
+ # Test scenario where Co-authored-by is true AND author/committer modification is also true (default)
+ # Cleanup of the git temp dir explodes on windows
+ if platform.system() == "Windows":
+ return
+
+ with GitTemporaryDirectory():
+ # new repo
+ raw_repo = git.Repo()
+ raw_repo.config_writer().set_value("user", "name", "Test User").release()
+ raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
+
+ # add a file and commit it
+ fname = Path("file.txt")
+ fname.touch()
+ raw_repo.git.add(str(fname))
+ raw_repo.git.commit("-m", "initial commit")
+
+ # Mock coder args: Co-authored-by enabled, author/committer modification enabled (default)
+ mock_coder = MagicMock()
+ mock_coder.args.attribute_co_authored_by = True
+ mock_coder.args.attribute_author = True # Explicitly enable (or rely on default)
+ mock_coder.args.attribute_committer = True # Explicitly enable (or rely on default)
+ mock_coder.args.attribute_commit_message_author = False
+ mock_coder.args.attribute_commit_message_committer = False
+ # Set the model name correctly on the nested mock
+ mock_coder.main_model = MagicMock()
+ mock_coder.main_model.name = "gpt-test-combo"
+
+
+ io = InputOutput()
+ git_repo = GitRepo(io, None, None)
+
+ # commit a change with aider_edits=True and combo flags
+ fname.write_text("new content combo")
+ git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider combo edit")
+
+ # check the commit message and author/committer
+ commit = raw_repo.head.commit
+ self.assertIn("Co-authored-by: aider (gpt-test-combo) ", commit.message)
+ self.assertEqual(commit.message.splitlines()[0], "Aider combo edit")
+ self.assertEqual(commit.author.name, "Test User (aider)") # Should BE modified
+ self.assertEqual(commit.committer.name, "Test User (aider)") # Should BE modified
+
+
def test_commit_without_co_authored_by(self):
# Cleanup of the git temp dir explodes on windows
if platform.system() == "Windows":
@@ -279,7 +325,10 @@ class TestRepo(unittest.TestCase):
mock_coder.args.attribute_committer = True
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
- mock_coder.model.name = "gpt-test"
+ # Set the model name correctly on the nested mock (though not used in this test assertion)
+ mock_coder.main_model = MagicMock()
+ mock_coder.main_model.name = "gpt-test-no-coauthor"
+
io = InputOutput()
git_repo = GitRepo(io, None, None)
From c73b987cd099cc73e1be17d3084df444b1e70491 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:32:57 +0300
Subject: [PATCH 024/133] fix: fix syntax error in commit logic
---
aider/repo.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/aider/repo.py b/aider/repo.py
index efa0fda8c..5ad84d36d 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -177,6 +177,10 @@ class GitRepo:
else self.attribute_commit_message_author
)
attribute_commit_message_committer = (
+ coder.args.attribute_commit_message_committer
+ if coder and hasattr(coder, "args")
+ else self.attribute_commit_message_committer
+ )
if not commit_message:
commit_message = "(no commit message provided)"
From e9511643998d4868bc261b3ec0479e6a2a362b3a Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:35:45 +0300
Subject: [PATCH 025/133] chore: Add test comment to dump function
---
aider/dump.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/dump.py b/aider/dump.py
index 2c8bf31c2..6098d0b73 100644
--- a/aider/dump.py
+++ b/aider/dump.py
@@ -12,6 +12,7 @@ def cvt(s):
def dump(*vals):
+ # This is a test comment
# http://docs.python.org/library/traceback.html
stack = traceback.extract_stack()
vars = stack[-2][3]
From 482e0c2d0b5cdfe60281f13bab2ead4aa540e9e6 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:37:00 +0300
Subject: [PATCH 026/133] chore: Add test comment
---
aider/prompts.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/prompts.py b/aider/prompts.py
index 84ed75e9b..1dacf10d0 100644
--- a/aider/prompts.py
+++ b/aider/prompts.py
@@ -1,5 +1,6 @@
# flake8: noqa: E501
+# This is a test comment.
# COMMIT
From 4783ad3a73530c174f664505b65fe2e587ef27aa Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:39:49 +0300
Subject: [PATCH 027/133] feat: add attribute-co-authored-by option for commit
attribution
---
aider/args.py | 2 +-
aider/repo.py | 83 +++++++++++++++++++++++----------------------------
2 files changed, 38 insertions(+), 47 deletions(-)
diff --git a/aider/args.py b/aider/args.py
index 4f91a9cbd..3571faa5e 100644
--- a/aider/args.py
+++ b/aider/args.py
@@ -428,7 +428,7 @@ def get_parser(default_config_files, git_root):
"--attribute-author",
action=argparse.BooleanOptionalAction,
default=True,
- help="Attribute aider code changes in the git author name (default: True)",
+ help="Attribute aider code changes in the git author name (default: True, ignored if attribute-co-authored-by is True unless explicitly set)",
)
group.add_argument(
"--attribute-committer",
diff --git a/aider/repo.py b/aider/repo.py
index 5ad84d36d..e0bcef2de 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -69,6 +69,8 @@ class GitRepo:
self.attribute_committer = attribute_committer
self.attribute_commit_message_author = attribute_commit_message_author
self.attribute_commit_message_committer = attribute_commit_message_committer
+ # Ensure attribute_co_authored_by is initialized, default to False if not provided
+ self.attribute_co_authored_by = getattr(self, 'attribute_co_authored_by', False)
self.commit_prompt = commit_prompt
self.subtree_only = subtree_only
self.git_commit_verify = git_commit_verify
@@ -124,66 +126,56 @@ class GitRepo:
else:
commit_message = self.get_commit_message(diffs, context)
- commit_message_trailer = ""
- attribute_author = self.attribute_author
- attribute_committer = self.attribute_committer
- attribute_commit_message_author = self.attribute_commit_message_author
- attribute_commit_message_committer = self.attribute_commit_message_committer
- attribute_co_authored_by = False # Default if coder or args not available
-
+ # Retrieve attribute settings, prioritizing coder.args if available
if coder and hasattr(coder, "args"):
attribute_author = coder.args.attribute_author
attribute_committer = coder.args.attribute_committer
attribute_commit_message_author = coder.args.attribute_commit_message_author
attribute_commit_message_committer = coder.args.attribute_commit_message_committer
attribute_co_authored_by = coder.args.attribute_co_authored_by
+ else:
+ # Fallback to self attributes (initialized from config/defaults)
+ attribute_author = self.attribute_author
+ attribute_committer = self.attribute_committer
+ attribute_commit_message_author = self.attribute_commit_message_author
+ attribute_commit_message_committer = self.attribute_commit_message_committer
+ attribute_co_authored_by = getattr(self, 'attribute_co_authored_by', False)
+
+ commit_message_trailer = ""
+ prefix_commit_message = False
+ use_attribute_author = False
+ use_attribute_committer = False
if aider_edits:
- # Add Co-authored-by trailer if configured
+ # Determine commit message prefixing
+ if attribute_commit_message_author or attribute_commit_message_committer:
+ prefix_commit_message = True
+
+ # Determine author/committer modification and trailer
if attribute_co_authored_by:
model_name = "unknown-model"
if coder and hasattr(coder, "main_model") and coder.main_model.name:
model_name = coder.main_model.name
- commit_message_trailer = (
- f"\n\nCo-authored-by: aider ({model_name}) "
- )
-
- # Prefix commit message if configured
- if attribute_commit_message_author or attribute_commit_message_committer:
- commit_message = "aider: " + commit_message
-
- # Prepare author/committer modification flags (used later)
- use_attribute_author = attribute_author
- use_attribute_committer = attribute_committer
- else:
- # Don't modify author/committer/message for non-aider edits
+ commit_message_trailer = f"\n\nCo-authored-by: aider ({model_name}) "
+ # Only modify author/committer if explicitly requested alongside co-authored-by
+ use_attribute_author = attribute_author
+ use_attribute_committer = attribute_committer
+ else:
+ # Original behavior when co-authored-by is false
+ use_attribute_author = attribute_author
+ use_attribute_committer = attribute_committer
+ else: # not aider_edits
+ # Keep original behavior for non-aider edits
use_attribute_author = False
- use_attribute_committer = self.attribute_committer # Keep committer modification for non-aider edits if configured
+ use_attribute_committer = attribute_committer # Respect config for committer
+ prefix_commit_message = False # Don't prefix non-aider commits
- # Use coder.args if available, otherwise default to config/defaults
- attribute_author = (
- coder.args.attribute_author
- if coder and hasattr(coder, "args")
- else self.attribute_author
- )
- attribute_committer = (
- coder.args.attribute_committer
- if coder and hasattr(coder, "args")
- else self.attribute_committer
- )
- attribute_commit_message_author = (
- coder.args.attribute_commit_message_author
- if coder and hasattr(coder, "args")
- else self.attribute_commit_message_author
- )
- attribute_commit_message_committer = (
- coder.args.attribute_commit_message_committer
- if coder and hasattr(coder, "args")
- else self.attribute_commit_message_committer
- )
if not commit_message:
commit_message = "(no commit message provided)"
+ if prefix_commit_message:
+ commit_message = "aider: " + commit_message
+
full_commit_message = commit_message + commit_message_trailer
# if context:
# full_commit_message += "\n\n# Aider chat conversation:\n\n" + context
@@ -210,8 +202,7 @@ class GitRepo:
# Apply author/committer modifications based on flags determined earlier
if use_attribute_committer:
os.environ["GIT_COMMITTER_NAME"] = committer_name
-
- if use_attribute_author: # Already checks for aider_edits implicitly
+ if use_attribute_author:
os.environ["GIT_AUTHOR_NAME"] = committer_name
try:
@@ -229,7 +220,7 @@ class GitRepo:
elif "GIT_COMMITTER_NAME" in os.environ:
del os.environ["GIT_COMMITTER_NAME"]
- if use_attribute_author: # Already checks for aider_edits implicitly
+ if use_attribute_author:
if original_author_name_env is not None:
os.environ["GIT_AUTHOR_NAME"] = original_author_name_env
elif "GIT_AUTHOR_NAME" in os.environ:
From 43cb4d68f7b6a31beddf130b9b09c5c448221005 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:45:48 +0300
Subject: [PATCH 028/133] test: Temporarily disable co-author attribution to
verify test failure
---
aider/repo.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/repo.py b/aider/repo.py
index e0bcef2de..aa6cffb4f 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -132,7 +132,7 @@ class GitRepo:
attribute_committer = coder.args.attribute_committer
attribute_commit_message_author = coder.args.attribute_commit_message_author
attribute_commit_message_committer = coder.args.attribute_commit_message_committer
- attribute_co_authored_by = coder.args.attribute_co_authored_by
+ # attribute_co_authored_by = coder.args.attribute_co_authored_by # <-- Intentionally commented out for testing
else:
# Fallback to self attributes (initialized from config/defaults)
attribute_author = self.attribute_author
From dede701423342f2dd40d1493c21874e92111a4ba Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:47:20 +0300
Subject: [PATCH 029/133] test: intentionally break co-authored-by logic
---
aider/repo.py | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/aider/repo.py b/aider/repo.py
index aa6cffb4f..4ba96d920 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -132,7 +132,7 @@ class GitRepo:
attribute_committer = coder.args.attribute_committer
attribute_commit_message_author = coder.args.attribute_commit_message_author
attribute_commit_message_committer = coder.args.attribute_commit_message_committer
- # attribute_co_authored_by = coder.args.attribute_co_authored_by # <-- Intentionally commented out for testing
+ attribute_co_authored_by = coder.args.attribute_co_authored_by # <-- Restored
else:
# Fallback to self attributes (initialized from config/defaults)
attribute_author = self.attribute_author
@@ -152,7 +152,13 @@ class GitRepo:
prefix_commit_message = True
# Determine author/committer modification and trailer
- if attribute_co_authored_by:
+
+ # --- Intentionally break the behavior for testing ---
+ original_attribute_co_authored_by = attribute_co_authored_by # Keep original value if needed elsewhere
+ attribute_co_authored_by = False # Force to False to ignore the setting
+ # --- End intentional break ---
+
+ if attribute_co_authored_by: # This condition will now always be false
model_name = "unknown-model"
if coder and hasattr(coder, "main_model") and coder.main_model.name:
model_name = coder.main_model.name
From 80114e7a24faa004d7131f47364a28f8fae8d694 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:48:52 +0300
Subject: [PATCH 030/133] chore: revert intentional break introduced for
testing
---
aider/repo.py | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/aider/repo.py b/aider/repo.py
index 4ba96d920..7e04d89ee 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -153,12 +153,7 @@ class GitRepo:
# Determine author/committer modification and trailer
- # --- Intentionally break the behavior for testing ---
- original_attribute_co_authored_by = attribute_co_authored_by # Keep original value if needed elsewhere
- attribute_co_authored_by = False # Force to False to ignore the setting
- # --- End intentional break ---
-
- if attribute_co_authored_by: # This condition will now always be false
+ if attribute_co_authored_by:
model_name = "unknown-model"
if coder and hasattr(coder, "main_model") and coder.main_model.name:
model_name = coder.main_model.name
From d5671c2879c85f581bd504a962e8b54b6567c776 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:50:16 +0300
Subject: [PATCH 031/133] chore: Add test comment
---
tests/fixtures/sample-code-base/sample.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/fixtures/sample-code-base/sample.js b/tests/fixtures/sample-code-base/sample.js
index f3f2eaf58..a934b428c 100644
--- a/tests/fixtures/sample-code-base/sample.js
+++ b/tests/fixtures/sample-code-base/sample.js
@@ -1,3 +1,4 @@
+// Aider test commit
// Sample JavaScript script with 7 functions
// 1. A simple greeting function
From 48f89f226fac3d407d40574d921bf5df065cda71 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:51:58 +0300
Subject: [PATCH 032/133] fix: prevent name modification when using
co-authored-by
---
aider/repo.py | 10 +++++-----
tests/basic/test_repo.py | 5 +++--
2 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/aider/repo.py b/aider/repo.py
index 7e04d89ee..f0d436526 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -58,6 +58,7 @@ class GitRepo:
commit_prompt=None,
subtree_only=False,
git_commit_verify=True,
+ attribute_co_authored_by=False, # Added parameter
):
self.io = io
self.models = models
@@ -69,8 +70,7 @@ class GitRepo:
self.attribute_committer = attribute_committer
self.attribute_commit_message_author = attribute_commit_message_author
self.attribute_commit_message_committer = attribute_commit_message_committer
- # Ensure attribute_co_authored_by is initialized, default to False if not provided
- self.attribute_co_authored_by = getattr(self, 'attribute_co_authored_by', False)
+ self.attribute_co_authored_by = attribute_co_authored_by # Assign from parameter
self.commit_prompt = commit_prompt
self.subtree_only = subtree_only
self.git_commit_verify = git_commit_verify
@@ -158,9 +158,9 @@ class GitRepo:
if coder and hasattr(coder, "main_model") and coder.main_model.name:
model_name = coder.main_model.name
commit_message_trailer = f"\n\nCo-authored-by: aider ({model_name}) "
- # Only modify author/committer if explicitly requested alongside co-authored-by
- use_attribute_author = attribute_author
- use_attribute_committer = attribute_committer
+ # If co-authored-by is used, disable author/committer name modification
+ use_attribute_author = False
+ use_attribute_committer = False
else:
# Original behavior when co-authored-by is false
use_attribute_author = attribute_author
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 945de84f8..2c68c8f00 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -297,8 +297,9 @@ class TestRepo(unittest.TestCase):
commit = raw_repo.head.commit
self.assertIn("Co-authored-by: aider (gpt-test-combo) ", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider combo edit")
- self.assertEqual(commit.author.name, "Test User (aider)") # Should BE modified
- self.assertEqual(commit.committer.name, "Test User (aider)") # Should BE modified
+ # When co-authored-by is true, name modification should be disabled
+ self.assertEqual(commit.author.name, "Test User") # Should NOT be modified
+ self.assertEqual(commit.committer.name, "Test User") # Should NOT be modified
def test_commit_without_co_authored_by(self):
From 072bd30443ce0b3bb8cb7df2f9550446b4edb240 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:53:11 +0300
Subject: [PATCH 033/133] test: add comment for testing
---
tests/fixtures/sample-code-base/sample.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/fixtures/sample-code-base/sample.js b/tests/fixtures/sample-code-base/sample.js
index a934b428c..31280539f 100644
--- a/tests/fixtures/sample-code-base/sample.js
+++ b/tests/fixtures/sample-code-base/sample.js
@@ -1,4 +1,5 @@
// Aider test commit
+// Another test comment
// Sample JavaScript script with 7 functions
// 1. A simple greeting function
From f648a018a2a738f03576acb4e4998e8b2be17341 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:55:13 +0300
Subject: [PATCH 034/133] fix: Pass attribute_co_authored_by arg to GitRepo
constructor
---
aider/main.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/main.py b/aider/main.py
index 9da90e161..a8535d02c 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -904,6 +904,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
commit_prompt=args.commit_prompt,
subtree_only=args.subtree_only,
git_commit_verify=args.git_commit_verify,
+ attribute_co_authored_by=args.attribute_co_authored_by, # Pass the arg
)
except FileNotFoundError:
pass
From ff8e9850ba2dd61a5ff1cc6f5b2cb30d0469082e Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:55:54 +0300
Subject: [PATCH 035/133] chore: add test comment to dump function
---
aider/dump.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/dump.py b/aider/dump.py
index 6098d0b73..85065a97d 100644
--- a/aider/dump.py
+++ b/aider/dump.py
@@ -13,6 +13,7 @@ def cvt(s):
def dump(*vals):
# This is a test comment
+ # This is another test comment
# http://docs.python.org/library/traceback.html
stack = traceback.extract_stack()
vars = stack[-2][3]
From d1437b76665a4e4f51d6ea21200a0b817e6157c3 Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:57:04 +0300
Subject: [PATCH 036/133] chore: add debug prints for attribute_co_authored_by
---
aider/main.py | 2 ++
aider/repo.py | 8 ++++++++
2 files changed, 10 insertions(+)
diff --git a/aider/main.py b/aider/main.py
index a8535d02c..61100d14a 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -501,6 +501,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
# Parse again to include any arguments that might have been defined in .env
args = parser.parse_args(argv)
+ print(f"DEBUG: After final parse, args.attribute_co_authored_by = {args.attribute_co_authored_by}") # DEBUG
if git is None:
args.git = False
@@ -891,6 +892,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
repo = None
if args.git:
try:
+ print(f"DEBUG: Before GitRepo init, args.attribute_co_authored_by = {args.attribute_co_authored_by}") # DEBUG
repo = GitRepo(
io,
fnames,
diff --git a/aider/repo.py b/aider/repo.py
index f0d436526..5a57ffb46 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -60,6 +60,7 @@ class GitRepo:
git_commit_verify=True,
attribute_co_authored_by=False, # Added parameter
):
+ print(f"DEBUG: GitRepo.__init__ received attribute_co_authored_by = {attribute_co_authored_by}") # DEBUG
self.io = io
self.models = models
@@ -71,6 +72,7 @@ class GitRepo:
self.attribute_commit_message_author = attribute_commit_message_author
self.attribute_commit_message_committer = attribute_commit_message_committer
self.attribute_co_authored_by = attribute_co_authored_by # Assign from parameter
+ print(f"DEBUG: GitRepo.__init__ set self.attribute_co_authored_by = {self.attribute_co_authored_by}") # DEBUG
self.commit_prompt = commit_prompt
self.subtree_only = subtree_only
self.git_commit_verify = git_commit_verify
@@ -117,6 +119,8 @@ class GitRepo:
if not fnames and not self.repo.is_dirty():
return
+ print(f"DEBUG: GitRepo.commit start, self.attribute_co_authored_by = {self.attribute_co_authored_by}") # DEBUG
+
diffs = self.get_diffs(fnames)
if not diffs:
return
@@ -141,6 +145,8 @@ class GitRepo:
attribute_commit_message_committer = self.attribute_commit_message_committer
attribute_co_authored_by = getattr(self, 'attribute_co_authored_by', False)
+ print(f"DEBUG: GitRepo.commit after retrieval, attribute_co_authored_by = {attribute_co_authored_by}") # DEBUG
+
commit_message_trailer = ""
prefix_commit_message = False
use_attribute_author = False
@@ -153,6 +159,7 @@ class GitRepo:
# Determine author/committer modification and trailer
+ print(f"DEBUG: GitRepo.commit before logic check, attribute_co_authored_by = {attribute_co_authored_by}") # DEBUG
if attribute_co_authored_by:
model_name = "unknown-model"
if coder and hasattr(coder, "main_model") and coder.main_model.name:
@@ -201,6 +208,7 @@ class GitRepo:
committer_name = f"{original_user_name} (aider)"
# Apply author/committer modifications based on flags determined earlier
+ print(f"DEBUG: GitRepo.commit before setting env, use_attribute_author={use_attribute_author}, use_attribute_committer={use_attribute_committer}") # DEBUG
if use_attribute_committer:
os.environ["GIT_COMMITTER_NAME"] = committer_name
if use_attribute_author:
From 15d623f2c085478e43ceafda98dffefcc44eec7d Mon Sep 17 00:00:00 2001
From: "Andrew Grigorev (aider)"
Date: Sat, 12 Apr 2025 17:57:44 +0300
Subject: [PATCH 037/133] chore: add another test comment to prompts
---
aider/prompts.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/prompts.py b/aider/prompts.py
index 1dacf10d0..87f14a5ec 100644
--- a/aider/prompts.py
+++ b/aider/prompts.py
@@ -1,6 +1,7 @@
# flake8: noqa: E501
# This is a test comment.
+# This is another test comment.
# COMMIT
From 316d8f8e9bf919fa431cda7250ea33d4f5b230bd Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:06:09 +0300
Subject: [PATCH 038/133] chore: add third test comment
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
aider/prompts.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/prompts.py b/aider/prompts.py
index 87f14a5ec..50830978a 100644
--- a/aider/prompts.py
+++ b/aider/prompts.py
@@ -2,6 +2,7 @@
# This is a test comment.
# This is another test comment.
+# This is a third test comment.
# COMMIT
From 66fdeceb3b39f1ca25ed9cd7cf2a041b9d1e5f66 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:14:06 +0300
Subject: [PATCH 039/133] Revert "chore: add third test comment"
This reverts commit 316d8f8e9bf919fa431cda7250ea33d4f5b230bd.
---
aider/prompts.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/aider/prompts.py b/aider/prompts.py
index 50830978a..87f14a5ec 100644
--- a/aider/prompts.py
+++ b/aider/prompts.py
@@ -2,7 +2,6 @@
# This is a test comment.
# This is another test comment.
-# This is a third test comment.
# COMMIT
From 0a59c38f31ff82137b219013693386efd4a13b96 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:14:07 +0300
Subject: [PATCH 040/133] Revert "chore: add another test comment to prompts"
This reverts commit 15d623f2c085478e43ceafda98dffefcc44eec7d.
---
aider/prompts.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/aider/prompts.py b/aider/prompts.py
index 87f14a5ec..1dacf10d0 100644
--- a/aider/prompts.py
+++ b/aider/prompts.py
@@ -1,7 +1,6 @@
# flake8: noqa: E501
# This is a test comment.
-# This is another test comment.
# COMMIT
From e1820522db7eb006306d6396e09f5f1b94b633f2 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:14:07 +0300
Subject: [PATCH 041/133] Revert "chore: add debug prints for
attribute_co_authored_by"
This reverts commit d1437b76665a4e4f51d6ea21200a0b817e6157c3.
---
aider/main.py | 2 --
aider/repo.py | 8 --------
2 files changed, 10 deletions(-)
diff --git a/aider/main.py b/aider/main.py
index 61100d14a..a8535d02c 100644
--- a/aider/main.py
+++ b/aider/main.py
@@ -501,7 +501,6 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
# Parse again to include any arguments that might have been defined in .env
args = parser.parse_args(argv)
- print(f"DEBUG: After final parse, args.attribute_co_authored_by = {args.attribute_co_authored_by}") # DEBUG
if git is None:
args.git = False
@@ -892,7 +891,6 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
repo = None
if args.git:
try:
- print(f"DEBUG: Before GitRepo init, args.attribute_co_authored_by = {args.attribute_co_authored_by}") # DEBUG
repo = GitRepo(
io,
fnames,
diff --git a/aider/repo.py b/aider/repo.py
index 5a57ffb46..f0d436526 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -60,7 +60,6 @@ class GitRepo:
git_commit_verify=True,
attribute_co_authored_by=False, # Added parameter
):
- print(f"DEBUG: GitRepo.__init__ received attribute_co_authored_by = {attribute_co_authored_by}") # DEBUG
self.io = io
self.models = models
@@ -72,7 +71,6 @@ class GitRepo:
self.attribute_commit_message_author = attribute_commit_message_author
self.attribute_commit_message_committer = attribute_commit_message_committer
self.attribute_co_authored_by = attribute_co_authored_by # Assign from parameter
- print(f"DEBUG: GitRepo.__init__ set self.attribute_co_authored_by = {self.attribute_co_authored_by}") # DEBUG
self.commit_prompt = commit_prompt
self.subtree_only = subtree_only
self.git_commit_verify = git_commit_verify
@@ -119,8 +117,6 @@ class GitRepo:
if not fnames and not self.repo.is_dirty():
return
- print(f"DEBUG: GitRepo.commit start, self.attribute_co_authored_by = {self.attribute_co_authored_by}") # DEBUG
-
diffs = self.get_diffs(fnames)
if not diffs:
return
@@ -145,8 +141,6 @@ class GitRepo:
attribute_commit_message_committer = self.attribute_commit_message_committer
attribute_co_authored_by = getattr(self, 'attribute_co_authored_by', False)
- print(f"DEBUG: GitRepo.commit after retrieval, attribute_co_authored_by = {attribute_co_authored_by}") # DEBUG
-
commit_message_trailer = ""
prefix_commit_message = False
use_attribute_author = False
@@ -159,7 +153,6 @@ class GitRepo:
# Determine author/committer modification and trailer
- print(f"DEBUG: GitRepo.commit before logic check, attribute_co_authored_by = {attribute_co_authored_by}") # DEBUG
if attribute_co_authored_by:
model_name = "unknown-model"
if coder and hasattr(coder, "main_model") and coder.main_model.name:
@@ -208,7 +201,6 @@ class GitRepo:
committer_name = f"{original_user_name} (aider)"
# Apply author/committer modifications based on flags determined earlier
- print(f"DEBUG: GitRepo.commit before setting env, use_attribute_author={use_attribute_author}, use_attribute_committer={use_attribute_committer}") # DEBUG
if use_attribute_committer:
os.environ["GIT_COMMITTER_NAME"] = committer_name
if use_attribute_author:
From 02bc9a85c026ab4dd8aadea73156247f0d5d3131 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:14:08 +0300
Subject: [PATCH 042/133] Revert "chore: add test comment to dump function"
This reverts commit ff8e9850ba2dd61a5ff1cc6f5b2cb30d0469082e.
---
aider/dump.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/aider/dump.py b/aider/dump.py
index 85065a97d..6098d0b73 100644
--- a/aider/dump.py
+++ b/aider/dump.py
@@ -13,7 +13,6 @@ def cvt(s):
def dump(*vals):
# This is a test comment
- # This is another test comment
# http://docs.python.org/library/traceback.html
stack = traceback.extract_stack()
vars = stack[-2][3]
From cf7b35f90d45766f33327d7dbcd31c5a90c130d1 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:14:08 +0300
Subject: [PATCH 043/133] Revert "test: add comment for testing"
This reverts commit 072bd30443ce0b3bb8cb7df2f9550446b4edb240.
---
tests/fixtures/sample-code-base/sample.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/tests/fixtures/sample-code-base/sample.js b/tests/fixtures/sample-code-base/sample.js
index 31280539f..a934b428c 100644
--- a/tests/fixtures/sample-code-base/sample.js
+++ b/tests/fixtures/sample-code-base/sample.js
@@ -1,5 +1,4 @@
// Aider test commit
-// Another test comment
// Sample JavaScript script with 7 functions
// 1. A simple greeting function
From 7b8c7edfd5a122967ee03eefa0c5077ae1031d90 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:14:08 +0300
Subject: [PATCH 044/133] Revert "chore: Add test comment"
This reverts commit d5671c2879c85f581bd504a962e8b54b6567c776.
---
tests/fixtures/sample-code-base/sample.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/tests/fixtures/sample-code-base/sample.js b/tests/fixtures/sample-code-base/sample.js
index a934b428c..f3f2eaf58 100644
--- a/tests/fixtures/sample-code-base/sample.js
+++ b/tests/fixtures/sample-code-base/sample.js
@@ -1,4 +1,3 @@
-// Aider test commit
// Sample JavaScript script with 7 functions
// 1. A simple greeting function
From aa07e16f1833fb78269286f114e2eb2ccb07b2e9 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:14:09 +0300
Subject: [PATCH 045/133] Revert "chore: Add test comment"
This reverts commit 482e0c2d0b5cdfe60281f13bab2ead4aa540e9e6.
---
aider/prompts.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/aider/prompts.py b/aider/prompts.py
index 1dacf10d0..84ed75e9b 100644
--- a/aider/prompts.py
+++ b/aider/prompts.py
@@ -1,6 +1,5 @@
# flake8: noqa: E501
-# This is a test comment.
# COMMIT
From 427f9c5b00fb3964d71344e86452209df1422616 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:14:09 +0300
Subject: [PATCH 046/133] Revert "chore: Add test comment to dump function"
This reverts commit e9511643998d4868bc261b3ec0479e6a2a362b3a.
---
aider/dump.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/aider/dump.py b/aider/dump.py
index 6098d0b73..2c8bf31c2 100644
--- a/aider/dump.py
+++ b/aider/dump.py
@@ -12,7 +12,6 @@ def cvt(s):
def dump(*vals):
- # This is a test comment
# http://docs.python.org/library/traceback.html
stack = traceback.extract_stack()
vars = stack[-2][3]
From c56e836d22be0139adb3d976ac49ed4db8a45ab8 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:19:55 +0300
Subject: [PATCH 047/133] refactor: simplify commit logic and use context
manager for git env
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
aider/args.py | 5 ++-
aider/repo.py | 105 +++++++++++++++++++++++++-------------------------
2 files changed, 56 insertions(+), 54 deletions(-)
diff --git a/aider/args.py b/aider/args.py
index 3571faa5e..6d62b6dbf 100644
--- a/aider/args.py
+++ b/aider/args.py
@@ -428,7 +428,10 @@ def get_parser(default_config_files, git_root):
"--attribute-author",
action=argparse.BooleanOptionalAction,
default=True,
- help="Attribute aider code changes in the git author name (default: True, ignored if attribute-co-authored-by is True unless explicitly set)",
+ help=(
+ "Attribute aider code changes in the git author name (default: True). This is ignored"
+ " if --attribute-co-authored-by is True."
+ ),
)
group.add_argument(
"--attribute-committer",
diff --git a/aider/repo.py b/aider/repo.py
index f0d436526..f8a5cacfc 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -1,3 +1,4 @@
+import contextlib
import os
import time
from pathlib import Path, PurePosixPath
@@ -34,6 +35,19 @@ ANY_GIT_ERROR += [
ANY_GIT_ERROR = tuple(ANY_GIT_ERROR)
+@contextlib.contextmanager
+def set_git_env(var_name, value, original_value):
+ """Temporarily set a Git environment variable."""
+ os.environ[var_name] = value
+ try:
+ yield
+ finally:
+ if original_value is not None:
+ os.environ[var_name] = original_value
+ elif var_name in os.environ:
+ del os.environ[var_name]
+
+
class GitRepo:
repo = None
aider_ignore_file = None
@@ -139,37 +153,29 @@ class GitRepo:
attribute_committer = self.attribute_committer
attribute_commit_message_author = self.attribute_commit_message_author
attribute_commit_message_committer = self.attribute_commit_message_committer
- attribute_co_authored_by = getattr(self, 'attribute_co_authored_by', False)
+ attribute_co_authored_by = getattr(self, "attribute_co_authored_by", False)
+ # Determine commit message prefixing
+ prefix_commit_message = aider_edits and (
+ attribute_commit_message_author or attribute_commit_message_committer
+ )
+
+ # Determine Co-authored-by trailer
commit_message_trailer = ""
- prefix_commit_message = False
- use_attribute_author = False
- use_attribute_committer = False
+ if aider_edits and attribute_co_authored_by:
+ model_name = "unknown-model"
+ if coder and hasattr(coder, "main_model") and coder.main_model.name:
+ model_name = coder.main_model.name
+ commit_message_trailer = (
+ f"\n\nCo-authored-by: aider ({model_name}) "
+ )
- if aider_edits:
- # Determine commit message prefixing
- if attribute_commit_message_author or attribute_commit_message_committer:
- prefix_commit_message = True
-
- # Determine author/committer modification and trailer
-
- if attribute_co_authored_by:
- model_name = "unknown-model"
- if coder and hasattr(coder, "main_model") and coder.main_model.name:
- model_name = coder.main_model.name
- commit_message_trailer = f"\n\nCo-authored-by: aider ({model_name}) "
- # If co-authored-by is used, disable author/committer name modification
- use_attribute_author = False
- use_attribute_committer = False
- else:
- # Original behavior when co-authored-by is false
- use_attribute_author = attribute_author
- use_attribute_committer = attribute_committer
- else: # not aider_edits
- # Keep original behavior for non-aider edits
- use_attribute_author = False
- use_attribute_committer = attribute_committer # Respect config for committer
- prefix_commit_message = False # Don't prefix non-aider commits
+ # Determine if author/committer names should be modified
+ # If co-authored-by is used for aider edits, it takes precedence over direct name modification.
+ use_attribute_author = attribute_author and aider_edits and not attribute_co_authored_by
+ use_attribute_committer = attribute_committer and not (
+ aider_edits and attribute_co_authored_by
+ )
if not commit_message:
commit_message = "(no commit message provided)"
@@ -178,8 +184,6 @@ class GitRepo:
commit_message = "aider: " + commit_message
full_commit_message = commit_message + commit_message_trailer
- # if context:
- # full_commit_message += "\n\n# Aider chat conversation:\n\n" + context
cmd = ["-m", full_commit_message]
if not self.git_commit_verify:
@@ -200,32 +204,27 @@ class GitRepo:
original_author_name_env = os.environ.get("GIT_AUTHOR_NAME")
committer_name = f"{original_user_name} (aider)"
- # Apply author/committer modifications based on flags determined earlier
- if use_attribute_committer:
- os.environ["GIT_COMMITTER_NAME"] = committer_name
- if use_attribute_author:
- os.environ["GIT_AUTHOR_NAME"] = committer_name
-
try:
- self.repo.git.commit(cmd)
- commit_hash = self.get_head_commit_sha(short=True)
- self.io.tool_output(f"Commit {commit_hash} {commit_message}", bold=True)
- return commit_hash, commit_message
+ # Use context managers to handle environment variables
+ with contextlib.ExitStack() as stack:
+ if use_attribute_committer:
+ stack.enter_context(
+ set_git_env("GIT_COMMITTER_NAME", committer_name, original_committer_name_env)
+ )
+ if use_attribute_author:
+ stack.enter_context(
+ set_git_env("GIT_AUTHOR_NAME", committer_name, original_author_name_env)
+ )
+
+ # Perform the commit
+ self.repo.git.commit(cmd)
+ commit_hash = self.get_head_commit_sha(short=True)
+ self.io.tool_output(f"Commit {commit_hash} {commit_message}", bold=True)
+ return commit_hash, commit_message
+
except ANY_GIT_ERROR as err:
self.io.tool_error(f"Unable to commit: {err}")
- finally:
- # Restore the env
- if use_attribute_committer:
- if original_committer_name_env is not None:
- os.environ["GIT_COMMITTER_NAME"] = original_committer_name_env
- elif "GIT_COMMITTER_NAME" in os.environ:
- del os.environ["GIT_COMMITTER_NAME"]
-
- if use_attribute_author:
- if original_author_name_env is not None:
- os.environ["GIT_AUTHOR_NAME"] = original_author_name_env
- elif "GIT_AUTHOR_NAME" in os.environ:
- del os.environ["GIT_AUTHOR_NAME"]
+ # No return here, implicitly returns None
def get_rel_repo_dir(self):
try:
From dd4b61da207dfe45cca6e9dee16490b048b3ed8e Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 18:26:46 +0300
Subject: [PATCH 048/133] test: add test for co-authored-by precedence over
author/committer
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
tests/basic/test_repo.py | 54 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 2c68c8f00..57bad6625 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -301,6 +301,60 @@ class TestRepo(unittest.TestCase):
self.assertEqual(commit.author.name, "Test User") # Should NOT be modified
self.assertEqual(commit.committer.name, "Test User") # Should NOT be modified
+ def test_commit_co_authored_by_precedence(self):
+ # Test that co-authored-by takes precedence over name modification when both are enabled
+ if platform.system() == "Windows":
+ return
+
+ with GitTemporaryDirectory():
+ # new repo
+ raw_repo = git.Repo()
+ raw_repo.config_writer().set_value("user", "name", "Test User").release()
+ raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
+
+ # add a file and commit it
+ fname = Path("file.txt")
+ fname.touch()
+ raw_repo.git.add(str(fname))
+ raw_repo.git.commit("-m", "initial commit")
+
+ # Mock coder args: All relevant flags enabled
+ mock_coder = MagicMock()
+ mock_coder.args.attribute_co_authored_by = True
+ mock_coder.args.attribute_author = True # Explicitly enable (or rely on default)
+ mock_coder.args.attribute_committer = True # Explicitly enable (or rely on default)
+ mock_coder.args.attribute_commit_message_author = False
+ mock_coder.args.attribute_commit_message_committer = False
+ mock_coder.main_model = MagicMock()
+ mock_coder.main_model.name = "gpt-precedence"
+
+ io = InputOutput()
+ # Initialize GitRepo directly with flags, simulating config/defaults if coder wasn't passed
+ # This ensures the test covers the case where coder might not provide args
+ git_repo = GitRepo(
+ io,
+ None,
+ None,
+ attribute_co_authored_by=True,
+ attribute_author=True,
+ attribute_committer=True,
+ )
+
+
+ # commit a change with aider_edits=True and conflicting flags
+ fname.write_text("new content precedence")
+ # Pass the coder object here to ensure its args are used if available,
+ # but the GitRepo init already set the fallback values.
+ git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider precedence edit")
+
+ # check the commit message and author/committer
+ commit = raw_repo.head.commit
+ self.assertIn("Co-authored-by: aider (gpt-precedence) ", commit.message)
+ self.assertEqual(commit.message.splitlines()[0], "Aider precedence edit")
+ # Co-authored-by should take precedence, names should NOT be modified
+ self.assertEqual(commit.author.name, "Test User")
+ self.assertEqual(commit.committer.name, "Test User")
+
def test_commit_without_co_authored_by(self):
# Cleanup of the git temp dir explodes on windows
From ea74f31b3e98550611e95e7108a9a63c0dd8d5c5 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 19:09:46 +0300
Subject: [PATCH 049/133] feat: Explicit author/committer flags override
co-authored-by
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
aider/args.py | 13 +++---
aider/repo.py | 28 ++++++++++---
tests/basic/test_repo.py | 87 +++++++++++++++++++++-------------------
3 files changed, 77 insertions(+), 51 deletions(-)
diff --git a/aider/args.py b/aider/args.py
index 6d62b6dbf..7aaf10f2a 100644
--- a/aider/args.py
+++ b/aider/args.py
@@ -427,17 +427,20 @@ def get_parser(default_config_files, git_root):
group.add_argument(
"--attribute-author",
action=argparse.BooleanOptionalAction,
- default=True,
+ default=None,
help=(
- "Attribute aider code changes in the git author name (default: True). This is ignored"
- " if --attribute-co-authored-by is True."
+ "Attribute aider code changes in the git author name (default: True). If explicitly set"
+ " to True, overrides --attribute-co-authored-by precedence."
),
)
group.add_argument(
"--attribute-committer",
action=argparse.BooleanOptionalAction,
- default=True,
- help="Attribute aider commits in the git committer name (default: True)",
+ default=None,
+ help=(
+ "Attribute aider commits in the git committer name (default: True). If explicitly set"
+ " to True, overrides --attribute-co-authored-by precedence for aider edits."
+ ),
)
group.add_argument(
"--attribute-commit-message-author",
diff --git a/aider/repo.py b/aider/repo.py
index f8a5cacfc..31bcc7957 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -153,7 +153,16 @@ class GitRepo:
attribute_committer = self.attribute_committer
attribute_commit_message_author = self.attribute_commit_message_author
attribute_commit_message_committer = self.attribute_commit_message_committer
- attribute_co_authored_by = getattr(self, "attribute_co_authored_by", False)
+ attribute_co_authored_by = getattr(self, "attribute_co_authored_by", False) # Should be False if not set
+
+ # Determine explicit settings (None means use default behavior)
+ author_explicit = attribute_author is not None
+ committer_explicit = attribute_committer is not None
+
+ # Determine effective settings (apply default True if not explicit)
+ effective_author = True if attribute_author is None else attribute_author
+ effective_committer = True if attribute_committer is None else attribute_committer
+
# Determine commit message prefixing
prefix_commit_message = aider_edits and (
@@ -171,12 +180,21 @@ class GitRepo:
)
# Determine if author/committer names should be modified
- # If co-authored-by is used for aider edits, it takes precedence over direct name modification.
- use_attribute_author = attribute_author and aider_edits and not attribute_co_authored_by
- use_attribute_committer = attribute_committer and not (
- aider_edits and attribute_co_authored_by
+ # Author modification applies only to aider edits.
+ # It's used if effective_author is True AND (co-authored-by is False OR author was explicitly set).
+ use_attribute_author = (
+ aider_edits
+ and effective_author
+ and (not attribute_co_authored_by or author_explicit)
)
+ # Committer modification applies regardless of aider_edits (based on tests).
+ # It's used if effective_committer is True AND (it's not an aider edit with co-authored-by OR committer was explicitly set).
+ use_attribute_committer = effective_committer and (
+ not (aider_edits and attribute_co_authored_by) or committer_explicit
+ )
+
+
if not commit_message:
commit_message = "(no commit message provided)"
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 57bad6625..e7026a242 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -185,26 +185,35 @@ class TestRepo(unittest.TestCase):
raw_repo.git.commit("-m", "initial commit")
io = InputOutput()
- git_repo = GitRepo(io, None, None)
+ # Initialize GitRepo with default None values for attributes
+ git_repo = GitRepo(io, None, None, attribute_author=None, attribute_committer=None)
- # commit a change
+ # commit a change with aider_edits=True (using default attributes)
fname.write_text("new content")
git_repo.commit(fnames=[str(fname)], aider_edits=True)
- # check the committer name
+ # check the committer name (defaults interpreted as True)
commit = raw_repo.head.commit
self.assertEqual(commit.author.name, "Test User (aider)")
self.assertEqual(commit.committer.name, "Test User (aider)")
- # commit a change without aider_edits
+ # commit a change without aider_edits (using default attributes)
fname.write_text("new content again!")
git_repo.commit(fnames=[str(fname)], aider_edits=False)
- # check the committer name
+ # check the committer name (author not modified, committer still modified by default)
commit = raw_repo.head.commit
self.assertEqual(commit.author.name, "Test User")
self.assertEqual(commit.committer.name, "Test User (aider)")
+ # Now test with explicit False
+ git_repo_explicit_false = GitRepo(io, None, None, attribute_author=False, attribute_committer=False)
+ fname.write_text("explicit false content")
+ git_repo_explicit_false.commit(fnames=[str(fname)], aider_edits=True)
+ commit = raw_repo.head.commit
+ self.assertEqual(commit.author.name, "Test User") # Explicit False
+ self.assertEqual(commit.committer.name, "Test User") # Explicit False
+
# check that the original committer name is restored
original_committer_name = os.environ.get("GIT_COMMITTER_NAME")
self.assertIsNone(original_committer_name)
@@ -228,15 +237,13 @@ class TestRepo(unittest.TestCase):
raw_repo.git.add(str(fname))
raw_repo.git.commit("-m", "initial commit")
- # Mock coder args
- # Mock coder args: Co-authored-by enabled, author/committer modification disabled
+ # Mock coder args: Co-authored-by enabled, author/committer use default (None)
mock_coder = MagicMock()
mock_coder.args.attribute_co_authored_by = True
- mock_coder.args.attribute_author = False # Explicitly disable name modification
- mock_coder.args.attribute_committer = False # Explicitly disable name modification
+ mock_coder.args.attribute_author = None # Default
+ mock_coder.args.attribute_committer = None # Default
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
- # Set the model name correctly on the nested mock
# The code uses coder.main_model.name for the co-authored-by line
mock_coder.main_model = MagicMock()
mock_coder.main_model.name = "gpt-test"
@@ -253,16 +260,17 @@ class TestRepo(unittest.TestCase):
commit = raw_repo.head.commit
self.assertIn("Co-authored-by: aider (gpt-test) ", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider edit")
+ # With default (None), co-authored-by takes precedence
self.assertEqual(commit.author.name, "Test User") # Should NOT be modified
self.assertEqual(commit.committer.name, "Test User") # Should NOT be modified
- def test_commit_with_co_authored_by_and_name_modification(self):
- # Test scenario where Co-authored-by is true AND author/committer modification is also true (default)
- # Cleanup of the git temp dir explodes on windows
+ def test_commit_co_authored_by_with_explicit_name_modification(self):
+ # Test scenario where Co-authored-by is true AND author/committer modification are explicitly True
if platform.system() == "Windows":
return
with GitTemporaryDirectory():
+ # Setup repo...
# new repo
raw_repo = git.Repo()
raw_repo.config_writer().set_value("user", "name", "Test User").release()
@@ -274,14 +282,13 @@ class TestRepo(unittest.TestCase):
raw_repo.git.add(str(fname))
raw_repo.git.commit("-m", "initial commit")
- # Mock coder args: Co-authored-by enabled, author/committer modification enabled (default)
+ # Mock coder args: Co-authored-by enabled, author/committer modification explicitly enabled
mock_coder = MagicMock()
mock_coder.args.attribute_co_authored_by = True
- mock_coder.args.attribute_author = True # Explicitly enable (or rely on default)
- mock_coder.args.attribute_committer = True # Explicitly enable (or rely on default)
+ mock_coder.args.attribute_author = True # Explicitly enable
+ mock_coder.args.attribute_committer = True # Explicitly enable
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
- # Set the model name correctly on the nested mock
mock_coder.main_model = MagicMock()
mock_coder.main_model.name = "gpt-test-combo"
@@ -297,12 +304,12 @@ class TestRepo(unittest.TestCase):
commit = raw_repo.head.commit
self.assertIn("Co-authored-by: aider (gpt-test-combo) ", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider combo edit")
- # When co-authored-by is true, name modification should be disabled
- self.assertEqual(commit.author.name, "Test User") # Should NOT be modified
- self.assertEqual(commit.committer.name, "Test User") # Should NOT be modified
+ # When co-authored-by is true BUT author/committer are explicit True, modification SHOULD happen
+ self.assertEqual(commit.author.name, "Test User (aider)") # Should be modified
+ self.assertEqual(commit.committer.name, "Test User (aider)") # Should be modified
- def test_commit_co_authored_by_precedence(self):
- # Test that co-authored-by takes precedence over name modification when both are enabled
+ def test_commit_co_authored_by_precedence_over_default(self):
+ # Test that co-authored-by takes precedence over default (None) name modification
if platform.system() == "Windows":
return
@@ -318,30 +325,29 @@ class TestRepo(unittest.TestCase):
raw_repo.git.add(str(fname))
raw_repo.git.commit("-m", "initial commit")
- # Mock coder args: All relevant flags enabled
+ # Mock coder args: Co-authored-by enabled, author/committer use default (None)
mock_coder = MagicMock()
mock_coder.args.attribute_co_authored_by = True
- mock_coder.args.attribute_author = True # Explicitly enable (or rely on default)
- mock_coder.args.attribute_committer = True # Explicitly enable (or rely on default)
+ mock_coder.args.attribute_author = None # Default
+ mock_coder.args.attribute_committer = None # Default
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
- mock_coder.main_model = MagicMock()
+ mock_coder.main_model = MagicMock() # Define main_model before accessing name
mock_coder.main_model.name = "gpt-precedence"
io = InputOutput()
- # Initialize GitRepo directly with flags, simulating config/defaults if coder wasn't passed
- # This ensures the test covers the case where coder might not provide args
+ # Initialize GitRepo directly with flags, simulating config/defaults
+ # Use None for author/committer to test default behavior
git_repo = GitRepo(
io,
None,
None,
attribute_co_authored_by=True,
- attribute_author=True,
- attribute_committer=True,
+ attribute_author=None, # Default
+ attribute_committer=None, # Default
)
-
- # commit a change with aider_edits=True and conflicting flags
+ # commit a change with aider_edits=True and default flags
fname.write_text("new content precedence")
# Pass the coder object here to ensure its args are used if available,
# but the GitRepo init already set the fallback values.
@@ -351,13 +357,13 @@ class TestRepo(unittest.TestCase):
commit = raw_repo.head.commit
self.assertIn("Co-authored-by: aider (gpt-precedence) ", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider precedence edit")
- # Co-authored-by should take precedence, names should NOT be modified
+ # Co-authored-by should take precedence over default (None), names should NOT be modified
self.assertEqual(commit.author.name, "Test User")
self.assertEqual(commit.committer.name, "Test User")
def test_commit_without_co_authored_by(self):
- # Cleanup of the git temp dir explodes on windows
+ # Test standard name modification when co-authored-by is False
if platform.system() == "Windows":
return
@@ -373,14 +379,13 @@ class TestRepo(unittest.TestCase):
raw_repo.git.add(str(fname))
raw_repo.git.commit("-m", "initial commit")
- # Mock coder args (default behavior)
+ # Mock coder args (co-authored-by False, author/committer default None)
mock_coder = MagicMock()
mock_coder.args.attribute_co_authored_by = False
- mock_coder.args.attribute_author = True
- mock_coder.args.attribute_committer = True
+ mock_coder.args.attribute_author = None # Default
+ mock_coder.args.attribute_committer = None # Default
mock_coder.args.attribute_commit_message_author = False
mock_coder.args.attribute_commit_message_committer = False
- # Set the model name correctly on the nested mock (though not used in this test assertion)
mock_coder.main_model = MagicMock()
mock_coder.main_model.name = "gpt-test-no-coauthor"
@@ -392,12 +397,12 @@ class TestRepo(unittest.TestCase):
fname.write_text("new content")
git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider edit")
- # check the commit message and author/committer
+ # check the commit message and author/committer (defaults interpreted as True)
commit = raw_repo.head.commit
self.assertNotIn("Co-authored-by:", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider edit")
- self.assertEqual(commit.author.name, "Test User (aider)") # Should be modified
- self.assertEqual(commit.committer.name, "Test User (aider)") # Should be modified
+ self.assertEqual(commit.author.name, "Test User (aider)") # Should be modified (default True)
+ self.assertEqual(commit.committer.name, "Test User (aider)") # Should be modified (default True)
def test_get_tracked_files(self):
From 278a596bfafd8f9e596f64732d83194271bc0e4d Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 19:21:03 +0300
Subject: [PATCH 050/133] docs: clarify commit author/committer/co-authored-by
logic
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
aider/repo.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/aider/repo.py b/aider/repo.py
index 31bcc7957..ad87a379a 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -128,6 +128,70 @@ class GitRepo:
self.aider_ignore_file = Path(aider_ignore_file)
def commit(self, fnames=None, context=None, message=None, aider_edits=False, coder=None):
+ """
+ Commit the specified files or all dirty files if none are specified.
+
+ Args:
+ fnames (list, optional): List of filenames to commit. Defaults to None (commit all
+ dirty files).
+ context (str, optional): Context for generating the commit message. Defaults to None.
+ message (str, optional): Explicit commit message. Defaults to None (generate message).
+ aider_edits (bool, optional): Whether the changes were made by Aider. Defaults to False.
+ This affects attribution logic.
+ coder (Coder, optional): The Coder instance, used to access config and model info.
+ Defaults to None.
+
+ Returns:
+ tuple(str, str) or None: The commit hash and commit message if successful, else None.
+
+ Attribution Logic:
+ ------------------
+ This method handles Git commit attribution based on configuration flags and whether
+ Aider generated the changes (`aider_edits`).
+
+ Key Concepts:
+ - Author: The person who originally wrote the code changes.
+ - Committer: The person who last applied the commit to the repository.
+ - aider_edits=True: Changes were generated by Aider (LLM).
+ - aider_edits=False: Commit is user-driven (e.g., /commit manually staged changes).
+ - Explicit Setting: A flag (--attribute-...) is set to True or False via command line
+ or config file.
+ - Implicit Default: A flag is not explicitly set, defaulting to None in args, which is
+ interpreted as True unless overridden by other logic.
+
+ Flags:
+ - --attribute-author: Modify Author name to "User Name (aider)".
+ - --attribute-committer: Modify Committer name to "User Name (aider)".
+ - --attribute-co-authored-by: Add "Co-authored-by: aider () "
+ trailer to the commit message.
+
+ Behavior Summary:
+
+ 1. When aider_edits = True (AI Changes):
+ - If --attribute-co-authored-by=True:
+ - Co-authored-by trailer IS ADDED.
+ - Author/Committer names are NOT modified by default (co-authored-by takes precedence).
+ - EXCEPTION: If --attribute-author/--attribute-committer is EXPLICITLY True,
+ the respective name IS modified (explicit overrides precedence).
+ - If --attribute-co-authored-by=False:
+ - Co-authored-by trailer is NOT added.
+ - Author/Committer names ARE modified by default (implicit True).
+ - EXCEPTION: If --attribute-author/--attribute-committer is EXPLICITLY False,
+ the respective name is NOT modified.
+
+ 2. When aider_edits = False (User Changes):
+ - --attribute-co-authored-by is IGNORED (trailer never added).
+ - Author name is NEVER modified (--attribute-author ignored).
+ - Committer name IS modified by default (implicit True, as Aider runs `git commit`).
+ - EXCEPTION: If --attribute-committer is EXPLICITLY False, the name is NOT modified.
+
+ Resulting Scenarios:
+ - Standard AI edit (defaults): Co-authored-by=False -> Author=You(aider), Committer=You(aider)
+ - AI edit with Co-authored-by (default): Co-authored-by=True -> Author=You, Committer=You, Trailer added
+ - AI edit with Co-authored-by + Explicit Author: Co-authored-by=True, --attribute-author -> Author=You(aider), Committer=You, Trailer added
+ - User commit (defaults): aider_edits=False -> Author=You, Committer=You(aider)
+ - User commit with explicit no-committer: aider_edits=False, --no-attribute-committer -> Author=You, Committer=You
+ """
if not fnames and not self.repo.is_dirty():
return
From 5664b5b195aa53f507376efc407dc49e204f3a0b Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 19:41:24 +0300
Subject: [PATCH 051/133] test: Assert commit return value in more tests
Co-authored-by: aider (vertex_ai/gemini-2.0-flash-lite-001)
---
tests/basic/test_repo.py | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index e7026a242..287d5ea16 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -190,7 +190,8 @@ class TestRepo(unittest.TestCase):
# commit a change with aider_edits=True (using default attributes)
fname.write_text("new content")
- git_repo.commit(fnames=[str(fname)], aider_edits=True)
+ commit_result = git_repo.commit(fnames=[str(fname)], aider_edits=True)
+ self.assertIsNotNone(commit_result)
# check the committer name (defaults interpreted as True)
commit = raw_repo.head.commit
@@ -199,7 +200,8 @@ class TestRepo(unittest.TestCase):
# commit a change without aider_edits (using default attributes)
fname.write_text("new content again!")
- git_repo.commit(fnames=[str(fname)], aider_edits=False)
+ commit_result = git_repo.commit(fnames=[str(fname)], aider_edits=False)
+ self.assertIsNotNone(commit_result)
# check the committer name (author not modified, committer still modified by default)
commit = raw_repo.head.commit
@@ -209,7 +211,8 @@ class TestRepo(unittest.TestCase):
# Now test with explicit False
git_repo_explicit_false = GitRepo(io, None, None, attribute_author=False, attribute_committer=False)
fname.write_text("explicit false content")
- git_repo_explicit_false.commit(fnames=[str(fname)], aider_edits=True)
+ commit_result = git_repo_explicit_false.commit(fnames=[str(fname)], aider_edits=True)
+ self.assertIsNotNone(commit_result)
commit = raw_repo.head.commit
self.assertEqual(commit.author.name, "Test User") # Explicit False
self.assertEqual(commit.committer.name, "Test User") # Explicit False
@@ -254,7 +257,8 @@ class TestRepo(unittest.TestCase):
# commit a change with aider_edits=True and co-authored-by flag
fname.write_text("new content")
- git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider edit")
+ commit_result = git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider edit")
+ self.assertIsNotNone(commit_result)
# check the commit message and author/committer
commit = raw_repo.head.commit
@@ -298,7 +302,8 @@ class TestRepo(unittest.TestCase):
# commit a change with aider_edits=True and combo flags
fname.write_text("new content combo")
- git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider combo edit")
+ commit_result = git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider combo edit")
+ self.assertIsNotNone(commit_result)
# check the commit message and author/committer
commit = raw_repo.head.commit
@@ -351,7 +356,8 @@ class TestRepo(unittest.TestCase):
fname.write_text("new content precedence")
# Pass the coder object here to ensure its args are used if available,
# but the GitRepo init already set the fallback values.
- git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider precedence edit")
+ commit_result = git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider precedence edit")
+ self.assertIsNotNone(commit_result)
# check the commit message and author/committer
commit = raw_repo.head.commit
@@ -395,7 +401,8 @@ class TestRepo(unittest.TestCase):
# commit a change with aider_edits=True and default flags
fname.write_text("new content")
- git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider edit")
+ commit_result = git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider edit")
+ self.assertIsNotNone(commit_result)
# check the commit message and author/committer (defaults interpreted as True)
commit = raw_repo.head.commit
@@ -598,7 +605,8 @@ class TestRepo(unittest.TestCase):
git_repo = GitRepo(InputOutput(), None, None)
- git_repo.commit(fnames=[str(fname)])
+ commit_result = git_repo.commit(fnames=[str(fname)])
+ self.assertIsNotNone(commit_result)
def test_git_commit_verify(self):
"""Test that git_commit_verify controls whether --no-verify is passed to git commit"""
From 37a252748a68bb26398ea38e92472e94166abbb5 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 19:45:01 +0300
Subject: [PATCH 052/133] test: Fix commit result assertion in test_noop_commit
---
tests/basic/test_repo.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 287d5ea16..88c4b4edf 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -606,7 +606,7 @@ class TestRepo(unittest.TestCase):
git_repo = GitRepo(InputOutput(), None, None)
commit_result = git_repo.commit(fnames=[str(fname)])
- self.assertIsNotNone(commit_result)
+ self.assertIsNone(commit_result)
def test_git_commit_verify(self):
"""Test that git_commit_verify controls whether --no-verify is passed to git commit"""
From d991cb67219e0728679bf5d00773f12619c97279 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 19:54:56 +0300
Subject: [PATCH 053/133] test: cover user commit with no committer attribution
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
tests/basic/test_repo.py | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 88c4b4edf..9633ec208 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -223,6 +223,15 @@ class TestRepo(unittest.TestCase):
original_author_name = os.environ.get("GIT_AUTHOR_NAME")
self.assertIsNone(original_author_name)
+ # Test user commit with explicit no-committer attribution
+ git_repo_user_no_committer = GitRepo(io, None, None, attribute_committer=False)
+ fname.write_text("user no committer content")
+ commit_result = git_repo_user_no_committer.commit(fnames=[str(fname)], aider_edits=False)
+ self.assertIsNotNone(commit_result)
+ commit = raw_repo.head.commit
+ self.assertEqual(commit.author.name, "Test User") # Author never modified for user commits
+ self.assertEqual(commit.committer.name, "Test User") # Explicit False prevents modification
+
def test_commit_with_co_authored_by(self):
# Cleanup of the git temp dir explodes on windows
if platform.system() == "Windows":
From 3e1bc77bf20ceec54699fc1141b6d90aaf1adc1a Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 19:56:18 +0300
Subject: [PATCH 054/133] test: add tests for commit author/committer
attribution logic
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
tests/basic/test_repo.py | 115 +++++++++++++++++++++++++++++++++++++++
1 file changed, 115 insertions(+)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 9633ec208..5d1ff335b 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -420,6 +420,121 @@ class TestRepo(unittest.TestCase):
self.assertEqual(commit.author.name, "Test User (aider)") # Should be modified (default True)
self.assertEqual(commit.committer.name, "Test User (aider)") # Should be modified (default True)
+ def test_commit_ai_edits_no_coauthor_explicit_false(self):
+ # Test AI edits (aider_edits=True) when co-authored-by is False,
+ # but author or committer attribution is explicitly disabled.
+ if platform.system() == "Windows":
+ return
+
+ with GitTemporaryDirectory():
+ # Setup repo
+ raw_repo = git.Repo()
+ raw_repo.config_writer().set_value("user", "name", "Test User").release()
+ raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
+ fname = Path("file.txt")
+ fname.touch()
+ raw_repo.git.add(str(fname))
+ raw_repo.git.commit("-m", "initial commit")
+
+ io = InputOutput()
+
+ # Case 1: attribute_author = False, attribute_committer = None (default True)
+ mock_coder_no_author = MagicMock()
+ mock_coder_no_author.args.attribute_co_authored_by = False
+ mock_coder_no_author.args.attribute_author = False # Explicit False
+ mock_coder_no_author.args.attribute_committer = None # Default True
+ mock_coder_no_author.args.attribute_commit_message_author = False
+ mock_coder_no_author.args.attribute_commit_message_committer = False
+ mock_coder_no_author.main_model = MagicMock()
+ mock_coder_no_author.main_model.name = "gpt-test-no-author"
+
+ git_repo_no_author = GitRepo(io, None, None)
+ fname.write_text("no author content")
+ commit_result = git_repo_no_author.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder_no_author, message="Aider no author")
+ self.assertIsNotNone(commit_result)
+ commit = raw_repo.head.commit
+ self.assertNotIn("Co-authored-by:", commit.message)
+ self.assertEqual(commit.author.name, "Test User") # Explicit False
+ self.assertEqual(commit.committer.name, "Test User (aider)") # Default True
+
+ # Case 2: attribute_author = None (default True), attribute_committer = False
+ mock_coder_no_committer = MagicMock()
+ mock_coder_no_committer.args.attribute_co_authored_by = False
+ mock_coder_no_committer.args.attribute_author = None # Default True
+ mock_coder_no_committer.args.attribute_committer = False # Explicit False
+ mock_coder_no_committer.args.attribute_commit_message_author = False
+ mock_coder_no_committer.args.attribute_commit_message_committer = False
+ mock_coder_no_committer.main_model = MagicMock()
+ mock_coder_no_committer.main_model.name = "gpt-test-no-committer"
+
+ git_repo_no_committer = GitRepo(io, None, None)
+ fname.write_text("no committer content")
+ commit_result = git_repo_no_committer.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder_no_committer, message="Aider no committer")
+ self.assertIsNotNone(commit_result)
+ commit = raw_repo.head.commit
+ self.assertNotIn("Co-authored-by:", commit.message)
+ self.assertEqual(commit.author.name, "Test User (aider)") # Default True
+ self.assertEqual(commit.committer.name, "Test User") # Explicit False
+
+
+ def test_commit_user_edits_ignores_co_author(self):
+ # Test user edits (aider_edits=False) behavior regarding co-author and name attribution.
+ # Co-author should be ignored, Author never modified, Committer follows flag.
+ if platform.system() == "Windows":
+ return
+
+ with GitTemporaryDirectory():
+ # Setup repo
+ raw_repo = git.Repo()
+ raw_repo.config_writer().set_value("user", "name", "Test User").release()
+ raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
+ fname = Path("file.txt")
+ fname.touch()
+ raw_repo.git.add(str(fname))
+ raw_repo.git.commit("-m", "initial commit")
+
+ io = InputOutput()
+
+ # Case 1: co_author=True, committer=None (default True)
+ mock_coder_user_default = MagicMock()
+ mock_coder_user_default.args.attribute_co_authored_by = True # Should be ignored
+ mock_coder_user_default.args.attribute_author = True # Should be ignored
+ mock_coder_user_default.args.attribute_committer = None # Default True
+ mock_coder_user_default.args.attribute_commit_message_author = False
+ mock_coder_user_default.args.attribute_commit_message_committer = False
+ mock_coder_user_default.main_model = MagicMock()
+ mock_coder_user_default.main_model.name = "gpt-user-default"
+
+ git_repo_user_default = GitRepo(io, None, None)
+ fname.write_text("user default content")
+ commit_result = git_repo_user_default.commit(fnames=[str(fname)], aider_edits=False, coder=mock_coder_user_default, message="User default")
+ self.assertIsNotNone(commit_result)
+ commit = raw_repo.head.commit
+ self.assertNotIn("Co-authored-by:", commit.message) # Ignored
+ self.assertEqual(commit.author.name, "Test User") # Never modified
+ self.assertEqual(commit.committer.name, "Test User (aider)") # Default True
+
+ # Case 2: co_author=True, committer=False
+ mock_coder_user_no_committer = MagicMock()
+ mock_coder_user_no_committer.args.attribute_co_authored_by = True # Should be ignored
+ mock_coder_user_no_committer.args.attribute_author = True # Should be ignored
+ mock_coder_user_no_committer.args.attribute_committer = False # Explicit False
+ mock_coder_user_no_committer.args.attribute_commit_message_author = False
+ mock_coder_user_no_committer.args.attribute_commit_message_committer = False
+ mock_coder_user_no_committer.main_model = MagicMock()
+ mock_coder_user_no_committer.main_model.name = "gpt-user-no-committer"
+
+ # Need to init GitRepo with attribute_committer=False for this case
+ git_repo_user_no_committer = GitRepo(io, None, None, attribute_committer=False)
+ fname.write_text("user no committer content")
+ # Pass coder to simulate args being present, though GitRepo init matters more here
+ commit_result = git_repo_user_no_committer.commit(fnames=[str(fname)], aider_edits=False, coder=mock_coder_user_no_committer, message="User no committer")
+ self.assertIsNotNone(commit_result)
+ commit = raw_repo.head.commit
+ self.assertNotIn("Co-authored-by:", commit.message) # Ignored
+ self.assertEqual(commit.author.name, "Test User") # Never modified
+ self.assertEqual(commit.committer.name, "Test User") # Explicit False
+
def test_get_tracked_files(self):
# Create a temporary directory
From 9e91e8f1b2d2a0b13567da85da85fbfe046314bb Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 19:58:06 +0300
Subject: [PATCH 055/133] test: remove redundant commit attribution tests
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
tests/basic/test_repo.py | 104 ---------------------------------------
1 file changed, 104 deletions(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 5d1ff335b..a1224ce02 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -376,50 +376,6 @@ class TestRepo(unittest.TestCase):
self.assertEqual(commit.author.name, "Test User")
self.assertEqual(commit.committer.name, "Test User")
-
- def test_commit_without_co_authored_by(self):
- # Test standard name modification when co-authored-by is False
- if platform.system() == "Windows":
- return
-
- with GitTemporaryDirectory():
- # new repo
- raw_repo = git.Repo()
- raw_repo.config_writer().set_value("user", "name", "Test User").release()
- raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
-
- # add a file and commit it
- fname = Path("file.txt")
- fname.touch()
- raw_repo.git.add(str(fname))
- raw_repo.git.commit("-m", "initial commit")
-
- # Mock coder args (co-authored-by False, author/committer default None)
- mock_coder = MagicMock()
- mock_coder.args.attribute_co_authored_by = False
- mock_coder.args.attribute_author = None # Default
- mock_coder.args.attribute_committer = None # Default
- mock_coder.args.attribute_commit_message_author = False
- mock_coder.args.attribute_commit_message_committer = False
- mock_coder.main_model = MagicMock()
- mock_coder.main_model.name = "gpt-test-no-coauthor"
-
-
- io = InputOutput()
- git_repo = GitRepo(io, None, None)
-
- # commit a change with aider_edits=True and default flags
- fname.write_text("new content")
- commit_result = git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider edit")
- self.assertIsNotNone(commit_result)
-
- # check the commit message and author/committer (defaults interpreted as True)
- commit = raw_repo.head.commit
- self.assertNotIn("Co-authored-by:", commit.message)
- self.assertEqual(commit.message.splitlines()[0], "Aider edit")
- self.assertEqual(commit.author.name, "Test User (aider)") # Should be modified (default True)
- self.assertEqual(commit.committer.name, "Test User (aider)") # Should be modified (default True)
-
def test_commit_ai_edits_no_coauthor_explicit_false(self):
# Test AI edits (aider_edits=True) when co-authored-by is False,
# but author or committer attribution is explicitly disabled.
@@ -476,66 +432,6 @@ class TestRepo(unittest.TestCase):
self.assertEqual(commit.author.name, "Test User (aider)") # Default True
self.assertEqual(commit.committer.name, "Test User") # Explicit False
-
- def test_commit_user_edits_ignores_co_author(self):
- # Test user edits (aider_edits=False) behavior regarding co-author and name attribution.
- # Co-author should be ignored, Author never modified, Committer follows flag.
- if platform.system() == "Windows":
- return
-
- with GitTemporaryDirectory():
- # Setup repo
- raw_repo = git.Repo()
- raw_repo.config_writer().set_value("user", "name", "Test User").release()
- raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
- fname = Path("file.txt")
- fname.touch()
- raw_repo.git.add(str(fname))
- raw_repo.git.commit("-m", "initial commit")
-
- io = InputOutput()
-
- # Case 1: co_author=True, committer=None (default True)
- mock_coder_user_default = MagicMock()
- mock_coder_user_default.args.attribute_co_authored_by = True # Should be ignored
- mock_coder_user_default.args.attribute_author = True # Should be ignored
- mock_coder_user_default.args.attribute_committer = None # Default True
- mock_coder_user_default.args.attribute_commit_message_author = False
- mock_coder_user_default.args.attribute_commit_message_committer = False
- mock_coder_user_default.main_model = MagicMock()
- mock_coder_user_default.main_model.name = "gpt-user-default"
-
- git_repo_user_default = GitRepo(io, None, None)
- fname.write_text("user default content")
- commit_result = git_repo_user_default.commit(fnames=[str(fname)], aider_edits=False, coder=mock_coder_user_default, message="User default")
- self.assertIsNotNone(commit_result)
- commit = raw_repo.head.commit
- self.assertNotIn("Co-authored-by:", commit.message) # Ignored
- self.assertEqual(commit.author.name, "Test User") # Never modified
- self.assertEqual(commit.committer.name, "Test User (aider)") # Default True
-
- # Case 2: co_author=True, committer=False
- mock_coder_user_no_committer = MagicMock()
- mock_coder_user_no_committer.args.attribute_co_authored_by = True # Should be ignored
- mock_coder_user_no_committer.args.attribute_author = True # Should be ignored
- mock_coder_user_no_committer.args.attribute_committer = False # Explicit False
- mock_coder_user_no_committer.args.attribute_commit_message_author = False
- mock_coder_user_no_committer.args.attribute_commit_message_committer = False
- mock_coder_user_no_committer.main_model = MagicMock()
- mock_coder_user_no_committer.main_model.name = "gpt-user-no-committer"
-
- # Need to init GitRepo with attribute_committer=False for this case
- git_repo_user_no_committer = GitRepo(io, None, None, attribute_committer=False)
- fname.write_text("user no committer content")
- # Pass coder to simulate args being present, though GitRepo init matters more here
- commit_result = git_repo_user_no_committer.commit(fnames=[str(fname)], aider_edits=False, coder=mock_coder_user_no_committer, message="User no committer")
- self.assertIsNotNone(commit_result)
- commit = raw_repo.head.commit
- self.assertNotIn("Co-authored-by:", commit.message) # Ignored
- self.assertEqual(commit.author.name, "Test User") # Never modified
- self.assertEqual(commit.committer.name, "Test User") # Explicit False
-
-
def test_get_tracked_files(self):
# Create a temporary directory
tempdir = Path(tempfile.mkdtemp())
From 6a970c35152c350797bf44ee10f69ca23cd61dfa Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 19:58:29 +0300
Subject: [PATCH 056/133] test: remove redundant co-authored-by precedence test
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
tests/basic/test_repo.py | 54 ----------------------------------------
1 file changed, 54 deletions(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index a1224ce02..11523996f 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -322,60 +322,6 @@ class TestRepo(unittest.TestCase):
self.assertEqual(commit.author.name, "Test User (aider)") # Should be modified
self.assertEqual(commit.committer.name, "Test User (aider)") # Should be modified
- def test_commit_co_authored_by_precedence_over_default(self):
- # Test that co-authored-by takes precedence over default (None) name modification
- if platform.system() == "Windows":
- return
-
- with GitTemporaryDirectory():
- # new repo
- raw_repo = git.Repo()
- raw_repo.config_writer().set_value("user", "name", "Test User").release()
- raw_repo.config_writer().set_value("user", "email", "test@example.com").release()
-
- # add a file and commit it
- fname = Path("file.txt")
- fname.touch()
- raw_repo.git.add(str(fname))
- raw_repo.git.commit("-m", "initial commit")
-
- # Mock coder args: Co-authored-by enabled, author/committer use default (None)
- mock_coder = MagicMock()
- mock_coder.args.attribute_co_authored_by = True
- mock_coder.args.attribute_author = None # Default
- mock_coder.args.attribute_committer = None # Default
- mock_coder.args.attribute_commit_message_author = False
- mock_coder.args.attribute_commit_message_committer = False
- mock_coder.main_model = MagicMock() # Define main_model before accessing name
- mock_coder.main_model.name = "gpt-precedence"
-
- io = InputOutput()
- # Initialize GitRepo directly with flags, simulating config/defaults
- # Use None for author/committer to test default behavior
- git_repo = GitRepo(
- io,
- None,
- None,
- attribute_co_authored_by=True,
- attribute_author=None, # Default
- attribute_committer=None, # Default
- )
-
- # commit a change with aider_edits=True and default flags
- fname.write_text("new content precedence")
- # Pass the coder object here to ensure its args are used if available,
- # but the GitRepo init already set the fallback values.
- commit_result = git_repo.commit(fnames=[str(fname)], aider_edits=True, coder=mock_coder, message="Aider precedence edit")
- self.assertIsNotNone(commit_result)
-
- # check the commit message and author/committer
- commit = raw_repo.head.commit
- self.assertIn("Co-authored-by: aider (gpt-precedence) ", commit.message)
- self.assertEqual(commit.message.splitlines()[0], "Aider precedence edit")
- # Co-authored-by should take precedence over default (None), names should NOT be modified
- self.assertEqual(commit.author.name, "Test User")
- self.assertEqual(commit.committer.name, "Test User")
-
def test_commit_ai_edits_no_coauthor_explicit_false(self):
# Test AI edits (aider_edits=True) when co-authored-by is False,
# but author or committer attribution is explicitly disabled.
From 5851d66174af65ffea837c57c22e51893898b229 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 20:00:44 +0300
Subject: [PATCH 057/133] test: improve test clarity with skipIf and assertion
messages
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
tests/basic/test_repo.py | 39 +++++++++++++--------------------------
1 file changed, 13 insertions(+), 26 deletions(-)
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 11523996f..4d5abac86 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -165,14 +165,11 @@ class TestRepo(unittest.TestCase):
args = mock_send.call_args[0] # Get positional args
self.assertEqual(args[0][0]["content"], custom_prompt) # Check first message content
+ @unittest.skipIf(platform.system() == "Windows", "Git env var behavior differs on Windows")
@patch("aider.repo.GitRepo.get_commit_message")
def test_commit_with_custom_committer_name(self, mock_send):
mock_send.return_value = '"a good commit message"'
- # Cleanup of the git temp dir explodes on windows
- if platform.system() == "Windows":
- return
-
with GitTemporaryDirectory():
# new repo
raw_repo = git.Repo()
@@ -229,14 +226,11 @@ class TestRepo(unittest.TestCase):
commit_result = git_repo_user_no_committer.commit(fnames=[str(fname)], aider_edits=False)
self.assertIsNotNone(commit_result)
commit = raw_repo.head.commit
- self.assertEqual(commit.author.name, "Test User") # Author never modified for user commits
- self.assertEqual(commit.committer.name, "Test User") # Explicit False prevents modification
+ self.assertEqual(commit.author.name, "Test User", msg="Author name should not be modified for user commits")
+ self.assertEqual(commit.committer.name, "Test User", msg="Committer name should not be modified when attribute_committer=False")
+ @unittest.skipIf(platform.system() == "Windows", "Git env var behavior differs on Windows")
def test_commit_with_co_authored_by(self):
- # Cleanup of the git temp dir explodes on windows
- if platform.system() == "Windows":
- return
-
with GitTemporaryDirectory():
# new repo
raw_repo = git.Repo()
@@ -274,14 +268,12 @@ class TestRepo(unittest.TestCase):
self.assertIn("Co-authored-by: aider (gpt-test) ", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider edit")
# With default (None), co-authored-by takes precedence
- self.assertEqual(commit.author.name, "Test User") # Should NOT be modified
- self.assertEqual(commit.committer.name, "Test User") # Should NOT be modified
+ self.assertEqual(commit.author.name, "Test User", msg="Author name should not be modified when co-authored-by takes precedence")
+ self.assertEqual(commit.committer.name, "Test User", msg="Committer name should not be modified when co-authored-by takes precedence")
+ @unittest.skipIf(platform.system() == "Windows", "Git env var behavior differs on Windows")
def test_commit_co_authored_by_with_explicit_name_modification(self):
# Test scenario where Co-authored-by is true AND author/committer modification are explicitly True
- if platform.system() == "Windows":
- return
-
with GitTemporaryDirectory():
# Setup repo...
# new repo
@@ -319,15 +311,13 @@ class TestRepo(unittest.TestCase):
self.assertIn("Co-authored-by: aider (gpt-test-combo) ", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider combo edit")
# When co-authored-by is true BUT author/committer are explicit True, modification SHOULD happen
- self.assertEqual(commit.author.name, "Test User (aider)") # Should be modified
- self.assertEqual(commit.committer.name, "Test User (aider)") # Should be modified
+ self.assertEqual(commit.author.name, "Test User (aider)", msg="Author name should be modified when explicitly True, even with co-author")
+ self.assertEqual(commit.committer.name, "Test User (aider)", msg="Committer name should be modified when explicitly True, even with co-author")
+ @unittest.skipIf(platform.system() == "Windows", "Git env var behavior differs on Windows")
def test_commit_ai_edits_no_coauthor_explicit_false(self):
# Test AI edits (aider_edits=True) when co-authored-by is False,
# but author or committer attribution is explicitly disabled.
- if platform.system() == "Windows":
- return
-
with GitTemporaryDirectory():
# Setup repo
raw_repo = git.Repo()
@@ -375,8 +365,8 @@ class TestRepo(unittest.TestCase):
self.assertIsNotNone(commit_result)
commit = raw_repo.head.commit
self.assertNotIn("Co-authored-by:", commit.message)
- self.assertEqual(commit.author.name, "Test User (aider)") # Default True
- self.assertEqual(commit.committer.name, "Test User") # Explicit False
+ self.assertEqual(commit.author.name, "Test User (aider)", msg="Author name should be modified (default True) when co-author=False")
+ self.assertEqual(commit.committer.name, "Test User", msg="Committer name should not be modified (explicit False) when co-author=False")
def test_get_tracked_files(self):
# Create a temporary directory
@@ -574,12 +564,9 @@ class TestRepo(unittest.TestCase):
commit_result = git_repo.commit(fnames=[str(fname)])
self.assertIsNone(commit_result)
+ @unittest.skipIf(platform.system() == "Windows", "Git hook execution differs on Windows")
def test_git_commit_verify(self):
"""Test that git_commit_verify controls whether --no-verify is passed to git commit"""
- # Skip on Windows as hook execution works differently
- if platform.system() == "Windows":
- return
-
with GitTemporaryDirectory():
# Create a new repo
raw_repo = git.Repo()
From 38dfd6f4f96110d0e9bb5fcd9fcea044f744b3c5 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 20:07:33 +0300
Subject: [PATCH 058/133] docs: clarify --attribute-co-authored-by precedence
---
aider/args.py | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/aider/args.py b/aider/args.py
index 7aaf10f2a..dfa84b6c2 100644
--- a/aider/args.py
+++ b/aider/args.py
@@ -458,7 +458,11 @@ def get_parser(default_config_files, git_root):
"--attribute-co-authored-by",
action=argparse.BooleanOptionalAction,
default=False,
- help="Attribute aider edits using the Co-authored-by trailer in the commit message (default: False).",
+ help=(
+ "Attribute aider edits using the Co-authored-by trailer in the commit message"
+ " (default: False). If True, this takes precedence over default --attribute-author and"
+ " --attribute-committer behavior unless they are explicitly set to True."
+ ),
)
group.add_argument(
"--git-commit-verify",
From 165e237be78c36437d1f2b5f0101546a1f4e2026 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 20:25:01 +0300
Subject: [PATCH 059/133] chore: remove unnecessary comment in repo.py
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
aider/repo.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/repo.py b/aider/repo.py
index ad87a379a..85130e105 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -210,7 +210,7 @@ class GitRepo:
attribute_committer = coder.args.attribute_committer
attribute_commit_message_author = coder.args.attribute_commit_message_author
attribute_commit_message_committer = coder.args.attribute_commit_message_committer
- attribute_co_authored_by = coder.args.attribute_co_authored_by # <-- Restored
+ attribute_co_authored_by = coder.args.attribute_co_authored_by
else:
# Fallback to self attributes (initialized from config/defaults)
attribute_author = self.attribute_author
From 3f94fd5e4edd2205a24d5716c4dec3e9075f3b56 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 20:38:25 +0300
Subject: [PATCH 060/133] refactor: Simplify access to attribute_co_authored_by
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
aider/repo.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/repo.py b/aider/repo.py
index 85130e105..0fa58ab7d 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -217,7 +217,7 @@ class GitRepo:
attribute_committer = self.attribute_committer
attribute_commit_message_author = self.attribute_commit_message_author
attribute_commit_message_committer = self.attribute_commit_message_committer
- attribute_co_authored_by = getattr(self, "attribute_co_authored_by", False) # Should be False if not set
+ attribute_co_authored_by = self.attribute_co_authored_by
# Determine explicit settings (None means use default behavior)
author_explicit = attribute_author is not None
From 1d42690824f4208c612210b73b6d002830aa7882 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Sat, 12 Apr 2025 20:50:29 +0300
Subject: [PATCH 061/133] fix: update co-authored-by domain to aider.chat
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25)
---
aider/repo.py | 4 ++--
tests/basic/test_repo.py | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/aider/repo.py b/aider/repo.py
index 0fa58ab7d..aa2d525f7 100644
--- a/aider/repo.py
+++ b/aider/repo.py
@@ -162,7 +162,7 @@ class GitRepo:
Flags:
- --attribute-author: Modify Author name to "User Name (aider)".
- --attribute-committer: Modify Committer name to "User Name (aider)".
- - --attribute-co-authored-by: Add "Co-authored-by: aider () "
+ - --attribute-co-authored-by: Add "Co-authored-by: aider () "
trailer to the commit message.
Behavior Summary:
@@ -240,7 +240,7 @@ class GitRepo:
if coder and hasattr(coder, "main_model") and coder.main_model.name:
model_name = coder.main_model.name
commit_message_trailer = (
- f"\n\nCo-authored-by: aider ({model_name}) "
+ f"\n\nCo-authored-by: aider ({model_name}) "
)
# Determine if author/committer names should be modified
diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py
index 4d5abac86..400c307a8 100644
--- a/tests/basic/test_repo.py
+++ b/tests/basic/test_repo.py
@@ -265,7 +265,7 @@ class TestRepo(unittest.TestCase):
# check the commit message and author/committer
commit = raw_repo.head.commit
- self.assertIn("Co-authored-by: aider (gpt-test) ", commit.message)
+ self.assertIn("Co-authored-by: aider (gpt-test) ", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider edit")
# With default (None), co-authored-by takes precedence
self.assertEqual(commit.author.name, "Test User", msg="Author name should not be modified when co-authored-by takes precedence")
@@ -308,7 +308,7 @@ class TestRepo(unittest.TestCase):
# check the commit message and author/committer
commit = raw_repo.head.commit
- self.assertIn("Co-authored-by: aider (gpt-test-combo) ", commit.message)
+ self.assertIn("Co-authored-by: aider (gpt-test-combo) ", commit.message)
self.assertEqual(commit.message.splitlines()[0], "Aider combo edit")
# When co-authored-by is true BUT author/committer are explicit True, modification SHOULD happen
self.assertEqual(commit.author.name, "Test User (aider)", msg="Author name should be modified when explicitly True, even with co-author")
From f106993cd1704a20e102c3e987031b7becee0a56 Mon Sep 17 00:00:00 2001
From: Andrew Grigorev
Date: Tue, 15 Apr 2025 01:35:00 +0300
Subject: [PATCH 062/133] fix: add --disable-playwright option to suppress
Playwright prompts and usage
Co-authored-by: aider (openai/gpt-4.1)
---
aider/args.py | 6 ++
aider/commands.py | 14 ++-
tests/scrape/test_playwright_disable.py | 120 ++++++++++++++++++++++++
3 files changed, 136 insertions(+), 4 deletions(-)
create mode 100644 tests/scrape/test_playwright_disable.py
diff --git a/aider/args.py b/aider/args.py
index 6df19778b..1bc1aaed2 100644
--- a/aider/args.py
+++ b/aider/args.py
@@ -670,6 +670,12 @@ def get_parser(default_config_files, git_root):
######
group = parser.add_argument_group("Other settings")
+ group.add_argument(
+ "--disable-playwright",
+ action="store_true",
+ help="Never prompt for or attempt to install Playwright for web scraping (default: False).",
+ default=False,
+ )
group.add_argument(
"--file",
action="append",
diff --git a/aider/commands.py b/aider/commands.py
index 81fc80093..29f20a976 100644
--- a/aider/commands.py
+++ b/aider/commands.py
@@ -220,12 +220,18 @@ class Commands:
self.io.tool_output(f"Scraping {url}...")
if not self.scraper:
- res = install_playwright(self.io)
- if not res:
- self.io.tool_warning("Unable to initialize playwright.")
+ disable_playwright = getattr(self.args, "disable_playwright", False)
+ if disable_playwright:
+ res = False
+ else:
+ res = install_playwright(self.io)
+ if not res:
+ self.io.tool_warning("Unable to initialize playwright.")
self.scraper = Scraper(
- print_error=self.io.tool_error, playwright_available=res, verify_ssl=self.verify_ssl
+ print_error=self.io.tool_error,
+ playwright_available=res,
+ verify_ssl=self.verify_ssl,
)
content = self.scraper.scrape(url) or ""
diff --git a/tests/scrape/test_playwright_disable.py b/tests/scrape/test_playwright_disable.py
new file mode 100644
index 000000000..df777752b
--- /dev/null
+++ b/tests/scrape/test_playwright_disable.py
@@ -0,0 +1,120 @@
+import pytest
+from unittest.mock import MagicMock
+
+from aider.scrape import install_playwright, Scraper
+
+class DummyIO:
+ def __init__(self):
+ self.outputs = []
+ self.confirmed = False
+
+ def tool_output(self, msg):
+ self.outputs.append(msg)
+
+ def confirm_ask(self, msg, default="y"):
+ self.outputs.append(f"confirm: {msg}")
+ return self.confirmed
+
+ def tool_error(self, msg):
+ self.outputs.append(f"error: {msg}")
+
+
+def test_scraper_disable_playwright_flag(monkeypatch):
+ io = DummyIO()
+ # Simulate that playwright is not available (disable_playwright just means playwright_available=False)
+ scraper = Scraper(print_error=io.tool_error, playwright_available=False)
+ # Patch scrape_with_httpx to check it is called
+ called = {}
+ def fake_httpx(url):
+ called['called'] = True
+ return "plain text", "text/plain"
+ scraper.scrape_with_httpx = fake_httpx
+ content = scraper.scrape("http://example.com")
+ assert content == "plain text"
+ assert called['called']
+
+def test_scraper_enable_playwright(monkeypatch):
+ io = DummyIO()
+ # Simulate that playwright is available and should be used
+ scraper = Scraper(print_error=io.tool_error, playwright_available=True)
+ # Patch scrape_with_playwright to check it is called
+ called = {}
+ def fake_playwright(url):
+ called['called'] = True
+ return "hi", "text/html"
+ scraper.scrape_with_playwright = fake_playwright
+ content = scraper.scrape("http://example.com")
+ assert content.startswith("hi") or "" in content
+ assert called['called']
+
+def test_commands_web_disable_playwright(monkeypatch):
+ """
+ Test that Commands.cmd_web does not emit a misleading warning when --disable-playwright is set.
+ """
+ from aider.commands import Commands
+
+ # Dummy IO to capture outputs and warnings
+ class DummyIO:
+ def __init__(self):
+ self.outputs = []
+ self.warnings = []
+ self.errors = []
+ def tool_output(self, msg, *a, **k):
+ self.outputs.append(msg)
+ def tool_warning(self, msg, *a, **k):
+ self.warnings.append(msg)
+ def tool_error(self, msg, *a, **k):
+ self.errors.append(msg)
+ def read_text(self, filename, silent=False):
+ return ""
+ def confirm_ask(self, *a, **k):
+ return True
+ def print(self, *a, **k):
+ pass
+
+ # Dummy coder to satisfy Commands
+ class DummyCoder:
+ def __init__(self):
+ self.cur_messages = []
+ self.main_model = type("M", (), {"edit_format": "code", "name": "dummy", "info": {}})
+ def get_rel_fname(self, fname):
+ return fname
+ def get_inchat_relative_files(self):
+ return []
+ def abs_root_path(self, fname):
+ return fname
+ def get_all_abs_files(self):
+ return []
+ def get_announcements(self):
+ return []
+ def format_chat_chunks(self):
+ return type("Chunks", (), {"repo": [], "readonly_files": [], "chat_files": []})()
+ def event(self, *a, **k):
+ pass
+
+ # Patch install_playwright to always return False (simulate not available)
+ monkeypatch.setattr("aider.scrape.install_playwright", lambda io: False)
+
+ # Patch Scraper to always use scrape_with_httpx and never warn
+ class DummyScraper:
+ def __init__(self, **kwargs):
+ self.called = False
+ def scrape(self, url):
+ self.called = True
+ return "dummy content"
+
+ monkeypatch.setattr("aider.commands.Scraper", DummyScraper)
+
+ io = DummyIO()
+ coder = DummyCoder()
+ args = type("Args", (), {"disable_playwright": True})()
+ commands = Commands(io, coder, args=args)
+
+ commands.cmd_web("http://example.com")
+ # Should not emit a warning about playwright
+ assert not io.warnings
+ # Should not contain message "For the best web scraping, install Playwright:"
+ assert all("install Playwright:" not in msg for msg in io.outputs)
+ # Should output scraping and added to chat
+ assert any("Scraping" in msg for msg in io.outputs)
+ assert any("added to chat" in msg for msg in io.outputs)
From 6df2c1595fdbb02f0e99b27cdca07f42ff5f0345 Mon Sep 17 00:00:00 2001
From: Titusz Pan
Date: Wed, 23 Apr 2025 11:20:08 +0200
Subject: [PATCH 063/133] fix: remove branch filter from Windows tests workflow
---
.github/workflows/windows-tests.yml | 2 --
1 file changed, 2 deletions(-)
diff --git a/.github/workflows/windows-tests.yml b/.github/workflows/windows-tests.yml
index 21799563e..78fb1f3b7 100644
--- a/.github/workflows/windows-tests.yml
+++ b/.github/workflows/windows-tests.yml
@@ -8,8 +8,6 @@ on:
- 'HISTORY.md'
- '.github/workflows/*'
- '!.github/workflows/windows-tests.yml'
- branches:
- - main
pull_request:
paths-ignore:
- 'aider/website/**'
From 5251a2452cf9c9c139774d50c6308cf78b8d4ba3 Mon Sep 17 00:00:00 2001
From: Titusz Pan
Date: Wed, 23 Apr 2025 14:18:23 +0200
Subject: [PATCH 064/133] Add test to reproduce linting failure on windows
---
tests/basic/test_linter.py | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/tests/basic/test_linter.py b/tests/basic/test_linter.py
index 9dce56355..ace4a9311 100644
--- a/tests/basic/test_linter.py
+++ b/tests/basic/test_linter.py
@@ -1,3 +1,4 @@
+import os
import unittest
from unittest.mock import MagicMock, patch
@@ -36,6 +37,15 @@ class TestLinter(unittest.TestCase):
result = self.linter.run_cmd("test_cmd", "test_file.py", "code")
self.assertIsNone(result)
+ def test_run_cmd_win(self):
+ if os.name != "nt":
+ self.skipTest("This test only runs on Windows")
+ from pathlib import Path
+ root = Path(__file__).parent.parent.parent.absolute().as_posix()
+ linter = Linter(encoding="utf-8", root=root)
+ result = linter.run_cmd("dir", "tests/basic", "code")
+ self.assertIsNone(result)
+
@patch("subprocess.Popen")
def test_run_cmd_with_errors(self, mock_popen):
mock_process = MagicMock()
From d9aa3cb2d43f38632dd85dd7311616b7e5c0fb02 Mon Sep 17 00:00:00 2001
From: Titusz Pan
Date: Wed, 23 Apr 2025 14:33:01 +0200
Subject: [PATCH 065/133] Replace shlex with cross-platform oslex
---
aider/linter.py | 4 ++--
aider/utils.py | 7 ++-----
requirements.txt | 6 +++++-
requirements/requirements.in | 1 +
tests/basic/test_linter.py | 2 +-
5 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/aider/linter.py b/aider/linter.py
index 920a8b7c6..51ed40b70 100644
--- a/aider/linter.py
+++ b/aider/linter.py
@@ -4,7 +4,7 @@ import subprocess
import sys
import traceback
import warnings
-import shlex
+import oslex
from dataclasses import dataclass
from pathlib import Path
@@ -45,7 +45,7 @@ class Linter:
return fname
def run_cmd(self, cmd, rel_fname, code):
- cmd += " " + shlex.quote(rel_fname)
+ cmd += " " + oslex.quote(rel_fname)
returncode = 0
stdout = ""
diff --git a/aider/utils.py b/aider/utils.py
index c6773f140..8ab8184a3 100644
--- a/aider/utils.py
+++ b/aider/utils.py
@@ -1,7 +1,7 @@
import itertools
import os
import platform
-import shlex
+import oslex
import subprocess
import sys
import tempfile
@@ -384,10 +384,7 @@ def printable_shell_command(cmd_list):
Returns:
str: Shell-escaped command string.
"""
- if platform.system() == "Windows":
- return subprocess.list2cmdline(cmd_list)
- else:
- return shlex.join(cmd_list)
+ return oslex.join(cmd_list)
def main():
diff --git a/requirements.txt b/requirements.txt
index 44dbe2956..62832718b 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -184,6 +184,8 @@ monotonic==1.6
# via
# -c requirements/common-constraints.txt
# posthog
+mslex==1.3.0
+ # via oslex
multidict==6.4.3
# via
# -c requirements/common-constraints.txt
@@ -202,6 +204,8 @@ openai==1.73.0
# via
# -c requirements/common-constraints.txt
# litellm
+oslex==0.1.3
+ # via -r requirements/requirements.in
packaging==24.2
# via
# -c requirements/common-constraints.txt
@@ -423,6 +427,6 @@ zipp==3.21.0
# via
# -c requirements/common-constraints.txt
# importlib-metadata
-
+
tree-sitter==0.23.2; python_version < "3.10"
tree-sitter==0.24.0; python_version >= "3.10"
diff --git a/requirements/requirements.in b/requirements/requirements.in
index 101f16988..5d75f3fa7 100644
--- a/requirements/requirements.in
+++ b/requirements/requirements.in
@@ -28,6 +28,7 @@ watchfiles
socksio
pip
pillow
+oslex
# The proper dependency is networkx[default], but this brings
# in matplotlib and a bunch of other deps
diff --git a/tests/basic/test_linter.py b/tests/basic/test_linter.py
index ace4a9311..60132b565 100644
--- a/tests/basic/test_linter.py
+++ b/tests/basic/test_linter.py
@@ -43,7 +43,7 @@ class TestLinter(unittest.TestCase):
from pathlib import Path
root = Path(__file__).parent.parent.parent.absolute().as_posix()
linter = Linter(encoding="utf-8", root=root)
- result = linter.run_cmd("dir", "tests/basic", "code")
+ result = linter.run_cmd("dir", "tests\\basic", "code")
self.assertIsNone(result)
@patch("subprocess.Popen")
From 8ffe4662571ffdcebd3ac62cab1833e4a3cad888 Mon Sep 17 00:00:00 2001
From: Titusz Pan
Date: Wed, 23 Apr 2025 14:40:43 +0200
Subject: [PATCH 066/133] Replace shlex with cross-platform oslex - fixes
Aider-AI/aider#3746
---
.github/workflows/windows-tests.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.github/workflows/windows-tests.yml b/.github/workflows/windows-tests.yml
index 78fb1f3b7..21799563e 100644
--- a/.github/workflows/windows-tests.yml
+++ b/.github/workflows/windows-tests.yml
@@ -8,6 +8,8 @@ on:
- 'HISTORY.md'
- '.github/workflows/*'
- '!.github/workflows/windows-tests.yml'
+ branches:
+ - main
pull_request:
paths-ignore:
- 'aider/website/**'
From 2229bb9817bb8c63403e9333d1099e5d409913dc Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 07:41:23 -0700
Subject: [PATCH 067/133] copy
---
HISTORY.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/HISTORY.md b/HISTORY.md
index f8160d5f3..1a45b6afa 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -10,7 +10,7 @@
- Fix parsing of diffs for newly created files (`--- /dev/null`).
- Add markdown syntax highlighting support when editing multi-line commit messages via `/commit`, by Kay Gosho.
- Set Gemini 2.5 Pro models to use the `overeager` prompt setting by default.
-- Add common file types (`.svg`, `.pdf`) and IDE directories (`.idea/`, `.vscode/`, etc.) to the default list of ignored files for AI comment scanning (`--watch`).
+- Add common file types (`.svg`, `.pdf`) to the default list of ignored files for AI comment scanning (`--watch`).
- Skip scanning files larger than 1MB for AI comments (`--watch`).
- Aider wrote 67% of the code in this release.
From d294e8cd4924bef37f67d149d407488f86b22906 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 07:41:51 -0700
Subject: [PATCH 068/133] add gemini-2.5-pro-preview-05-06
---
aider/resources/model-metadata.json | 58 ++++++++++++++++++++
aider/website/_data/polyglot_leaderboard.yml | 29 +++++++++-
2 files changed, 86 insertions(+), 1 deletion(-)
diff --git a/aider/resources/model-metadata.json b/aider/resources/model-metadata.json
index 336c6bee8..7423b01a8 100644
--- a/aider/resources/model-metadata.json
+++ b/aider/resources/model-metadata.json
@@ -403,4 +403,62 @@
"supports_audio_output": true,
"supports_tool_choice": true
},
+ "gemini-2.5-pro-preview-05-06": {
+ "max_tokens": 65536,
+ "max_input_tokens": 1048576,
+ "max_output_tokens": 65536,
+ "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_audio_token": 0.00000125,
+ "input_cost_per_token": 0.00000125,
+ "input_cost_per_token_above_200k_tokens": 0.0000025,
+ "output_cost_per_token": 0.00001,
+ "output_cost_per_token_above_200k_tokens": 0.000015,
+ "litellm_provider": "vertex_ai-language-models",
+ "mode": "chat",
+ "supports_reasoning": true,
+ "supports_system_messages": true,
+ "supports_function_calling": true,
+ "supports_vision": true,
+ "supports_response_schema": true,
+ "supports_audio_output": false,
+ "supports_tool_choice": true,
+ "supported_endpoints": ["/v1/chat/completions", "/v1/completions", "/v1/batch"],
+ "supported_modalities": ["text", "image", "audio", "video"],
+ "supported_output_modalities": ["text"],
+ "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview"
+ },
+ "gemini/gemini-2.5-pro-preview-05-06": {
+ "max_tokens": 65536,
+ "max_input_tokens": 1048576,
+ "max_output_tokens": 65536,
+ "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_audio_token": 0.0000007,
+ "input_cost_per_token": 0.00000125,
+ "input_cost_per_token_above_200k_tokens": 0.0000025,
+ "output_cost_per_token": 0.00001,
+ "output_cost_per_token_above_200k_tokens": 0.000015,
+ "litellm_provider": "gemini",
+ "mode": "chat",
+ "rpm": 10000,
+ "tpm": 10000000,
+ "supports_system_messages": true,
+ "supports_function_calling": true,
+ "supports_vision": true,
+ "supports_response_schema": true,
+ "supports_audio_output": false,
+ "supports_tool_choice": true,
+ "supported_modalities": ["text", "image", "audio", "video"],
+ "supported_output_modalities": ["text"],
+ "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-2.5-pro-preview"
+ },
}
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 0af93a8de..e80e66b2d 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1223,4 +1223,31 @@
date: 2025-04-20
versions: 0.82.3.dev
seconds_per_case: 50.1
- total_cost: 1.8451
\ No newline at end of file
+ total_cost: 1.8451
+
+- dirname: 2025-05-06-21-34-36--gemini0506-diff-fenced
+ test_cases: 225
+ model: gemini/gemini-2.5-pro-preview-05-06
+ edit_format: diff-fenced
+ commit_hash: 8159cbf-dirty
+ pass_rate_1: 37.8
+ pass_rate_2: 75.6
+ pass_num_1: 85
+ pass_num_2: 170
+ percent_cases_well_formed: 95.1
+ error_outputs: 11
+ num_malformed_responses: 11
+ num_with_malformed_responses: 11
+ user_asks: 139
+ lazy_comments: 0
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 0
+ test_timeouts: 5
+ total_tests: 225
+ command: aider --model gemini/gemini-2.5-pro-preview-05-06
+ date: 2025-05-06
+ versions: 0.82.4.dev
+ seconds_per_case: 158.8
+ total_cost: 41.1744
+
From edbfec0ce4e1fe86735c915cb425b0d8636edc32 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 07:42:25 -0700
Subject: [PATCH 069/133] copy
---
HISTORY.md | 2 +-
aider/website/HISTORY.md | 4 +-
aider/website/assets/sample-analytics.jsonl | 310 ++++++++++----------
aider/website/docs/faq.md | 13 +-
aider/website/docs/llms/other.md | 1 +
aider/website/index.html | 2 +-
6 files changed, 166 insertions(+), 166 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index 1a45b6afa..92530ea68 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,6 +1,6 @@
# Release history
-### main branch
+### Aider v0.82.3
- Add support for `gemini-2.5-flash-preview-04-17` models.
- Improved robustness of edit block parsing when filenames start with backticks or fences.
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index b177cb8da..82a2527a1 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -24,7 +24,7 @@ cog.out(text)
]]]-->
-### main branch
+### Aider v0.82.3
- Add support for `gemini-2.5-flash-preview-04-17` models.
- Improved robustness of edit block parsing when filenames start with backticks or fences.
@@ -34,7 +34,7 @@ cog.out(text)
- Fix parsing of diffs for newly created files (`--- /dev/null`).
- Add markdown syntax highlighting support when editing multi-line commit messages via `/commit`, by Kay Gosho.
- Set Gemini 2.5 Pro models to use the `overeager` prompt setting by default.
-- Add common file types (`.svg`, `.pdf`) and IDE directories (`.idea/`, `.vscode/`, etc.) to the default list of ignored files for AI comment scanning (`--watch`).
+- Add common file types (`.svg`, `.pdf`) to the default list of ignored files for AI comment scanning (`--watch`).
- Skip scanning files larger than 1MB for AI comments (`--watch`).
- Aider wrote 67% of the code in this release.
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 7dadbe766..471fa1ff9 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,158 +1,3 @@
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690930}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690930}
-{"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": 1744690930}
-{"event": "command_chat-mode", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690933}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690942}
-{"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": 12971, "completion_tokens": 1172, "total_tokens": 14143, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690956}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690987}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690990}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690995}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690996}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744690996}
-{"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": 1744690996}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691005}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691014}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691017}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691018}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691018}
-{"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": 1744691018}
-{"event": "command_chat-mode", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691020}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691022}
-{"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": 12926, "completion_tokens": 969, "total_tokens": 13895, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691035}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691166}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691169}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691170}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691170}
-{"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": 1744691170}
-{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691214}
-{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691214}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691214}
-{"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": 10036, "completion_tokens": 268, "total_tokens": 10304, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691224}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691233}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691233}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691233}
-{"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": 1744691233}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691235}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691249}
-{"event": "command_chat-mode", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691252}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691254}
-{"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": 12944, "completion_tokens": 814, "total_tokens": 13758, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691264}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691319}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691338}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691339}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691339}
-{"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": 1744691339}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691375}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691383}
-{"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": 12971, "completion_tokens": 1071, "total_tokens": 14042, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691391}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691391}
-{"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": 14633, "completion_tokens": 1110, "total_tokens": 15743, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691402}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691403}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691415}
-{"event": "command_architect", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691417}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691419}
-{"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": 11955, "completion_tokens": 377, "total_tokens": 12332, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691434}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691434}
-{"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": 9676, "completion_tokens": 952, "total_tokens": 10628, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691443}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744691586}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744693288}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744693292}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744693293}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744693293}
-{"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": 1744693293}
-{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744693299}
-{"event": "command_think-tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744693302}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744693309}
-{"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": 14284, "completion_tokens": 1017, "total_tokens": 15301, "cost": 0.058107000000000006, "total_cost": 0.058107000000000006}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744693330}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744758990}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761408}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761409}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761409}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761409}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761421}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761421}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761421}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761421}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761473}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761474}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761474}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761474}
-{"event": "message_send_exception", "properties": {"exception": "cannot access local variable 'os' where it is not associated with a value"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761475}
-{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761475}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761490}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761490}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761490}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761490}
-{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744761500}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744762281}
-{"event": "exit", "properties": {"reason": "Listed models"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744762283}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835675}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835676}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835676}
-{"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": 1744835676}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835677}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835693}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835696}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835696}
-{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835696}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835698}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835707}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835738}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835740}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835740}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835740}
-{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835748}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835757}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835759}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835759}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835759}
-{"event": "message_send", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole", "prompt_tokens": 7906, "completion_tokens": 95, "total_tokens": 8001, "cost": 0.08286, "total_cost": 0.08286}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835764}
-{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744835764}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840697}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840697}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840697}
-{"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": 1744840698}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840708}
-{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840722}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840723}
-{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840728}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840735}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840736}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840736}
-{"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": 1744840736}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840738}
-{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840744}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840747}
-{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840756}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840758}
-{"event": "message_send", "properties": {"main_model": "o4-mini", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "diff", "prompt_tokens": 16129, "completion_tokens": 370, "total_tokens": 16499, "cost": 0.019369900000000002, "total_cost": 0.019369900000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840771}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840803}
-{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840812}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840815}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840836}
-{"event": "message_send", "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-exp-03-25", "edit_format": "diff-fenced", "prompt_tokens": 16190, "completion_tokens": 334, "total_tokens": 16524, "cost": 0.0235775, "total_cost": 0.042947400000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840842}
-{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840853}
-{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744840853}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744843456}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744843458}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744843458}
-{"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": 1744843458}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744843488}
-{"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": 15525, "completion_tokens": 179, "total_tokens": 15704, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744843495}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744843533}
-{"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": 15869, "completion_tokens": 267, "total_tokens": 16136, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744843540}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744849446}
-{"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": 16314, "completion_tokens": 428, "total_tokens": 16742, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744849452}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744849486}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852257}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852266}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852268}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852268}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852268}
-{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gpt-4.1-mini", "editor_model": "gpt-4.1", "edit_format": "diff", "prompt_tokens": 2424, "completion_tokens": 97, "total_tokens": 2521, "cost": 0.028120000000000003, "total_cost": 0.028120000000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852271}
-{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852271}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852277}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852278}
{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852278}
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852278}
{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852321}
@@ -998,3 +843,158 @@
{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497569}
{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497571}
{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497574}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497662}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497662}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497662}
+{"event": "exit", "properties": {"reason": "Showed prompts"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497666}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497674}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497675}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497675}
+{"event": "exit", "properties": {"reason": "Showed prompts"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497678}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497704}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497705}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497705}
+{"event": "exit", "properties": {"reason": "Showed prompts"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497709}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497783}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497783}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497783}
+{"event": "exit", "properties": {"reason": "Showed prompts"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497787}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497814}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497815}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497815}
+{"event": "exit", "properties": {"reason": "Showed prompts"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497819}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497839}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497840}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497840}
+{"event": "exit", "properties": {"reason": "Showed prompts"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497842}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497852}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497852}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497852}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746497856}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501582}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501588}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501589}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501590}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501591}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501592}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501593}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501593}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501593}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501593}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501661}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501662}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501662}
+{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501662}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501662}
+{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501663}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501663}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501663}
+{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501663}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501784}
+{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501790}
+{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746501790}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746548297}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554583}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554586}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554618}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554618}
+{"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": 1746554619}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554619}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554622}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554627}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554630}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554631}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554631}
+{"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": 1746554631}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554631}
+{"event": "message_send", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED", "edit_format": "whole", "prompt_tokens": 1831, "completion_tokens": 158, "total_tokens": 1989, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554638}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554640}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746554640}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561895}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561898}
+{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561920}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561922}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561923}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561923}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561923}
+{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-preview-05-06", "weak_model": "gemini/gemini-2.5-pro-preview-05-06", "editor_model": "gemini/gemini-2.5-pro-preview-05-06", "edit_format": "whole", "prompt_tokens": 8566, "completion_tokens": 10, "total_tokens": 8576, "cost": 0.010807500000000001, "total_cost": 0.010807500000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561929}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746561929}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562529}
+{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562531}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562536}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562536}
+{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562536}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562536}
+{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 1862, "completion_tokens": 339, "total_tokens": 2201, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562557}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562559}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562559}
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index d19b10ceb..f9fa0d11e 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -264,15 +264,14 @@ tr:hover { background-color: #f5f5f5; }
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 1,826,168 | 83.3% |
-o3 | 239,619 | 10.9% |
-openrouter/anthropic/claude-3.7-sonnet | 56,318 | 2.6% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,672,741 | 83.9% |
+o3 | 237,098 | 11.9% |
+openrouter/anthropic/claude-3.7-sonnet | 41,017 | 2.1% |
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% |
+gemini/gemini-2.5-pro-preview-05-06 | 8,576 | 0.4% |
+gemini/REDACTED | 2,595 | 0.1% |
+openrouter/REDACTED | 2,201 | 0.1% |
{: .note :}
diff --git a/aider/website/docs/llms/other.md b/aider/website/docs/llms/other.md
index 5927230f6..be1ccdbce 100644
--- a/aider/website/docs/llms/other.md
+++ b/aider/website/docs/llms/other.md
@@ -78,6 +78,7 @@ cog.out(''.join(lines))
- GEMINI_API_KEY
- GROQ_API_KEY
- HUGGINGFACE_API_KEY
+- INFINITY_API_KEY
- MARITALK_API_KEY
- MISTRAL_API_KEY
- NLP_CLOUD_API_KEY
diff --git a/aider/website/index.html b/aider/website/index.html
index bb7ab7b1c..10fdf6d2e 100644
--- a/aider/website/index.html
+++ b/aider/website/index.html
@@ -69,7 +69,7 @@ cog.out(text)
]]]-->
⭐ GitHub Stars
- 32K
+ 33K
📦 Installs
From e53f2f7674ebe9c9c00416f5f3ea998a2e53ca53 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 09:09:11 -0700
Subject: [PATCH 070/133] docs: Add post about Gemini pricing
---
.../_posts/2025-05-07-gemini-pricing.md | 39 +++++++++++++++++++
1 file changed, 39 insertions(+)
create mode 100644 aider/website/_posts/2025-05-07-gemini-pricing.md
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
new file mode 100644
index 000000000..f9c679b21
--- /dev/null
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -0,0 +1,39 @@
+---
+title: A note on Gemini 2.5 Pro Preview 0325 pricing
+excerpt: The low price reported for Gemini 2.5 Pro Preview 0325 appears to be correct.
+draft: false
+nav_exclude: true
+---
+{% if page.date %}
+{{ page.date | date: "%B %d, %Y" }}
+{% endif %}
+
+# A note on Gemini 2.5 Pro Preview 0325 pricing
+
+# Timeline
+
+- Sat Apr 5 08:54:45 2025 +1300
+ - Commit eda796d feat: Add metadata and settings for gemini-2.5-pro-preview-03-25
+ - Correct value `"output_cost_per_token": 0.000010` added to `aider/resources/model-metadata.json`
+
+- Sun Apr 6 00:20:01 2025 +0800
+ - First litellm commit of `gemini/gemini-2.5-pro-preview-03-25` metadata, with incorrect price `"output_cost_per_token": 0.0000010`
+ - Commit cd0a1e6
+
+- Wed Apr 9 18:48:43 2025 -0700
+ - litellm commit updates `gemini/gemini-2.5-pro-preview-03-25` metadata, but not price
+ - commit ac4f32f
+
+- 2025-04-12-04-55-50 UTC
+ - Benchmark performed
+ - Repo hash 0282574 recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit 0282574.
+ - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commmit 0282574
+ - Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
+
+- Apr 12 08:06:39 2025 -0700
+ - Benchmark results added to repo
+
+- Sat Apr 12 19:20:04 2025 +0400
+ - Sat Apr 12 15:20:04 2025 UTC
+ - litellm commit fixes `gemini/gemini-2.5-pro-preview-03-25` price metadata to `"output_cost_per_token": 0.00001`
+ - commit 93037ea
From 9dd2d2a3b1c135f376f31c56c1923cdf5e2ebb48 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 09:09:12 -0700
Subject: [PATCH 071/133] fix: Update timeline to show UTC time and original
timestamp
---
aider/website/_posts/2025-05-07-gemini-pricing.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index f9c679b21..895bd71ce 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -12,28 +12,28 @@ nav_exclude: true
# Timeline
-- Sat Apr 5 08:54:45 2025 +1300
+- 2025-04-04 19:54:45 UTC (Sat Apr 5 08:54:45 2025 +1300)
- Commit eda796d feat: Add metadata and settings for gemini-2.5-pro-preview-03-25
- Correct value `"output_cost_per_token": 0.000010` added to `aider/resources/model-metadata.json`
-- Sun Apr 6 00:20:01 2025 +0800
+- 2025-04-05 16:20:01 UTC (Sun Apr 6 00:20:01 2025 +0800)
- First litellm commit of `gemini/gemini-2.5-pro-preview-03-25` metadata, with incorrect price `"output_cost_per_token": 0.0000010`
- Commit cd0a1e6
-- Wed Apr 9 18:48:43 2025 -0700
+- 2025-04-10 01:48:43 UTC (Wed Apr 9 18:48:43 2025 -0700)
- litellm commit updates `gemini/gemini-2.5-pro-preview-03-25` metadata, but not price
- commit ac4f32f
-- 2025-04-12-04-55-50 UTC
+- 2025-04-12 04:55:50 UTC (2025-04-12-04-55-50 UTC)
- Benchmark performed
- Repo hash 0282574 recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit 0282574.
- Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commmit 0282574
- Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
-- Apr 12 08:06:39 2025 -0700
+- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
- Benchmark results added to repo
-- Sat Apr 12 19:20:04 2025 +0400
- - Sat Apr 12 15:20:04 2025 UTC
+- 2025-04-12 15:20:04 UTC (Sat Apr 12 19:20:04 2025 +0400)
+ - 2025-04-12 15:20:04 UTC (Sat Apr 12 15:20:04 2025 UTC)
- litellm commit fixes `gemini/gemini-2.5-pro-preview-03-25` price metadata to `"output_cost_per_token": 0.00001`
- commit 93037ea
From ca714157b885fb35c13de557d79fdc75c3c400ca Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 09:09:14 -0700
Subject: [PATCH 072/133] fix: Correct typo in gemini pricing post
---
aider/website/_posts/2025-05-07-gemini-pricing.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index 895bd71ce..9f9e63a40 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -27,7 +27,7 @@ nav_exclude: true
- 2025-04-12 04:55:50 UTC (2025-04-12-04-55-50 UTC)
- Benchmark performed
- Repo hash 0282574 recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit 0282574.
- - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commmit 0282574
+ - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commit 0282574
- Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
From 41392a1c6e032c71dae4d6ec6425f7386b3f9810 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 09:11:48 -0700
Subject: [PATCH 073/133] copy
---
aider/website/_posts/2025-05-07-gemini-pricing.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index 9f9e63a40..fee9445cf 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -1,5 +1,5 @@
---
-title: A note on Gemini 2.5 Pro Preview 0325 pricing
+title: A note on Gemini 2.5 Pro Preview 0325 benchmark pricing
excerpt: The low price reported for Gemini 2.5 Pro Preview 0325 appears to be correct.
draft: false
nav_exclude: true
@@ -8,7 +8,9 @@ nav_exclude: true
{{ page.date | date: "%B %d, %Y" }}
{% endif %}
-# A note on Gemini 2.5 Pro Preview 0325 pricing
+# A note on Gemini 2.5 Pro Preview 0325 benchmark pricing
+
+ - Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
# Timeline
@@ -28,12 +30,10 @@ nav_exclude: true
- Benchmark performed
- Repo hash 0282574 recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit 0282574.
- Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commit 0282574
- - Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
- Benchmark results added to repo
- 2025-04-12 15:20:04 UTC (Sat Apr 12 19:20:04 2025 +0400)
- - 2025-04-12 15:20:04 UTC (Sat Apr 12 15:20:04 2025 UTC)
- litellm commit fixes `gemini/gemini-2.5-pro-preview-03-25` price metadata to `"output_cost_per_token": 0.00001`
- commit 93037ea
From d56ce3ae5638de4d4ff80f6a7e0a0a3e0044a3f9 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 09:17:29 -0700
Subject: [PATCH 074/133] copy
---
.../_posts/2025-05-07-gemini-pricing.md | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index fee9445cf..2c72161ee 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -1,5 +1,5 @@
---
-title: A note on Gemini 2.5 Pro Preview 0325 benchmark pricing
+title: Gemini 2.5 Pro Preview 0325 benchmark pricing
excerpt: The low price reported for Gemini 2.5 Pro Preview 0325 appears to be correct.
draft: false
nav_exclude: true
@@ -8,9 +8,21 @@ nav_exclude: true
{{ page.date | date: "%B %d, %Y" }}
{% endif %}
-# A note on Gemini 2.5 Pro Preview 0325 benchmark pricing
+# Gemini 2.5 Pro Preview 0325 benchmark pricing
- - Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
+There has been some concern about the low $6 price reported to run
+Gemini 2.5 Pro Preview 0325
+in the
+aider leaderboard.
+There are a couple of reasons for concern:
+
+- Aider uses litellm, which had an incorrect price for output tokens in their database at the time of the benchmark.
+- The new 0506 version of Gemini 2.5 Pro Preview reports much higher costs to benchmark.
+
+This note reviews and audits the original 0325 benchmark results to investigate the reported price.
+
+
+Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
# Timeline
From 4c871c6f5021d67983eab43522a2172b62a2c8db Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 09:28:52 -0700
Subject: [PATCH 075/133] docs: Audit gemini pricing in 0325 benchmark results
---
.../_posts/2025-05-07-gemini-pricing.md | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index 2c72161ee..b8da8629c 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -21,31 +21,38 @@ There are a couple of reasons for concern:
This note reviews and audits the original 0325 benchmark results to investigate the reported price.
+The incorrect litellm database entry does not appear to have affected the aider benchmark.
+Aider maintains and uses its own database of costs for some models, and it contained
+the correct pricing at the time of the benchmark.
+This was possible to confirm because
+aider records the git commit hash of the aider repository that was used
+to run each benchmark.
-Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
# Timeline
- 2025-04-04 19:54:45 UTC (Sat Apr 5 08:54:45 2025 +1300)
- - Commit eda796d feat: Add metadata and settings for gemini-2.5-pro-preview-03-25
- Correct value `"output_cost_per_token": 0.000010` added to `aider/resources/model-metadata.json`
+ - Commit eda796d in aider.
- 2025-04-05 16:20:01 UTC (Sun Apr 6 00:20:01 2025 +0800)
- First litellm commit of `gemini/gemini-2.5-pro-preview-03-25` metadata, with incorrect price `"output_cost_per_token": 0.0000010`
- - Commit cd0a1e6
+ - Commit cd0a1e6 in litellm.
- 2025-04-10 01:48:43 UTC (Wed Apr 9 18:48:43 2025 -0700)
- litellm commit updates `gemini/gemini-2.5-pro-preview-03-25` metadata, but not price
- - commit ac4f32f
+ - Commit ac4f32f in litellm.
- 2025-04-12 04:55:50 UTC (2025-04-12-04-55-50 UTC)
- Benchmark performed
- - Repo hash 0282574 recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit 0282574.
+ - Aider repo hash 0282574 recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit 0282574.
- Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commit 0282574
+ - Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
- Benchmark results added to repo
+ - Commit 7fbeafa in aider.
- 2025-04-12 15:20:04 UTC (Sat Apr 12 19:20:04 2025 +0400)
- litellm commit fixes `gemini/gemini-2.5-pro-preview-03-25` price metadata to `"output_cost_per_token": 0.00001`
- - commit 93037ea
+ - Commit 93037ea in litellm.
From 4acf65fcfb0e50bd4ca6a6ed85df4e286a615389 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 09:28:53 -0700
Subject: [PATCH 076/133] docs: Link commit hashes to aider and litellm github
repos
---
.../website/_posts/2025-05-07-gemini-pricing.md | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index b8da8629c..cdf40b769 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -33,26 +33,26 @@ to run each benchmark.
- 2025-04-04 19:54:45 UTC (Sat Apr 5 08:54:45 2025 +1300)
- Correct value `"output_cost_per_token": 0.000010` added to `aider/resources/model-metadata.json`
- - Commit eda796d in aider.
+ - Commit [eda796d](https://github.com/Aider-AI/aider/commit/eda796d) in aider.
- 2025-04-05 16:20:01 UTC (Sun Apr 6 00:20:01 2025 +0800)
- First litellm commit of `gemini/gemini-2.5-pro-preview-03-25` metadata, with incorrect price `"output_cost_per_token": 0.0000010`
- - Commit cd0a1e6 in litellm.
+ - Commit [cd0a1e6](https://github.com/BerriAI/litellm/commit/cd0a1e6) in litellm.
- 2025-04-10 01:48:43 UTC (Wed Apr 9 18:48:43 2025 -0700)
- litellm commit updates `gemini/gemini-2.5-pro-preview-03-25` metadata, but not price
- - Commit ac4f32f in litellm.
+ - Commit [ac4f32f](https://github.com/BerriAI/litellm/commit/ac4f32f) in litellm.
- 2025-04-12 04:55:50 UTC (2025-04-12-04-55-50 UTC)
- Benchmark performed
- - Aider repo hash 0282574 recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit 0282574.
- - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commit 0282574
- - Confirmed that aider built and run from commit 0282574 honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
+ - Aider repo hash [0282574](https://github.com/Aider-AI/aider/commit/0282574) recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
+ - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commit [0282574](https://github.com/Aider-AI/aider/commit/0282574)
+ - Confirmed that aider built and run from commit [0282574](https://github.com/Aider-AI/aider/commit/0282574) honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
- Benchmark results added to repo
- - Commit 7fbeafa in aider.
+ - Commit [7fbeafa](https://github.com/Aider-AI/aider/commit/7fbeafa) in aider.
- 2025-04-12 15:20:04 UTC (Sat Apr 12 19:20:04 2025 +0400)
- litellm commit fixes `gemini/gemini-2.5-pro-preview-03-25` price metadata to `"output_cost_per_token": 0.00001`
- - Commit 93037ea in litellm.
+ - Commit [93037ea](https://github.com/BerriAI/litellm/commit/93037ea) in litellm.
From b3cf318c5e16306483adf11999ee61d64c563ebb Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 09:47:52 -0700
Subject: [PATCH 077/133] copy
---
aider/website/_posts/2025-05-07-gemini-pricing.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index cdf40b769..6535ac2e4 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -23,7 +23,7 @@ This note reviews and audits the original 0325 benchmark results to investigate
The incorrect litellm database entry does not appear to have affected the aider benchmark.
Aider maintains and uses its own database of costs for some models, and it contained
-the correct pricing at the time of the benchmark.
+the correct pricing at the time of the benchmark and correctly loaded it.
This was possible to confirm because
aider records the git commit hash of the aider repository that was used
to run each benchmark.
@@ -45,8 +45,8 @@ to run each benchmark.
- 2025-04-12 04:55:50 UTC (2025-04-12-04-55-50 UTC)
- Benchmark performed
- - Aider repo hash [0282574](https://github.com/Aider-AI/aider/commit/0282574) recorded in benchmark results, without "dirty" indicating it was run on a clean checkout of the repo at commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
- - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at commit [0282574](https://github.com/Aider-AI/aider/commit/0282574)
+ - Aider repo hash [0282574 recorded in benchmark results](https://github.com/Aider-AI/aider/blob/7fbeafa1cfd4ad83f7499417837cdfa6b16fe7a1/aider/website/_data/polyglot_leaderboard.yml#L814), without "dirty", indicating that the benchmark was run on a clean checkout of the aider repo at commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
+ - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at this commit [0282574](https://github.com/Aider-AI/aider/blob/0282574/aider/resources/model-metadata.json#L357)
- Confirmed that aider built and run from commit [0282574](https://github.com/Aider-AI/aider/commit/0282574) honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
From 28aeb17cbe7724d5859afcbb1710fac6b9700dd2 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 10:07:16 -0700
Subject: [PATCH 078/133] copy
---
.../website/_posts/2025-05-07-gemini-pricing.md | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index 6535ac2e4..e9910cf2c 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -17,16 +17,22 @@ aider leaderboard.
There are a couple of reasons for concern:
- Aider uses litellm, which had an incorrect price for output tokens in their database at the time of the benchmark.
-- The new 0506 version of Gemini 2.5 Pro Preview reports much higher costs to benchmark.
+- The recent benchmark of the 0506 version of Gemini 2.5 Pro Preview reports much higher costs.
This note reviews and audits the original 0325 benchmark results to investigate the reported price.
-The incorrect litellm database entry does not appear to have affected the aider benchmark.
+The incorrect litellm database entry does **not** appear to have affected the aider benchmark.
Aider maintains and uses its own database of costs for some models, and it contained
the correct pricing at the time of the benchmark and correctly loaded it.
-This was possible to confirm because
-aider records the git commit hash of the aider repository that was used
-to run each benchmark.
+Re-running the benchmark with the same aider built from commit hash [0282574](https://github.com/Aider-AI/aider/commit/0282574)
+loads the correct pricing from aider's local db
+and produces similar costs as the original run.
+
+It appears that litellm changed the way it reports token usage
+between the benchmark of Gemini 2.5 Pro 0325 and today's 0506 benchmark.
+At that commit 0282574, aider was using litellm v1.65.3.
+Using the same aider built from 0282574, but with the latest litellm v1.68.1
+produces benchmark results with higher costs.
# Timeline
From d27bb56cf3eea593ecd0ec2001ae8a342e8c2efb Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 11:17:14 -0700
Subject: [PATCH 079/133] try to use litellm.completion_cost
---
aider/coders/base_coder.py | 63 +++++++++++++++++++++++---------------
1 file changed, 39 insertions(+), 24 deletions(-)
diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py
index feaeab857..bf4eb635d 100755
--- a/aider/coders/base_coder.py
+++ b/aider/coders/base_coder.py
@@ -1986,6 +1986,44 @@ class Coder:
self.usage_report = tokens_report
return
+ try:
+ # Try and use litellm's built in cost calculator. Seems to work for non-streaming only?
+ cost = litellm.completion_cost(completion_response=completion)
+ except ValueError:
+ cost = 0
+
+ if not cost:
+ cost = self.compute_costs_from_tokens(
+ prompt_tokens, completion_tokens, cache_write_tokens, cache_hit_tokens
+ )
+
+ self.total_cost += cost
+ self.message_cost += cost
+
+ def format_cost(value):
+ if value == 0:
+ return "0.00"
+ magnitude = abs(value)
+ if magnitude >= 0.01:
+ return f"{value:.2f}"
+ else:
+ return f"{value:.{max(2, 2 - int(math.log10(magnitude)))}f}"
+
+ cost_report = (
+ f"Cost: ${format_cost(self.message_cost)} message,"
+ f" ${format_cost(self.total_cost)} session."
+ )
+
+ if cache_hit_tokens and cache_write_tokens:
+ sep = "\n"
+ else:
+ sep = " "
+
+ self.usage_report = tokens_report + sep + cost_report
+
+ def compute_costs_from_tokens(
+ self, prompt_tokens, completion_tokens, cache_write_tokens, cache_hit_tokens
+ ):
cost = 0
input_cost_per_token = self.main_model.info.get("input_cost_per_token") or 0
@@ -2013,30 +2051,7 @@ class Coder:
cost += prompt_tokens * input_cost_per_token
cost += completion_tokens * output_cost_per_token
-
- self.total_cost += cost
- self.message_cost += cost
-
- def format_cost(value):
- if value == 0:
- return "0.00"
- magnitude = abs(value)
- if magnitude >= 0.01:
- return f"{value:.2f}"
- else:
- return f"{value:.{max(2, 2 - int(math.log10(magnitude)))}f}"
-
- cost_report = (
- f"Cost: ${format_cost(self.message_cost)} message,"
- f" ${format_cost(self.total_cost)} session."
- )
-
- if cache_hit_tokens and cache_write_tokens:
- sep = "\n"
- else:
- sep = " "
-
- self.usage_report = tokens_report + sep + cost_report
+ return cost
def show_usage_report(self):
if not self.usage_report:
From 146f62abcc667116a986c8d4772899c1f361e310 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 12:04:06 -0700
Subject: [PATCH 080/133] copy
---
.../_posts/2025-05-07-gemini-pricing.md | 27 ++++++++++++-------
1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index e9910cf2c..1d982d8a1 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -10,20 +10,27 @@ nav_exclude: true
# Gemini 2.5 Pro Preview 0325 benchmark pricing
-There has been some concern about the low $6 price reported to run
-Gemini 2.5 Pro Preview 0325
-in the
-aider leaderboard.
-There are a couple of reasons for concern:
-- Aider uses litellm, which had an incorrect price for output tokens in their database at the time of the benchmark.
-- The recent benchmark of the 0506 version of Gemini 2.5 Pro Preview reports much higher costs.
+The low $6 cost reported in the leaderboard to run the aider polyglot benchmark on
+Gemini 2.5 Pro Preview 0325 was incorrect.
-This note reviews and audits the original 0325 benchmark results to investigate the reported price.
+This note reviews and audits the original 0325 benchmark results to investigate the reported cost.
+Two possible causes were identified, both related to the litellm package that
+aider users to connect to LLM APIs.
-The incorrect litellm database entry does **not** appear to have affected the aider benchmark.
+- The litellm model database had an incorrect price-per-token for output tokens in their database at the time of the benchmark. This does not appear to be a contributing factor to the incorrect benchmark cost.
+- The litellm package was incorrectly excluding reasoning tokens from the token counts it reported back to aider. This appears to be the cause of the incorrect benchmark cost.
+
+The incorrect litellm database entry does not appear to have affected the aider benchmark costs.
Aider maintains and uses its own database of costs for some models, and it contained
-the correct pricing at the time of the benchmark and correctly loaded it.
+the correct pricing at the time of the benchmark.
+Aider appears to have
+loaded the correct cost data from its database and made use of it during the benchmark.
+Since litellm appears to have been excluding reasoning tokens from the token counts it reported,
+aider underestimated the API costs.
+
+
+#
Re-running the benchmark with the same aider built from commit hash [0282574](https://github.com/Aider-AI/aider/commit/0282574)
loads the correct pricing from aider's local db
and produces similar costs as the original run.
From eedea62ac1de536d4643394addaa499c6dd2afce Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 12:24:49 -0700
Subject: [PATCH 081/133] docs: Explain Gemini 2.5 Pro Preview 0325 benchmark
pricing error
---
.../_posts/2025-05-07-gemini-pricing.md | 48 +++++++++++++++----
1 file changed, 38 insertions(+), 10 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index 1d982d8a1..dec7da2b6 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -11,8 +11,9 @@ nav_exclude: true
# Gemini 2.5 Pro Preview 0325 benchmark pricing
-The low $6 cost reported in the leaderboard to run the aider polyglot benchmark on
+The $6 cost reported in the leaderboard to run the aider polyglot benchmark on
Gemini 2.5 Pro Preview 0325 was incorrect.
+The true cost was higher, possibly significantly so.
This note reviews and audits the original 0325 benchmark results to investigate the reported cost.
Two possible causes were identified, both related to the litellm package that
@@ -29,21 +30,37 @@ loaded the correct cost data from its database and made use of it during the ben
Since litellm appears to have been excluding reasoning tokens from the token counts it reported,
aider underestimated the API costs.
+Litellm fixed this issue on April 21, 2025 in
+commit [a7db0df](https://github.com/BerriAI/litellm/commit/a7db0df0434bfbac2b68ebe1c343b77955becb4b).
+This fix was released in litellm v1.67.1.
+Aider picked up this fix April 28, 2025 when it upgraded its litellm dependency
+from v1.65.7 to v1.67.4.post1
+in commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37)
+That change shipped on May 5, 2025 in aider v0.82.3.
-#
-Re-running the benchmark with the same aider built from commit hash [0282574](https://github.com/Aider-AI/aider/commit/0282574)
-loads the correct pricing from aider's local db
-and produces similar costs as the original run.
+# Investigation
-It appears that litellm changed the way it reports token usage
-between the benchmark of Gemini 2.5 Pro 0325 and today's 0506 benchmark.
-At that commit 0282574, aider was using litellm v1.65.3.
-Using the same aider built from 0282574, but with the latest litellm v1.68.1
-produces benchmark results with higher costs.
+Every aider benchmark report contains the git commit hash of the aider repo state used to
+run the benchmark.
+The benchmark run in question was built from
+commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
+
+Additional runs of the benchmark from that build verified that the error in litellm's
+model cost database appears not to have been a factor:
+
+- The local model database correctly overrides the litellm database, which contained an incorrect token cost at the time.
+- The correct pricing is loaded from aider's local model database and produces similar costs as the original run.
+- Updating aider's local model database with an absurdly high token cost resulted in an appropriately high benchmark cost report.
+
+That build of aider was updated with various versions of litellm using `git biset`
+to identify the litellm commit where the reasoning tokens were added to litellm's
+token count reporting.
# Timeline
+Below is the full timeline with git commits for the aider and litellm repositories.
+
- 2025-04-04 19:54:45 UTC (Sat Apr 5 08:54:45 2025 +1300)
- Correct value `"output_cost_per_token": 0.000010` added to `aider/resources/model-metadata.json`
- Commit [eda796d](https://github.com/Aider-AI/aider/commit/eda796d) in aider.
@@ -69,3 +86,14 @@ produces benchmark results with higher costs.
- 2025-04-12 15:20:04 UTC (Sat Apr 12 19:20:04 2025 +0400)
- litellm commit fixes `gemini/gemini-2.5-pro-preview-03-25` price metadata to `"output_cost_per_token": 0.00001`
- Commit [93037ea](https://github.com/BerriAI/litellm/commit/93037ea) in litellm.
+
+
+- ?? (Mon Apr 21 22:48:00 2025 -0700)
+ - Litellm started including reasoning tokens in token count reporting.
+ - Commit [a7db0df](https://github.com/BerriAI/litellm/commit/a7db0df0434bfbac2b68ebe1c343b77955becb4b) in litellm.
+ - This fix was released in litellm v1.67.1.
+
+- ?? (Mon Apr 28 07:53:20 2025 -0700)
+ - Aider upgraded its litellm dependency from v1.65.7 to v1.67.4.post1, which included the reasoning token count fix.
+ - Commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37) in aider.
+ - This change shipped on May 5, 2025 in aider v0.82.3.
From 8b08c5a5f3d0c52b03664ee04060556f07f7108f Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 12:24:49 -0700
Subject: [PATCH 082/133] fix: Replace placeholders with UTC timestamps in
gemini-pricing.md
---
aider/website/_posts/2025-05-07-gemini-pricing.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index dec7da2b6..d4615f60f 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -88,12 +88,12 @@ Below is the full timeline with git commits for the aider and litellm repositori
- Commit [93037ea](https://github.com/BerriAI/litellm/commit/93037ea) in litellm.
-- ?? (Mon Apr 21 22:48:00 2025 -0700)
+- 2025-04-22 05:48:00 UTC (Mon Apr 21 22:48:00 2025 -0700)
- Litellm started including reasoning tokens in token count reporting.
- Commit [a7db0df](https://github.com/BerriAI/litellm/commit/a7db0df0434bfbac2b68ebe1c343b77955becb4b) in litellm.
- This fix was released in litellm v1.67.1.
-- ?? (Mon Apr 28 07:53:20 2025 -0700)
+- 2025-04-28 14:53:20 UTC (Mon Apr 28 07:53:20 2025 -0700)
- Aider upgraded its litellm dependency from v1.65.7 to v1.67.4.post1, which included the reasoning token count fix.
- Commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37) in aider.
- This change shipped on May 5, 2025 in aider v0.82.3.
From 3b08327792708f157028c2c59b4eecd1a8d44569 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 12:29:44 -0700
Subject: [PATCH 083/133] copy
---
.../website/_posts/2025-05-07-gemini-pricing.md | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index d4615f60f..e9d6fb4a3 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -10,14 +10,13 @@ nav_exclude: true
# Gemini 2.5 Pro Preview 0325 benchmark pricing
-
-The $6 cost reported in the leaderboard to run the aider polyglot benchmark on
+The $6.32 cost reported in the leaderboard to run the aider polyglot benchmark on
Gemini 2.5 Pro Preview 0325 was incorrect.
The true cost was higher, possibly significantly so.
This note reviews and audits the original 0325 benchmark results to investigate the reported cost.
Two possible causes were identified, both related to the litellm package that
-aider users to connect to LLM APIs.
+aider uses to connect to LLM APIs.
- The litellm model database had an incorrect price-per-token for output tokens in their database at the time of the benchmark. This does not appear to be a contributing factor to the incorrect benchmark cost.
- The litellm package was incorrectly excluding reasoning tokens from the token counts it reported back to aider. This appears to be the cause of the incorrect benchmark cost.
@@ -38,6 +37,8 @@ from v1.65.7 to v1.67.4.post1
in commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37)
That change shipped on May 5, 2025 in aider v0.82.3.
+Unfortunately,
+
# Investigation
Every aider benchmark report contains the git commit hash of the aider repo state used to
@@ -59,10 +60,10 @@ token count reporting.
# Timeline
-Below is the full timeline with git commits for the aider and litellm repositories.
+Below is the full timeline of git commits related to this issue in the aider and litellm repositories.
- 2025-04-04 19:54:45 UTC (Sat Apr 5 08:54:45 2025 +1300)
- - Correct value `"output_cost_per_token": 0.000010` added to `aider/resources/model-metadata.json`
+ - Correct value `"output_cost_per_token": 0.000010` for `gemini/gemini-2.5-pro-preview-03-25` added to `aider/resources/model-metadata.json`
- Commit [eda796d](https://github.com/Aider-AI/aider/commit/eda796d) in aider.
- 2025-04-05 16:20:01 UTC (Sun Apr 6 00:20:01 2025 +0800)
@@ -75,19 +76,17 @@ Below is the full timeline with git commits for the aider and litellm repositori
- 2025-04-12 04:55:50 UTC (2025-04-12-04-55-50 UTC)
- Benchmark performed
- - Aider repo hash [0282574 recorded in benchmark results](https://github.com/Aider-AI/aider/blob/7fbeafa1cfd4ad83f7499417837cdfa6b16fe7a1/aider/website/_data/polyglot_leaderboard.yml#L814), without "dirty", indicating that the benchmark was run on a clean checkout of the aider repo at commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
+ - Aider repo hash [0282574 recorded in benchmark results](https://github.com/Aider-AI/aider/blob/7fbeafa1cfd4ad83f7499417837cdfa6b16fe7a1/aider/website/_data/polyglot_leaderboard.yml#L814), without a "dirty" annotation, indicating that the benchmark was run on a clean checkout of the aider repo at commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
- Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at this commit [0282574](https://github.com/Aider-AI/aider/blob/0282574/aider/resources/model-metadata.json#L357)
- - Confirmed that aider built and run from commit [0282574](https://github.com/Aider-AI/aider/commit/0282574) honors `output_cost_per_token` from `aider/resources/model-metadata.json` by putting in an absurdly high value and benchmarking `gemini/gemini-2.5-pro-preview-03-25`
- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
- - Benchmark results added to repo
+ - Benchmark results added to aider repo.
- Commit [7fbeafa](https://github.com/Aider-AI/aider/commit/7fbeafa) in aider.
- 2025-04-12 15:20:04 UTC (Sat Apr 12 19:20:04 2025 +0400)
- litellm commit fixes `gemini/gemini-2.5-pro-preview-03-25` price metadata to `"output_cost_per_token": 0.00001`
- Commit [93037ea](https://github.com/BerriAI/litellm/commit/93037ea) in litellm.
-
- 2025-04-22 05:48:00 UTC (Mon Apr 21 22:48:00 2025 -0700)
- Litellm started including reasoning tokens in token count reporting.
- Commit [a7db0df](https://github.com/BerriAI/litellm/commit/a7db0df0434bfbac2b68ebe1c343b77955becb4b) in litellm.
From c1dc473ed85636268ca9a8320818729e80bbba2d Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 12:59:57 -0700
Subject: [PATCH 084/133] copy
---
aider/website/_data/polyglot_leaderboard.yml | 2 +-
.../_posts/2025-05-07-gemini-pricing.md | 69 +++++++++++--------
2 files changed, 43 insertions(+), 28 deletions(-)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index e80e66b2d..9f3745f13 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -831,7 +831,7 @@
date: 2025-04-12
versions: 0.81.3.dev
seconds_per_case: 45.3
- total_cost: 6.3174
+ total_cost: 0 # incorrect: 6.3174
- dirname: 2025-03-29-05-24-55--chatgpt4o-mar28-diff
test_cases: 225
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-pricing.md
index e9d6fb4a3..69d99427b 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-pricing.md
@@ -1,66 +1,81 @@
---
-title: Gemini 2.5 Pro Preview 0325 benchmark pricing
-excerpt: The low price reported for Gemini 2.5 Pro Preview 0325 appears to be correct.
-draft: false
+title: Gemini 2.5 Pro Preview 03-25 benchmark cost
+excerpt: The $6.32 benchmark cost reported for Gemini 2.5 Pro Preview 03-25 was incorrect.
+draft: true
nav_exclude: true
---
{% if page.date %}
{{ page.date | date: "%B %d, %Y" }}
{% endif %}
-# Gemini 2.5 Pro Preview 0325 benchmark pricing
+# Gemini 2.5 Pro Preview 03-25 benchmark pricing
-The $6.32 cost reported in the leaderboard to run the aider polyglot benchmark on
-Gemini 2.5 Pro Preview 0325 was incorrect.
+The $6.32 cost reported to run the aider polyglot benchmark on
+Gemini 2.5 Pro Preview 03-25 was incorrect.
The true cost was higher, possibly significantly so.
+This note shares the results of an audit and root cause analysis
+relating to this error.
-This note reviews and audits the original 0325 benchmark results to investigate the reported cost.
Two possible causes were identified, both related to the litellm package that
-aider uses to connect to LLM APIs.
+aider uses to connect to LLM APIs:
-- The litellm model database had an incorrect price-per-token for output tokens in their database at the time of the benchmark. This does not appear to be a contributing factor to the incorrect benchmark cost.
-- The litellm package was incorrectly excluding reasoning tokens from the token counts it reported back to aider. This appears to be the cause of the incorrect benchmark cost.
+- The litellm model database had an incorrect price-per-token for Gemini 2.5 Pro Preview 03-25 in their costs database.
+This does not appear to be a contributing factor to the incorrect benchmark cost.
+- The litellm package was incorrectly excluding reasoning tokens from the token counts it reported to aider. This appears to be the cause of the incorrect benchmark cost.
The incorrect litellm database entry does not appear to have affected the aider benchmark costs.
Aider maintains and uses its own database of costs for some models, and it contained
the correct pricing at the time of the benchmark.
Aider appears to have
loaded the correct cost data from its database and made use of it during the benchmark.
-Since litellm appears to have been excluding reasoning tokens from the token counts it reported,
-aider underestimated the API costs.
-Litellm fixed this issue on April 21, 2025 in
+The version of litellm available at that time appears to have been
+excluding reasoning tokens from the token counts it reported.
+So even though aider had correct per-token pricing, it did not have the correct token counts
+used during the benchmark.
+This resulted in an underestimate of the benchmark costs.
+
+Litellm fixed the token counting issue on April 21, 2025 in
commit [a7db0df](https://github.com/BerriAI/litellm/commit/a7db0df0434bfbac2b68ebe1c343b77955becb4b).
This fix was released in litellm v1.67.1.
Aider picked up this fix April 28, 2025 when it upgraded its litellm dependency
from v1.65.7 to v1.67.4.post1
-in commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37)
-That change shipped on May 5, 2025 in aider v0.82.3.
+in commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37).
+That dependency change shipped on May 5, 2025 in aider v0.82.3.
-Unfortunately,
+The incorrect cost has been removed from the leaderboard.
+Unfortunately, the 03-25 version of Gemini 2.5 Pro Preview is no longer available,
+so it is not possible to re-run the benchmark to obtain an accurate cost.
+
+As a possibly relevant comparison, the newer 05-06 version of Gemini 2.5 Pro Preview
+completed the benchmark at a cost of $41.17.
# Investigation
-Every aider benchmark report contains the git commit hash of the aider repo state used to
+Every aider benchmark report contains the git commit hash of the aider repository state used to
run the benchmark.
-The benchmark run in question was built from
+The
+[benchmark run in question](https://github.com/Aider-AI/aider/blob/edbfec0ce4e1fe86735c915cb425b0d8636edc32/aider/website/_data/polyglot_leaderboard.yml#L814)
+was built from
commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
Additional runs of the benchmark from that build verified that the error in litellm's
model cost database appears not to have been a factor:
-- The local model database correctly overrides the litellm database, which contained an incorrect token cost at the time.
-- The correct pricing is loaded from aider's local model database and produces similar costs as the original run.
-- Updating aider's local model database with an absurdly high token cost resulted in an appropriately high benchmark cost report.
+- Aider's local model database correctly overrides the litellm database, which contained an incorrect token cost at the time.
+- The correct pricing is loaded from aider's local model database and produces similar (incorrect) costs as the original run.
+- Updating aider's local model database with an absurdly high token cost resulted in an appropriately high benchmark cost report, demonstrating that the local database costs were in effect.
+
+This specific build of aider was then updated with various versions of litellm using `git biset`
+to identify the first litellm commit where correct tokens counts were returned.
-That build of aider was updated with various versions of litellm using `git biset`
-to identify the litellm commit where the reasoning tokens were added to litellm's
-token count reporting.
# Timeline
Below is the full timeline of git commits related to this issue in the aider and litellm repositories.
+Each entry has a UTC timestamp, followed by the original literal timestamp obtained from the
+relevant source.
- 2025-04-04 19:54:45 UTC (Sat Apr 5 08:54:45 2025 +1300)
- Correct value `"output_cost_per_token": 0.000010` for `gemini/gemini-2.5-pro-preview-03-25` added to `aider/resources/model-metadata.json`
@@ -75,9 +90,9 @@ Below is the full timeline of git commits related to this issue in the aider and
- Commit [ac4f32f](https://github.com/BerriAI/litellm/commit/ac4f32f) in litellm.
- 2025-04-12 04:55:50 UTC (2025-04-12-04-55-50 UTC)
- - Benchmark performed
+ - Benchmark performed.
- Aider repo hash [0282574 recorded in benchmark results](https://github.com/Aider-AI/aider/blob/7fbeafa1cfd4ad83f7499417837cdfa6b16fe7a1/aider/website/_data/polyglot_leaderboard.yml#L814), without a "dirty" annotation, indicating that the benchmark was run on a clean checkout of the aider repo at commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
- - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at this commit [0282574](https://github.com/Aider-AI/aider/blob/0282574/aider/resources/model-metadata.json#L357)
+ - Correct value `"output_cost_per_token": 0.000010` is in `aider/resources/model-metadata.json` at this commit [0282574](https://github.com/Aider-AI/aider/blob/0282574/aider/resources/model-metadata.json#L357).
- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
- Benchmark results added to aider repo.
@@ -95,4 +110,4 @@ Below is the full timeline of git commits related to this issue in the aider and
- 2025-04-28 14:53:20 UTC (Mon Apr 28 07:53:20 2025 -0700)
- Aider upgraded its litellm dependency from v1.65.7 to v1.67.4.post1, which included the reasoning token count fix.
- Commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37) in aider.
- - This change shipped on May 5, 2025 in aider v0.82.3.
+ - This dependency change shipped on May 5, 2025 in aider v0.82.3.
From 8e84b5c0b1be9fd4bcea606d8ca912956d439152 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:06:04 -0700
Subject: [PATCH 085/133] cleanup
---
aider/website/_data/polyglot_leaderboard.yml | 26 -------------------
...i-pricing.md => 2025-05-07-gemini-cost.md} | 8 +++---
2 files changed, 4 insertions(+), 30 deletions(-)
rename aider/website/_posts/{2025-05-07-gemini-pricing.md => 2025-05-07-gemini-cost.md} (94%)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 9f3745f13..6052fa1c8 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1225,29 +1225,3 @@
seconds_per_case: 50.1
total_cost: 1.8451
-- dirname: 2025-05-06-21-34-36--gemini0506-diff-fenced
- test_cases: 225
- model: gemini/gemini-2.5-pro-preview-05-06
- edit_format: diff-fenced
- commit_hash: 8159cbf-dirty
- pass_rate_1: 37.8
- pass_rate_2: 75.6
- pass_num_1: 85
- pass_num_2: 170
- percent_cases_well_formed: 95.1
- error_outputs: 11
- num_malformed_responses: 11
- num_with_malformed_responses: 11
- user_asks: 139
- lazy_comments: 0
- syntax_errors: 0
- indentation_errors: 0
- exhausted_context_windows: 0
- test_timeouts: 5
- total_tests: 225
- command: aider --model gemini/gemini-2.5-pro-preview-05-06
- date: 2025-05-06
- versions: 0.82.4.dev
- seconds_per_case: 158.8
- total_cost: 41.1744
-
diff --git a/aider/website/_posts/2025-05-07-gemini-pricing.md b/aider/website/_posts/2025-05-07-gemini-cost.md
similarity index 94%
rename from aider/website/_posts/2025-05-07-gemini-pricing.md
rename to aider/website/_posts/2025-05-07-gemini-cost.md
index 69d99427b..e03faa3d9 100644
--- a/aider/website/_posts/2025-05-07-gemini-pricing.md
+++ b/aider/website/_posts/2025-05-07-gemini-cost.md
@@ -8,7 +8,7 @@ nav_exclude: true
{{ page.date | date: "%B %d, %Y" }}
{% endif %}
-# Gemini 2.5 Pro Preview 03-25 benchmark pricing
+# Gemini 2.5 Pro Preview 03-25 benchmark cost
The $6.32 cost reported to run the aider polyglot benchmark on
Gemini 2.5 Pro Preview 03-25 was incorrect.
@@ -21,7 +21,7 @@ aider uses to connect to LLM APIs:
- The litellm model database had an incorrect price-per-token for Gemini 2.5 Pro Preview 03-25 in their costs database.
This does not appear to be a contributing factor to the incorrect benchmark cost.
-- The litellm package was incorrectly excluding reasoning tokens from the token counts it reported to aider. This appears to be the cause of the incorrect benchmark cost.
+- The litellm package was excluding reasoning tokens from the token counts it reported to aider. This appears to be the cause of the incorrect benchmark cost.
The incorrect litellm database entry does not appear to have affected the aider benchmark costs.
Aider maintains and uses its own database of costs for some models, and it contained
@@ -44,7 +44,7 @@ in commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37).
That dependency change shipped on May 5, 2025 in aider v0.82.3.
The incorrect cost has been removed from the leaderboard.
-Unfortunately, the 03-25 version of Gemini 2.5 Pro Preview is no longer available,
+Unfortunately the 03-25 version of Gemini 2.5 Pro Preview is no longer available,
so it is not possible to re-run the benchmark to obtain an accurate cost.
As a possibly relevant comparison, the newer 05-06 version of Gemini 2.5 Pro Preview
@@ -67,7 +67,7 @@ model cost database appears not to have been a factor:
- Updating aider's local model database with an absurdly high token cost resulted in an appropriately high benchmark cost report, demonstrating that the local database costs were in effect.
This specific build of aider was then updated with various versions of litellm using `git biset`
-to identify the first litellm commit where correct tokens counts were returned.
+to identify the first litellm commit where reasoning tokens counts were reported.
From efd5f7936805a668a3b630a731c645b8ce7ed2e7 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:07:06 -0700
Subject: [PATCH 086/133] copy
---
aider/website/_posts/2025-05-07-gemini-cost.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-cost.md b/aider/website/_posts/2025-05-07-gemini-cost.md
index e03faa3d9..fde9956dc 100644
--- a/aider/website/_posts/2025-05-07-gemini-cost.md
+++ b/aider/website/_posts/2025-05-07-gemini-cost.md
@@ -48,7 +48,7 @@ Unfortunately the 03-25 version of Gemini 2.5 Pro Preview is no longer available
so it is not possible to re-run the benchmark to obtain an accurate cost.
As a possibly relevant comparison, the newer 05-06 version of Gemini 2.5 Pro Preview
-completed the benchmark at a cost of $41.17.
+completed the benchmark at a cost of about $38.
# Investigation
From e3911f8621d2482b0e1276c40aeafa8f67ade67e Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:08:08 -0700
Subject: [PATCH 087/133] copy
---
aider/website/assets/sample-analytics.jsonl | 710 ++++++++++----------
aider/website/docs/faq.md | 11 +-
aider/website/docs/leaderboards/index.md | 2 +-
3 files changed, 362 insertions(+), 361 deletions(-)
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 471fa1ff9..6be794fac 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,358 +1,3 @@
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852278}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852278}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852321}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852322}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852322}
-{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852324}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852418}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852419}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852419}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852419}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852419}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852419}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852420}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852421}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852422}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852422}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852422}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852422}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852422}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852423}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852424}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852425}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852426}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852426}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852426}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852426}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852426}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852426}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852427}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852427}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852427}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852427}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852513}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852514}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852514}
-{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852514}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852514}
-{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852514}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852515}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852515}
-{"event": "exit", "properties": {"reason": "Unknown edit format"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852515}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852551}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852553}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852553}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852553}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852556}
-{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852556}
-{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852556}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852577}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852579}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852579}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852579}
-{"event": "message_send", "properties": {"main_model": "o3", "weak_model": "gpt-4.1-mini", "editor_model": "gpt-4.1", "edit_format": "diff", "prompt_tokens": 2371, "completion_tokens": 70, "total_tokens": 2441, "cost": 0.026510000000000002, "total_cost": 0.026510000000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852582}
-{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852582}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852785}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852788}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852788}
-{"event": "cli session", "properties": {"main_model": "huggingface/REDACTED", "weak_model": "huggingface/REDACTED", "editor_model": "huggingface/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852788}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852789}
-{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852857}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852879}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852879}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852879}
-{"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": 1744852880}
-{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852896}
-{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852905}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852987}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852990}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852990}
-{"event": "cli session", "properties": {"main_model": "huggingface/REDACTED", "weak_model": "huggingface/REDACTED", "editor_model": "huggingface/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852990}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744852991}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853024}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853033}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853036}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853036}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853036}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853057}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853059}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853059}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853059}
-{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853069}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853206}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853209}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853209}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853209}
-{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853216}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853270}
-{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853270}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853270}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853270}
-{"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": 7310, "completion_tokens": 173, "total_tokens": 7483, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853291}
-{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744853291}
-{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855133}
-{"event": "repo", "properties": {"num_files": 611}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855134}
-{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855134}
-{"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": 1744855134}
-{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855140}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855150}
-{"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": 9490, "completion_tokens": 2108, "total_tokens": 11598, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855168}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855169}
-{"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": 12680, "completion_tokens": 2039, "total_tokens": 14719, "cost": 0.0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855184}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855185}
-{"event": "command_architect", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855188}
-{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855202}
-{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855204}
-{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855205}
-{"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": 8474, "completion_tokens": 301, "total_tokens": 8775, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1744855212}
-{"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}
-{"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}
@@ -998,3 +643,358 @@
{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 1862, "completion_tokens": 339, "total_tokens": 2201, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562557}
{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562559}
{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746562559}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746630985}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746630989}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746630989}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631023}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631023}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631023}
+{"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": 1746631023}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631085}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631087}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631087}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631087}
+{"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": 1746631087}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631102}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631734}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631734}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631734}
+{"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": 1746631734}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631736}
+{"event": "message_send", "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", "prompt_tokens": 10039, "completion_tokens": 10, "total_tokens": 10049, "cost": 0.01264875, "total_cost": 0.01264875}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631741}
+{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631746}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631763}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631765}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631766}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631766}
+{"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": 1746631766}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631767}
+{"event": "message_send", "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", "prompt_tokens": 10023, "completion_tokens": 10, "total_tokens": 10033, "cost": 9990.01252875, "total_cost": 9990.01252875}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631772}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631795}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631804}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631805}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631805}
+{"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": 1746631805}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631811}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631838}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631839}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631839}
+{"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": 1746631839}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746631844}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633659}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633659}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633659}
+{"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": 1746633659}
+{"event": "command_edit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633672}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633728}
+{"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": 10520, "completion_tokens": 138, "total_tokens": 10658, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633788}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633798}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633806}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633806}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633806}
+{"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": 1746633806}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633808}
+{"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": 4930, "completion_tokens": 787, "total_tokens": 5717, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746633938}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746634244}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746635197}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746635197}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746635197}
+{"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": 1746635198}
+{"event": "command_edit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746635222}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746635299}
+{"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": 4998, "completion_tokens": 991, "total_tokens": 5989, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746635317}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636463}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636745}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636748}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636748}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636748}
+{"event": "message_send", "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", "prompt_tokens": 10025, "completion_tokens": 20, "total_tokens": 10045, "cost": 0.012731250000000001, "total_cost": 0.012731250000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636782}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636782}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636796}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636797}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636797}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636797}
+{"event": "message_send", "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": "ask", "prompt_tokens": 9605, "completion_tokens": 13, "total_tokens": 9618, "cost": 0.012136250000000001, "total_cost": 0.012136250000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636802}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636802}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636814}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636814}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636814}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636814}
+{"event": "message_send", "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": "ask", "prompt_tokens": 7634, "completion_tokens": 9, "total_tokens": 7643, "cost": 0.0096325, "total_cost": 0.0096325}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636818}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636819}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636863}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636864}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636864}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636864}
+{"event": "message_send", "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": "ask", "prompt_tokens": 9661, "completion_tokens": 13, "total_tokens": 9674, "cost": 0.01220625, "total_cost": 0.01220625}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636869}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636869}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636903}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636903}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636903}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636903}
+{"event": "message_send", "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": "ask", "prompt_tokens": 7623, "completion_tokens": 97, "total_tokens": 7720, "cost": 0.010498750000000001, "total_cost": 0.010498750000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636910}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636926}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636926}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636926}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636926}
+{"event": "message_send", "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": "ask", "prompt_tokens": 9548, "completion_tokens": 177, "total_tokens": 9725, "cost": 0.013705000000000002, "total_cost": 0.013705000000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746636935}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637010}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637010}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637010}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637010}
+{"event": "message_send", "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": "ask", "prompt_tokens": 9693, "completion_tokens": 593, "total_tokens": 10286, "cost": 0.01804625, "total_cost": 0.01804625}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637039}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637039}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637062}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637062}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637062}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637063}
+{"event": "message_send", "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": "ask", "prompt_tokens": 9877, "completion_tokens": 469, "total_tokens": 10346, "cost": 0.017036250000000003, "total_cost": 0.017036250000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637102}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637102}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637741}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637744}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637744}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637745}
+{"event": "message_send", "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": "ask", "prompt_tokens": 10769, "completion_tokens": 415, "total_tokens": 11184, "cost": 0.017611250000000002, "total_cost": 0.017611250000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637797}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637797}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637816}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637816}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637816}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637816}
+{"event": "message_send", "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": "ask", "prompt_tokens": 9891, "completion_tokens": 368, "total_tokens": 10259, "cost": 0.016043750000000002, "total_cost": 0.016043750000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637917}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746637917}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641506}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641507}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641507}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641507}
+{"event": "message_send", "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": "ask", "prompt_tokens": 9544, "completion_tokens": 13, "total_tokens": 9557, "cost": 0.012060000000000001, "total_cost": 0.012060000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641512}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641513}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641570}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641571}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641571}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641571}
+{"event": "message_send_exception", "properties": {"exception": "Model is None and does not exist in passed completion_response. Passed completion_response=, model=None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641576}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641576}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641608}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641608}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641608}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641608}
+{"event": "message_send_exception", "properties": {"exception": "Model is None and does not exist in passed completion_response. Passed completion_response=, model=None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641613}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641613}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641630}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641630}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641630}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641630}
+{"event": "message_send_exception", "properties": {"exception": "Model is None and does not exist in passed completion_response. Passed completion_response=, model=None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641635}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641635}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641711}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641711}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641711}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641712}
+{"event": "message_send_exception", "properties": {"exception": "Model is None and does not exist in passed completion_response. Passed completion_response=, model=None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641717}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641717}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641747}
+{"event": "repo", "properties": {"num_files": 616}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641748}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641748}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641748}
+{"event": "message_send", "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": "ask", "prompt_tokens": 9055, "completion_tokens": 57, "total_tokens": 9112, "cost": 0.01188875, "total_cost": 0.01188875}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641753}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641753}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641859}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641860}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641860}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641860}
+{"event": "message_send", "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": "ask", "prompt_tokens": 10879, "completion_tokens": 55, "total_tokens": 10934, "cost": 0.014148750000000002, "total_cost": 0.014148750000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641865}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746641865}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642137}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642140}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642140}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642141}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642170}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642170}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642170}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642171}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642199}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642200}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642201}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642201}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642201}
+{"event": "message_send", "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": "ask", "prompt_tokens": 14013, "completion_tokens": 340, "total_tokens": 14353, "cost": 0.02091625, "total_cost": 0.02091625}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642240}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642240}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642274}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642274}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642274}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642274}
+{"event": "message_send", "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": "ask", "prompt_tokens": 12853, "completion_tokens": 3080, "total_tokens": 15933, "cost": 0.04686625, "total_cost": 0.04686625}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642307}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642307}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642372}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642372}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642372}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642372}
+{"event": "message_send", "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": "ask", "prompt_tokens": 14020, "completion_tokens": 2279, "total_tokens": 16299, "cost": 0.040315000000000004, "total_cost": 0.040315000000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642397}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642397}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642510}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642511}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642511}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642511}
+{"event": "message_send", "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": "ask", "prompt_tokens": 12857, "completion_tokens": 4951, "total_tokens": 17808, "cost": 0.06558125000000001, "total_cost": 0.06558125000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642560}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642561}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642590}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642591}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642591}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642591}
+{"event": "message_send", "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": "ask", "prompt_tokens": 12659, "completion_tokens": 3733, "total_tokens": 16392, "cost": 0.05315375, "total_cost": 0.05315375}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642632}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642632}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642659}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642660}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642660}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642660}
+{"event": "message_send", "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": "ask", "prompt_tokens": 12882, "completion_tokens": 345, "total_tokens": 13227, "cost": 0.019552500000000004, "total_cost": 0.019552500000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642724}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642724}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642738}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642739}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642739}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642739}
+{"event": "message_send", "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": "ask", "prompt_tokens": 12863, "completion_tokens": 716, "total_tokens": 13579, "cost": 0.023238750000000002, "total_cost": 0.023238750000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642765}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642765}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642795}
+{"event": "repo", "properties": {"num_files": 606}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642796}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642796}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642796}
+{"event": "message_send", "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": "ask", "prompt_tokens": 12658, "completion_tokens": 5959, "total_tokens": 18617, "cost": 0.07541250000000001, "total_cost": 0.07541250000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642852}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746642852}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643011}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643012}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643012}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643012}
+{"event": "message_send_exception", "properties": {"exception": "'ModelResponse' object has no attribute 'completion_tokens'"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643015}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643015}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643034}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643034}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643034}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643034}
+{"event": "message_send_exception", "properties": {"exception": "'ModelResponse' object has no attribute 'completion_tokens'"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643039}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643039}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643084}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643085}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643085}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643085}
+{"event": "message_send_exception", "properties": {"exception": "'ModelResponse' object has no attribute 'completion_tokens'"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643088}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643088}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643095}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643095}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643095}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643095}
+{"event": "message_send", "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": "ask", "prompt_tokens": 68, "completion_tokens": 81, "total_tokens": 149, "cost": 0.0008950000000000001, "total_cost": 0.0008950000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643099}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643099}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643119}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643120}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643120}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643120}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 1822, "total_tokens": 10526, "cost": 0.0291, "total_cost": 0.0291}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643140}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643140}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643199}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643199}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643199}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643199}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643203}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643204}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643204}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643204}
+{"event": "message_send", "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": "ask", "prompt_tokens": 68, "completion_tokens": 13, "total_tokens": 81, "cost": 0.00021500000000000002, "total_cost": 0.00021500000000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643207}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643207}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643216}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643217}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643217}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643217}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 307, "total_tokens": 9011, "cost": 0.01395, "total_cost": 0.01395}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643242}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643242}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643287}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643287}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643287}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643287}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 468, "total_tokens": 9172, "cost": 0.015560000000000001, "total_cost": 0.015560000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643309}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643309}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643362}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643362}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643362}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643362}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 2055, "total_tokens": 10759, "cost": 0.03143, "total_cost": 0.03143}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643385}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643385}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643425}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643426}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643426}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643426}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 2614, "total_tokens": 11318, "cost": 0.037020000000000004, "total_cost": 0.037020000000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643452}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643452}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643551}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643552}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643552}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643552}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 468, "total_tokens": 9172, "cost": 0.015560000000000001, "total_cost": 0.015560000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643575}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643575}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643589}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643589}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643589}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643589}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 1822, "total_tokens": 10526, "cost": 0.0291, "total_cost": 0.0291}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643611}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643611}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643634}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643634}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643634}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643634}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 1822, "total_tokens": 10526, "cost": 0.0291, "total_cost": 0.0291}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643655}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643655}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643675}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643675}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643675}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643675}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 468, "total_tokens": 9172, "cost": 0.015560000000000001, "total_cost": 0.015560000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643696}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643696}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643709}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643709}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643709}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643709}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 500, "total_tokens": 9204, "cost": 0.015880000000000002, "total_cost": 0.015880000000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643730}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643730}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643743}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643743}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643743}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643743}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 2055, "total_tokens": 10759, "cost": 0.03143, "total_cost": 0.03143}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643764}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643764}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643777}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643777}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643777}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643777}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 336, "total_tokens": 9040, "cost": 0.014240000000000001, "total_cost": 0.014240000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643796}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643796}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643874}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643874}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643874}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643874}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 2614, "total_tokens": 11318, "cost": 0.037020000000000004, "total_cost": 0.037020000000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643901}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746643901}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644671}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644671}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644671}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644671}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 1822, "total_tokens": 10526, "cost": 0.0291, "total_cost": 0.0291}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644693}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644693}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644812}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644813}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644813}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644813}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 336, "total_tokens": 9040, "cost": 0.014240000000000001, "total_cost": 0.014240000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644835}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644835}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644859}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644859}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644859}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644859}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 1583, "total_tokens": 10287, "cost": 0.02671, "total_cost": 0.02671}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644877}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746644877}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746645851}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746645851}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746645851}
+{"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": 1746645851}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746645861}
+{"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": 6524, "completion_tokens": 387, "total_tokens": 6911, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746645888}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746646177}
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index f9fa0d11e..88da6a54f 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -264,14 +264,15 @@ tr:hover { background-color: #f5f5f5; }
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 1,672,741 | 83.9% |
-o3 | 237,098 | 11.9% |
-openrouter/anthropic/claude-3.7-sonnet | 41,017 | 2.1% |
-gemini/gemini-2.5-flash-preview-04-17 | 18,645 | 0.9% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,588,028 | 70.8% |
+gemini/gemini-2.5-pro-preview-03-25 | 432,979 | 19.3% |
+o3 | 138,842 | 6.2% |
+openrouter/anthropic/claude-3.7-sonnet | 41,017 | 1.8% |
+gemini/gemini-2.5-flash-preview-04-17 | 18,645 | 0.8% |
xai/grok-3-fast-beta | 10,288 | 0.5% |
gemini/gemini-2.5-pro-preview-05-06 | 8,576 | 0.4% |
-gemini/REDACTED | 2,595 | 0.1% |
openrouter/REDACTED | 2,201 | 0.1% |
+gemini/REDACTED | 1,989 | 0.1% |
{: .note :}
diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md
index fa03fb2d7..6e763dfed 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 20, 2025.
+May 07, 2025.
From 98e6939c480990e2bbc95fdc0a9e44a054bb6611 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:12:28 -0700
Subject: [PATCH 088/133] copy
---
aider/website/_posts/2025-05-07-gemini-cost.md | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-cost.md b/aider/website/_posts/2025-05-07-gemini-cost.md
index fde9956dc..995c726ef 100644
--- a/aider/website/_posts/2025-05-07-gemini-cost.md
+++ b/aider/website/_posts/2025-05-07-gemini-cost.md
@@ -35,10 +35,11 @@ So even though aider had correct per-token pricing, it did not have the correct
used during the benchmark.
This resulted in an underestimate of the benchmark costs.
-Litellm fixed the token counting issue on April 21, 2025 in
+Litellm began including reasoning tokens in the reported counts
+on April 21, 2025 in
commit [a7db0df](https://github.com/BerriAI/litellm/commit/a7db0df0434bfbac2b68ebe1c343b77955becb4b).
-This fix was released in litellm v1.67.1.
-Aider picked up this fix April 28, 2025 when it upgraded its litellm dependency
+This change was released in litellm v1.67.1.
+Aider picked up this change April 28, 2025 when it upgraded its litellm dependency
from v1.65.7 to v1.67.4.post1
in commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37).
That dependency change shipped on May 5, 2025 in aider v0.82.3.
From e9d2f527a186eae6f95c02bfccd3e5ac84505379 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:27:13 -0700
Subject: [PATCH 089/133] copy
---
.../website/_posts/2025-05-07-gemini-cost.md | 48 ++++++++++---------
1 file changed, 26 insertions(+), 22 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-cost.md b/aider/website/_posts/2025-05-07-gemini-cost.md
index 995c726ef..b9ce35952 100644
--- a/aider/website/_posts/2025-05-07-gemini-cost.md
+++ b/aider/website/_posts/2025-05-07-gemini-cost.md
@@ -10,32 +10,24 @@ nav_exclude: true
# Gemini 2.5 Pro Preview 03-25 benchmark cost
+## Summary
The $6.32 cost reported to run the aider polyglot benchmark on
Gemini 2.5 Pro Preview 03-25 was incorrect.
The true cost was higher, possibly significantly so.
-This note shares the results of an audit and root cause analysis
-relating to this error.
+The incorrect cost has been removed from the leaderboard.
-Two possible causes were identified, both related to the litellm package that
-aider uses to connect to LLM APIs:
+An investigation determined the primary cause was that the litellm
+package (used by aider for LLM API connections) was not properly including reasoning tokens in
+the token counts it
+reported to aider.
-- The litellm model database had an incorrect price-per-token for Gemini 2.5 Pro Preview 03-25 in their costs database.
-This does not appear to be a contributing factor to the incorrect benchmark cost.
-- The litellm package was excluding reasoning tokens from the token counts it reported to aider. This appears to be the cause of the incorrect benchmark cost.
+While an incorrect price-per-token entry for the model also existed in litellm's cost
+database at that time, this was found not to be a contributing factor.
+Aider's own internal, correct pricing data was utilized during the benchmark.
-The incorrect litellm database entry does not appear to have affected the aider benchmark costs.
-Aider maintains and uses its own database of costs for some models, and it contained
-the correct pricing at the time of the benchmark.
-Aider appears to have
-loaded the correct cost data from its database and made use of it during the benchmark.
+## Resolution
-The version of litellm available at that time appears to have been
-excluding reasoning tokens from the token counts it reported.
-So even though aider had correct per-token pricing, it did not have the correct token counts
-used during the benchmark.
-This resulted in an underestimate of the benchmark costs.
-
-Litellm began including reasoning tokens in the reported counts
+Litellm began correctly including reasoning tokens in the reported counts
on April 21, 2025 in
commit [a7db0df](https://github.com/BerriAI/litellm/commit/a7db0df0434bfbac2b68ebe1c343b77955becb4b).
This change was released in litellm v1.67.1.
@@ -51,7 +43,19 @@ so it is not possible to re-run the benchmark to obtain an accurate cost.
As a possibly relevant comparison, the newer 05-06 version of Gemini 2.5 Pro Preview
completed the benchmark at a cost of about $38.
-# Investigation
+## Investigation detail
+
+The version of litellm available at that time appears to have been
+excluding reasoning tokens from the token counts it reported.
+So even though aider had correct per-token pricing, it did not have the correct token counts
+used during the benchmark.
+This resulted in an underestimate of the benchmark costs.
+
+The incorrect litellm database entry does not appear to have affected the aider benchmark costs.
+Aider maintains and uses its own database of costs for some models, and it contained
+the correct pricing at the time of the benchmark.
+Aider appears to have
+loaded the correct cost data from its database and made use of it during the benchmark.
Every aider benchmark report contains the git commit hash of the aider repository state used to
run the benchmark.
@@ -68,11 +72,11 @@ model cost database appears not to have been a factor:
- Updating aider's local model database with an absurdly high token cost resulted in an appropriately high benchmark cost report, demonstrating that the local database costs were in effect.
This specific build of aider was then updated with various versions of litellm using `git biset`
-to identify the first litellm commit where reasoning tokens counts were reported.
+to identify the first litellm commit where reasoning tokens counts were correctly reported.
-# Timeline
+## Timeline
Below is the full timeline of git commits related to this issue in the aider and litellm repositories.
Each entry has a UTC timestamp, followed by the original literal timestamp obtained from the
From 4d9f4e02020c907544b40e8975d6b2e76760bc1f Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:31:40 -0700
Subject: [PATCH 090/133] copy
---
aider/website/_posts/2025-05-07-gemini-cost.md | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-cost.md b/aider/website/_posts/2025-05-07-gemini-cost.md
index b9ce35952..ca3fd877e 100644
--- a/aider/website/_posts/2025-05-07-gemini-cost.md
+++ b/aider/website/_posts/2025-05-07-gemini-cost.md
@@ -18,9 +18,7 @@ The incorrect cost has been removed from the leaderboard.
An investigation determined the primary cause was that the litellm
package (used by aider for LLM API connections) was not properly including reasoning tokens in
-the token counts it
-reported to aider.
-
+the token counts it reported.
While an incorrect price-per-token entry for the model also existed in litellm's cost
database at that time, this was found not to be a contributing factor.
Aider's own internal, correct pricing data was utilized during the benchmark.
@@ -36,12 +34,10 @@ from v1.65.7 to v1.67.4.post1
in commit [9351f37](https://github.com/Aider-AI/aider/commit/9351f37).
That dependency change shipped on May 5, 2025 in aider v0.82.3.
-The incorrect cost has been removed from the leaderboard.
Unfortunately the 03-25 version of Gemini 2.5 Pro Preview is no longer available,
so it is not possible to re-run the benchmark to obtain an accurate cost.
-
As a possibly relevant comparison, the newer 05-06 version of Gemini 2.5 Pro Preview
-completed the benchmark at a cost of about $38.
+completed the benchmark at a cost of about $37.
## Investigation detail
From b6587de38973fba34cee7807252b5d421959804f Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:38:50 -0700
Subject: [PATCH 091/133] chore: Update polyglot leaderboard data
---
aider/website/_data/polyglot_leaderboard.yml | 25 ++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 6052fa1c8..292454207 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1225,3 +1225,28 @@
seconds_per_case: 50.1
total_cost: 1.8451
+- dirname: 2025-05-07-19-32-40--gemini0506-diff-fenced-completion_cost
+ test_cases: 225
+ model: Gemini 2.5 Pro Preview 05-06
+ edit_format: diff-fenced
+ commit_hash: 3b08327-dirty
+ pass_rate_1: 36.4
+ pass_rate_2: 76.9
+ pass_num_1: 82
+ pass_num_2: 173
+ percent_cases_well_formed: 97.3
+ error_outputs: 15
+ num_malformed_responses: 7
+ num_with_malformed_responses: 6
+ user_asks: 105
+ lazy_comments: 0
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 0
+ test_timeouts: 2
+ total_tests: 225
+ command: aider --model gemini/gemini-2.5-pro-preview-03-25
+ date: 2025-05-07
+ versions: 0.82.4.dev
+ seconds_per_case: 165.3
+ total_cost: 37.4104
\ No newline at end of file
From 5ff3d1a0c5461579951c70f4e36f4d498ac6189e Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:40:40 -0700
Subject: [PATCH 092/133] feat: Update Gemini model aliases to 05-06 preview
---
aider/models.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index dd0abd452..3cb0a5c5c 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -91,8 +91,8 @@ MODEL_ALIASES = {
"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",
- "gemini": "gemini/gemini-2.5-pro-preview-03-25",
+ "gemini-2.5-pro": "gemini/gemini-2.5-pro-preview-05-06",
+ "gemini": "gemini/gemini-2.5-pro-preview-05-06",
"gemini-exp": "gemini/gemini-2.5-pro-exp-03-25",
"grok3": "xai/grok-3-beta",
"optimus": "openrouter/openrouter/optimus-alpha",
From eabc98b64ad10fea3df08a4cf22b3436876c0420 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 13:57:24 -0700
Subject: [PATCH 093/133] copy
---
aider/website/_posts/2025-05-07-gemini-cost.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-cost.md b/aider/website/_posts/2025-05-07-gemini-cost.md
index ca3fd877e..c54c18e05 100644
--- a/aider/website/_posts/2025-05-07-gemini-cost.md
+++ b/aider/website/_posts/2025-05-07-gemini-cost.md
@@ -63,9 +63,9 @@ commit [0282574](https://github.com/Aider-AI/aider/commit/0282574).
Additional runs of the benchmark from that build verified that the error in litellm's
model cost database appears not to have been a factor:
-- Aider's local model database correctly overrides the litellm database, which contained an incorrect token cost at the time.
-- The correct pricing is loaded from aider's local model database and produces similar (incorrect) costs as the original run.
-- Updating aider's local model database with an absurdly high token cost resulted in an appropriately high benchmark cost report, demonstrating that the local database costs were in effect.
+- Aider's internal model database correctly overrides the litellm database, which contained an incorrect token cost at the time.
+- The correct pricing is loaded from aider's internal model database and produces similar (incorrect) costs as the original run.
+- Updating aider's internal model database with an absurdly high token cost resulted in an appropriately high benchmark cost report, demonstrating that the internal database costs were in effect.
This specific build of aider was then updated with various versions of litellm using `git biset`
to identify the first litellm commit where reasoning tokens counts were correctly reported.
From 9660d95ceb04be4611ed1cdb0415c3a36a755b6c Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 16:04:57 -0700
Subject: [PATCH 094/133] feat: Support thinking_tokens and reasoning_effort
for OpenRouter models
---
aider/models.py | 41 ++++++++++++++++++++++++++++++-----------
1 file changed, 30 insertions(+), 11 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index dd0abd452..3c790c644 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -332,6 +332,15 @@ class Model(ModelSettings):
# For non-dict values, simply update
self.extra_params[key] = value
+ # Ensure OpenRouter models accept thinking_tokens and reasoning_effort
+ if self.name.startswith("openrouter/"):
+ if self.accepts_settings is None:
+ self.accepts_settings = []
+ if "thinking_tokens" not in self.accepts_settings:
+ self.accepts_settings.append("thinking_tokens")
+ if "reasoning_effort" not in self.accepts_settings:
+ self.accepts_settings.append("reasoning_effort")
+
def apply_generic_model_settings(self, model):
if "/o3-mini" in model:
self.edit_format = "diff"
@@ -659,11 +668,16 @@ class Model(ModelSettings):
def set_reasoning_effort(self, effort):
"""Set the reasoning effort parameter for models that support it"""
if effort is not None:
- if not self.extra_params:
- self.extra_params = {}
- if "extra_body" not in self.extra_params:
- self.extra_params["extra_body"] = {}
- self.extra_params["extra_body"]["reasoning_effort"] = effort
+ if self.name.startswith("openrouter/"):
+ if not self.extra_params:
+ self.extra_params = {}
+ self.extra_params["reasoning"] = {"effort": effort}
+ else:
+ if not self.extra_params:
+ self.extra_params = {}
+ if "extra_body" not in self.extra_params:
+ self.extra_params["extra_body"] = {}
+ self.extra_params["extra_body"]["reasoning_effort"] = effort
def parse_token_value(self, value):
"""
@@ -750,12 +764,17 @@ class Model(ModelSettings):
def get_reasoning_effort(self):
"""Get reasoning effort value if available"""
- if (
- self.extra_params
- and "extra_body" in self.extra_params
- and "reasoning_effort" in self.extra_params["extra_body"]
- ):
- return self.extra_params["extra_body"]["reasoning_effort"]
+ if self.extra_params:
+ # Check for OpenRouter reasoning format
+ if self.name.startswith("openrouter/"):
+ if "reasoning" in self.extra_params and "effort" in self.extra_params["reasoning"]:
+ return self.extra_params["reasoning"]["effort"]
+ # Check for standard reasoning_effort format (e.g. in extra_body)
+ elif (
+ "extra_body" in self.extra_params
+ and "reasoning_effort" in self.extra_params["extra_body"]
+ ):
+ return self.extra_params["extra_body"]["reasoning_effort"]
return None
def is_deepseek_r1(self):
From a61fb1e23bcc14c143c6545199ebf6559e784ce8 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 16:07:19 -0700
Subject: [PATCH 095/133] refactor: Move OpenRouter reasoning params to
extra_body
---
aider/models.py | 26 +++++++++++++++++++-------
1 file changed, 19 insertions(+), 7 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index 3c790c644..62e807e8b 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -671,14 +671,15 @@ class Model(ModelSettings):
if self.name.startswith("openrouter/"):
if not self.extra_params:
self.extra_params = {}
- self.extra_params["reasoning"] = {"effort": effort}
+ if "extra_body" not in self.extra_params:
+ self.extra_params["extra_body"] = {}
+ self.extra_params["extra_body"]["reasoning"] = {"effort": effort}
else:
if not self.extra_params:
self.extra_params = {}
if "extra_body" not in self.extra_params:
self.extra_params["extra_body"] = {}
self.extra_params["extra_body"]["reasoning_effort"] = effort
-
def parse_token_value(self, value):
"""
Parse a token value string into an integer.
@@ -723,7 +724,9 @@ class Model(ModelSettings):
# OpenRouter models use 'reasoning' instead of 'thinking'
if self.name.startswith("openrouter/"):
- self.extra_params["reasoning"] = {"max_tokens": num_tokens}
+ if "extra_body" not in self.extra_params:
+ self.extra_params["extra_body"] = {}
+ self.extra_params["extra_body"]["reasoning"] = {"max_tokens": num_tokens}
else:
self.extra_params["thinking"] = {"type": "enabled", "budget_tokens": num_tokens}
@@ -733,8 +736,13 @@ class Model(ModelSettings):
if self.extra_params:
# Check for OpenRouter reasoning format
- if "reasoning" in self.extra_params and "max_tokens" in self.extra_params["reasoning"]:
- budget = self.extra_params["reasoning"]["max_tokens"]
+ if self.name.startswith("openrouter/"):
+ if (
+ "extra_body" in self.extra_params
+ and "reasoning" in self.extra_params["extra_body"]
+ and "max_tokens" in self.extra_params["extra_body"]["reasoning"]
+ ):
+ budget = self.extra_params["extra_body"]["reasoning"]["max_tokens"]
# Check for standard thinking format
elif (
"thinking" in self.extra_params and "budget_tokens" in self.extra_params["thinking"]
@@ -767,8 +775,12 @@ class Model(ModelSettings):
if self.extra_params:
# Check for OpenRouter reasoning format
if self.name.startswith("openrouter/"):
- if "reasoning" in self.extra_params and "effort" in self.extra_params["reasoning"]:
- return self.extra_params["reasoning"]["effort"]
+ if (
+ "extra_body" in self.extra_params
+ and "reasoning" in self.extra_params["extra_body"]
+ and "effort" in self.extra_params["extra_body"]["reasoning"]
+ ):
+ return self.extra_params["extra_body"]["reasoning"]["effort"]
# Check for standard reasoning_effort format (e.g. in extra_body)
elif (
"extra_body" in self.extra_params
From c756b080e851fbdd1f4483a6f50c24c8a06911e3 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 16:07:23 -0700
Subject: [PATCH 096/133] style: Run linter on aider/models.py
---
aider/models.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/aider/models.py b/aider/models.py
index 62e807e8b..6c5562cd9 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -680,6 +680,7 @@ class Model(ModelSettings):
if "extra_body" not in self.extra_params:
self.extra_params["extra_body"] = {}
self.extra_params["extra_body"]["reasoning_effort"] = effort
+
def parse_token_value(self, value):
"""
Parse a token value string into an integer.
From 96899a140bb60b30dd6e030f670bd470c3e18abb Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 16:19:19 -0700
Subject: [PATCH 097/133] bump deps
---
requirements.txt | 12 ++++++++----
requirements/common-constraints.txt | 14 ++++++++------
requirements/requirements-dev.txt | 6 +++---
requirements/requirements-help.txt | 8 ++++++--
4 files changed, 25 insertions(+), 15 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index 8fdd901f4..31a3c058f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -116,7 +116,7 @@ google-api-python-client==2.169.0
# via
# -c requirements/common-constraints.txt
# google-generativeai
-google-auth==2.40.0
+google-auth==2.40.1
# via
# -c requirements/common-constraints.txt
# google-ai-generativelanguage
@@ -154,6 +154,10 @@ h11==0.16.0
# via
# -c requirements/common-constraints.txt
# httpcore
+hf-xet==1.1.0
+ # via
+ # -c requirements/common-constraints.txt
+ # huggingface-hub
httpcore==1.0.9
# via
# -c requirements/common-constraints.txt
@@ -168,7 +172,7 @@ httpx==0.28.1
# -c requirements/common-constraints.txt
# litellm
# openai
-huggingface-hub==0.30.2
+huggingface-hub==0.31.1
# via
# -c requirements/common-constraints.txt
# tokenizers
@@ -209,7 +213,7 @@ jsonschema-specifications==2025.4.1
# via
# -c requirements/common-constraints.txt
# jsonschema
-litellm==1.68.0
+litellm==1.68.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -462,7 +466,7 @@ tree-sitter-embedded-template==0.23.2
# via
# -c requirements/common-constraints.txt
# tree-sitter-language-pack
-tree-sitter-language-pack==0.7.2
+tree-sitter-language-pack==0.7.3
# via
# -c requirements/common-constraints.txt
# grep-ast
diff --git a/requirements/common-constraints.txt b/requirements/common-constraints.txt
index 0f0d09910..dff981b3e 100644
--- a/requirements/common-constraints.txt
+++ b/requirements/common-constraints.txt
@@ -131,7 +131,7 @@ google-api-core[grpc]==2.24.2
# google-generativeai
google-api-python-client==2.169.0
# via google-generativeai
-google-auth==2.40.0
+google-auth==2.40.1
# via
# google-ai-generativelanguage
# google-api-core
@@ -172,6 +172,8 @@ grpcio-status==1.71.0
# via google-api-core
h11==0.16.0
# via httpcore
+hf-xet==1.1.0
+ # via huggingface-hub
httpcore==1.0.9
# via httpx
httplib2==0.22.0
@@ -183,7 +185,7 @@ httpx==0.28.1
# litellm
# llama-index-core
# openai
-huggingface-hub[inference]==0.30.2
+huggingface-hub[inference]==0.31.1
# via
# llama-index-embeddings-huggingface
# sentence-transformers
@@ -231,7 +233,7 @@ jsonschema-specifications==2025.4.1
# via jsonschema
kiwisolver==1.4.8
# via matplotlib
-litellm==1.68.0
+litellm==1.68.1
# via -r requirements/requirements.in
llama-index-core==0.12.26
# via
@@ -330,7 +332,7 @@ pip==25.1.1
# pip-tools
pip-tools==7.4.1
# via -r requirements/requirements-dev.in
-platformdirs==4.3.7
+platformdirs==4.3.8
# via
# banks
# virtualenv
@@ -546,7 +548,7 @@ tree-sitter-c-sharp==0.23.1
# via tree-sitter-language-pack
tree-sitter-embedded-template==0.23.2
# via tree-sitter-language-pack
-tree-sitter-language-pack==0.7.2
+tree-sitter-language-pack==0.7.3
# via grep-ast
tree-sitter-yaml==0.7.0
# via tree-sitter-language-pack
@@ -586,7 +588,7 @@ urllib3==2.4.0
# via
# mixpanel
# requests
-uv==0.7.2
+uv==0.7.3
# via -r requirements/requirements-dev.in
virtualenv==20.31.1
# via pre-commit
diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt
index b0cf358d1..fc05acc51 100644
--- a/requirements/requirements-dev.txt
+++ b/requirements/requirements-dev.txt
@@ -63,7 +63,7 @@ google-api-core[grpc]==2.24.2
# -c requirements/common-constraints.txt
# google-cloud-bigquery
# google-cloud-core
-google-auth==2.40.0
+google-auth==2.40.1
# via
# -c requirements/common-constraints.txt
# google-api-core
@@ -176,7 +176,7 @@ pip-tools==7.4.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
-platformdirs==4.3.7
+platformdirs==4.3.8
# via
# -c requirements/common-constraints.txt
# virtualenv
@@ -297,7 +297,7 @@ urllib3==2.4.0
# via
# -c requirements/common-constraints.txt
# requests
-uv==0.7.2
+uv==0.7.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
diff --git a/requirements/requirements-help.txt b/requirements/requirements-help.txt
index 8305671fb..b930a01ff 100644
--- a/requirements/requirements-help.txt
+++ b/requirements/requirements-help.txt
@@ -93,6 +93,10 @@ h11==0.16.0
# via
# -c requirements/common-constraints.txt
# httpcore
+hf-xet==1.1.0
+ # via
+ # -c requirements/common-constraints.txt
+ # huggingface-hub
httpcore==1.0.9
# via
# -c requirements/common-constraints.txt
@@ -101,7 +105,7 @@ httpx==0.28.1
# via
# -c requirements/common-constraints.txt
# llama-index-core
-huggingface-hub[inference]==0.30.2
+huggingface-hub[inference]==0.31.1
# via
# -c requirements/common-constraints.txt
# llama-index-embeddings-huggingface
@@ -187,7 +191,7 @@ pillow==11.2.1
# -c requirements/common-constraints.txt
# llama-index-core
# sentence-transformers
-platformdirs==4.3.7
+platformdirs==4.3.8
# via
# -c requirements/common-constraints.txt
# banks
From 94197cb25d24cdbe59a43935addbb1db4148eb94 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 16:32:57 -0700
Subject: [PATCH 098/133] feat: Add model settings for
openrouter/google/gemini-2.5-pro-preview-03-25
---
aider/resources/model-settings.yml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 273e77621..8a7567d49 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1386,3 +1386,9 @@
edit_format: diff
use_repo_map: true
accepts_settings: ["thinking_tokens"]
+
+- name: openrouter/google/gemini-2.5-pro-preview-03-25
+ edit_format: diff-fenced
+ use_repo_map: true
+ weak_model_name: openrouter/google/gemini-2.0-flash-001
+
\ No newline at end of file
From 60a1a3a8c80fc39cde1a0890fb6f0b82ac1bdf10 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 16:44:15 -0700
Subject: [PATCH 099/133] drop pip, bump deps
---
requirements.txt | 16 ++++++----------
requirements/common-constraints.txt | 8 +++++---
requirements/requirements.in | 1 -
3 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index 6aebb7322..52137b7e8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -237,12 +237,10 @@ mixpanel==4.10.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
-monotonic==1.6
+mslex==1.3.0
# via
# -c requirements/common-constraints.txt
- # posthog
-mslex==1.3.0
- # via oslex
+ # oslex
multidict==6.4.3
# via
# -c requirements/common-constraints.txt
@@ -262,7 +260,9 @@ openai==1.75.0
# -c requirements/common-constraints.txt
# litellm
oslex==0.1.3
- # via -r requirements/requirements.in
+ # via
+ # -c requirements/common-constraints.txt
+ # -r requirements/requirements.in
packaging==24.2
# via
# -c requirements/common-constraints.txt
@@ -281,10 +281,6 @@ pillow==11.2.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
-pip==25.1.1
- # via
- # -c requirements/common-constraints.txt
- # -r requirements/requirements.in
posthog==4.0.1
# via
# -c requirements/common-constraints.txt
@@ -523,6 +519,6 @@ zipp==3.21.0
# via
# -c requirements/common-constraints.txt
# importlib-metadata
-
+
tree-sitter==0.23.2; python_version < "3.10"
tree-sitter==0.24.0; python_version >= "3.10"
diff --git a/requirements/common-constraints.txt b/requirements/common-constraints.txt
index dff981b3e..aaf158695 100644
--- a/requirements/common-constraints.txt
+++ b/requirements/common-constraints.txt
@@ -259,6 +259,8 @@ mixpanel==4.10.1
# via -r requirements/requirements.in
mpmath==1.3.0
# via sympy
+mslex==1.3.0
+ # via oslex
multidict==6.4.3
# via
# aiohttp
@@ -295,6 +297,8 @@ numpy==1.26.4
# transformers
openai==1.75.0
# via litellm
+oslex==0.1.3
+ # via -r requirements/requirements.in
packaging==24.2
# via
# -r requirements/requirements.in
@@ -327,9 +331,7 @@ pillow==11.2.1
# sentence-transformers
# streamlit
pip==25.1.1
- # via
- # -r requirements/requirements.in
- # pip-tools
+ # via pip-tools
pip-tools==7.4.1
# via -r requirements/requirements-dev.in
platformdirs==4.3.8
diff --git a/requirements/requirements.in b/requirements/requirements.in
index 1d3e7d895..6ddde184b 100644
--- a/requirements/requirements.in
+++ b/requirements/requirements.in
@@ -26,7 +26,6 @@ json5
psutil
watchfiles
socksio
-pip
pillow
oslex
google-generativeai
From 4ec075d29082d5b8f9084f786f596de119b67cc5 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 16:44:40 -0700
Subject: [PATCH 100/133] copy
---
aider/website/assets/sample-analytics.jsonl | 224 +++++++++---------
.../website/docs/config/adv-model-settings.md | 5 +
aider/website/docs/faq.md | 13 +-
3 files changed, 123 insertions(+), 119 deletions(-)
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 6be794fac..5127072c9 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,115 +1,3 @@
-{"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}
-{"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}
@@ -998,3 +886,115 @@
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746645861}
{"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": 6524, "completion_tokens": 387, "total_tokens": 6911, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746645888}
{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746646177}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746648919}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746648919}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746648919}
+{"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": 1746648919}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746648920}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746648930}
+{"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": 6568, "completion_tokens": 1043, "total_tokens": 7611, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746648961}
+{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649323}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649324}
+{"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": 6657, "completion_tokens": 916, "total_tokens": 7573, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649392}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649626}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649652}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649652}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649652}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649652}
+{"event": "message_send", "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": "ask", "prompt_tokens": 8704, "completion_tokens": 336, "total_tokens": 9040, "cost": 0.014240000000000001, "total_cost": 0.014240000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649669}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746649669}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650326}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650327}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650327}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650330}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650397}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650399}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650401}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650401}
+{"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": 1746650401}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650403}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650416}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650421}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650422}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650422}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650422}
+{"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": 8240, "completion_tokens": 10, "total_tokens": 8250, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650427}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650427}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650437}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650437}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650437}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746650440}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657288}
+{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657291}
+{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657297}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657300}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657302}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657302}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657302}
+{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 605, "completion_tokens": 362, "total_tokens": 967, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657321}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657321}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657326}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657328}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657328}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657328}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657334}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657340}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657342}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657342}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657342}
+{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 605, "completion_tokens": 300, "total_tokens": 905, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657355}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657355}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657389}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657391}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657391}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657391}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657397}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657459}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657462}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657462}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657462}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657473}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657474}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657476}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657476}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657476}
+{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 605, "completion_tokens": 40, "total_tokens": 645, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657481}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657481}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657535}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657537}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657537}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657537}
+{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 605, "completion_tokens": 214, "total_tokens": 819, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657541}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746657541}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746658868}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746658868}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746658868}
+{"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": 1746658868}
+{"event": "command_edit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746658873}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746658947}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746658947}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659079}
+{"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": 40797, "completion_tokens": 630, "total_tokens": 41427, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659096}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659220}
+{"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": 41689, "completion_tokens": 808, "total_tokens": 42497, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659238}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659274}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659277}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659277}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659277}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659279}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659294}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659296}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659296}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659296}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659297}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659303}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659305}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659305}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659305}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659310}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659316}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746659316}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660773}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660774}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660774}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660777}
diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md
index 65c48c993..b1a683b61 100644
--- a/aider/website/docs/config/adv-model-settings.md
+++ b/aider/website/docs/config/adv-model-settings.md
@@ -1222,6 +1222,11 @@ cog.out("```\n")
use_repo_map: true
overeager: true
+- name: openrouter/google/gemini-2.5-pro-preview-03-25
+ edit_format: diff-fenced
+ weak_model_name: openrouter/google/gemini-2.0-flash-001
+ use_repo_map: true
+
- name: openrouter/google/gemma-3-27b-it
use_system_prompt: false
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index 88da6a54f..856713cb0 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -264,14 +264,13 @@ tr:hover { background-color: #f5f5f5; }
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 1,588,028 | 70.8% |
-gemini/gemini-2.5-pro-preview-03-25 | 432,979 | 19.3% |
-o3 | 138,842 | 6.2% |
-openrouter/anthropic/claude-3.7-sonnet | 41,017 | 1.8% |
-gemini/gemini-2.5-flash-preview-04-17 | 18,645 | 0.8% |
-xai/grok-3-fast-beta | 10,288 | 0.5% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,315,564 | 67.0% |
+gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 22.5% |
+o3 | 138,842 | 7.1% |
+openrouter/anthropic/claude-3.7-sonnet | 41,017 | 2.1% |
+gemini/gemini-2.5-flash-preview-04-17 | 10,305 | 0.5% |
gemini/gemini-2.5-pro-preview-05-06 | 8,576 | 0.4% |
-openrouter/REDACTED | 2,201 | 0.1% |
+openrouter/REDACTED | 5,537 | 0.3% |
gemini/REDACTED | 1,989 | 0.1% |
From c72e5fcc5e16f8755e4214c46e1751a4df52dea8 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 16:53:18 -0700
Subject: [PATCH 101/133] feat: Improve history, faq, and linter tests for
Windows and special chars
---
HISTORY.md | 10 ++++++++++
aider/website/HISTORY.md | 10 ++++++++++
aider/website/assets/sample-analytics.jsonl | 12 +++++------
aider/website/docs/faq.md | 6 +++---
tests/basic/test_linter.py | 22 +++++++++++++++++++++
5 files changed, 51 insertions(+), 9 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index 92530ea68..d04306507 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -13,6 +13,16 @@
- Add common file types (`.svg`, `.pdf`) to the default list of ignored files for AI comment scanning (`--watch`).
- Skip scanning files larger than 1MB for AI comments (`--watch`).
- Aider wrote 67% of the code in this release.
+### main branch
+
+- Set development version to 0.82.4.dev.
+- Improved cost calculation using `litellm.completion_cost` where available.
+- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
+- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
+- Added support for `gemini-2.5-pro-preview-05-06` models.
+- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
+- Aider wrote 67% of the code in this release.
+
### Aider v0.82.2
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index 82a2527a1..cc39db23b 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -37,6 +37,16 @@ cog.out(text)
- Add common file types (`.svg`, `.pdf`) to the default list of ignored files for AI comment scanning (`--watch`).
- Skip scanning files larger than 1MB for AI comments (`--watch`).
- Aider wrote 67% of the code in this release.
+### main branch
+
+- Set development version to 0.82.4.dev.
+- Improved cost calculation using `litellm.completion_cost` where available.
+- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
+- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
+- Added support for `gemini-2.5-pro-preview-05-06` models.
+- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
+- Aider wrote 67% of the code in this release.
+
### Aider v0.82.2
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index 5127072c9..c90524869 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,9 +1,3 @@
-{"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}
@@ -998,3 +992,9 @@
{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660774}
{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660774}
{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660777}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684}
+{"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": 6018, "completion_tokens": 231, "total_tokens": 6249, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661749}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661749}
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index 856713cb0..871a030b0 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,315,564 | 67.0% |
-gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 22.5% |
-o3 | 138,842 | 7.1% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,321,813 | 67.1% |
+gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 22.4% |
+o3 | 138,842 | 7.0% |
openrouter/anthropic/claude-3.7-sonnet | 41,017 | 2.1% |
gemini/gemini-2.5-flash-preview-04-17 | 10,305 | 0.5% |
gemini/gemini-2.5-pro-preview-05-06 | 8,576 | 0.4% |
diff --git a/tests/basic/test_linter.py b/tests/basic/test_linter.py
index 60132b565..46b02a367 100644
--- a/tests/basic/test_linter.py
+++ b/tests/basic/test_linter.py
@@ -41,6 +41,7 @@ class TestLinter(unittest.TestCase):
if os.name != "nt":
self.skipTest("This test only runs on Windows")
from pathlib import Path
+
root = Path(__file__).parent.parent.parent.absolute().as_posix()
linter = Linter(encoding="utf-8", root=root)
result = linter.run_cmd("dir", "tests\\basic", "code")
@@ -57,6 +58,27 @@ class TestLinter(unittest.TestCase):
self.assertIsNotNone(result)
self.assertIn("Error message", result.text)
+ def test_run_cmd_with_special_chars(self):
+ with patch("subprocess.Popen") as mock_popen:
+ mock_process = MagicMock()
+ mock_process.returncode = 1
+ mock_process.stdout.read.side_effect = ("Error message", None)
+ mock_popen.return_value = mock_process
+
+ # Test with a file path containing special characters
+ special_path = "src/(main)/product/[id]/page.tsx"
+ result = self.linter.run_cmd("eslint", special_path, "code")
+
+ # Verify that the command was constructed correctly
+ mock_popen.assert_called_once()
+ call_args = mock_popen.call_args[0][0]
+
+ self.assertIn(special_path, call_args)
+
+ # The result should contain the error message
+ self.assertIsNotNone(result)
+ self.assertIn("Error message", result.text)
+
if __name__ == "__main__":
unittest.main()
From 1167700a53580d8ce4cb5f489a60140b418306b2 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 17:09:05 -0700
Subject: [PATCH 102/133] copy
---
HISTORY.md | 22 +++----
aider/website/HISTORY.md | 22 +++----
aider/website/assets/sample-analytics.jsonl | 68 ++++++++++-----------
aider/website/assets/sample.aider.conf.yml | 11 ++--
aider/website/assets/sample.env | 11 ++--
aider/website/docs/config/aider_conf.md | 11 ++--
aider/website/docs/config/dotenv.md | 11 ++--
aider/website/docs/config/options.md | 15 +++--
aider/website/docs/faq.md | 6 +-
9 files changed, 98 insertions(+), 79 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index d04306507..846f0b08f 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,5 +1,16 @@
# Release history
+### main branch
+
+- Set development version to 0.82.4.dev.
+- Improved cost calculation using `litellm.completion_cost` where available.
+- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
+- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
+- Added support for `gemini-2.5-pro-preview-05-06` models.
+- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
+ Introduced `--attribute-co-authored-by` option to add a `Co-authored-by: aider () ` trailer to AI-generated commits. This setting takes precedence over default author/committer name modifications unless `--attribute-author` or `--attribute-committer` are explicitly set to true, by Andrew Grigorev.
+ Aider wrote 55% of the code in this release.
+
### Aider v0.82.3
- Add support for `gemini-2.5-flash-preview-04-17` models.
@@ -12,17 +23,6 @@
- Set Gemini 2.5 Pro models to use the `overeager` prompt setting by default.
- Add common file types (`.svg`, `.pdf`) to the default list of ignored files for AI comment scanning (`--watch`).
- Skip scanning files larger than 1MB for AI comments (`--watch`).
-- Aider wrote 67% of the code in this release.
-### main branch
-
-- Set development version to 0.82.4.dev.
-- Improved cost calculation using `litellm.completion_cost` where available.
-- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
-- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
-- Added support for `gemini-2.5-pro-preview-05-06` models.
-- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
-- Aider wrote 67% of the code in this release.
-
### Aider v0.82.2
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index cc39db23b..5adf61ec8 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -24,6 +24,17 @@ cog.out(text)
]]]-->
+### main branch
+
+- Set development version to 0.82.4.dev.
+- Improved cost calculation using `litellm.completion_cost` where available.
+- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
+- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
+- Added support for `gemini-2.5-pro-preview-05-06` models.
+- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
+ Introduced `--attribute-co-authored-by` option to add a `Co-authored-by: aider () ` trailer to AI-generated commits. This setting takes precedence over default author/committer name modifications unless `--attribute-author` or `--attribute-committer` are explicitly set to true, by Andrew Grigorev.
+ Aider wrote 55% of the code in this release.
+
### Aider v0.82.3
- Add support for `gemini-2.5-flash-preview-04-17` models.
@@ -36,17 +47,6 @@ cog.out(text)
- Set Gemini 2.5 Pro models to use the `overeager` prompt setting by default.
- Add common file types (`.svg`, `.pdf`) to the default list of ignored files for AI comment scanning (`--watch`).
- Skip scanning files larger than 1MB for AI comments (`--watch`).
-- Aider wrote 67% of the code in this release.
-### main branch
-
-- Set development version to 0.82.4.dev.
-- Improved cost calculation using `litellm.completion_cost` where available.
-- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
-- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
-- Added support for `gemini-2.5-pro-preview-05-06` models.
-- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
-- Aider wrote 67% of the code in this release.
-
### Aider v0.82.2
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index c90524869..b0c5cc2d0 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,37 +1,3 @@
-{"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}
@@ -998,3 +964,37 @@
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684}
{"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": 6018, "completion_tokens": 231, "total_tokens": 6249, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661749}
{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661749}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661993}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661993}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661993}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661998}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662225}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662225}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662225}
+{"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": 1746662226}
+{"event": "command_edit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662230}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662273}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662273}
+{"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": 14331, "completion_tokens": 2421, "total_tokens": 16752, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662373}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662390}
+{"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": 17412, "completion_tokens": 2765, "total_tokens": 20177, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662420}
+{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662480}
+{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662488}
+{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662513}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662513}
+{"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": 23117, "completion_tokens": 1083, "total_tokens": 24200, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662558}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662591}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662601}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662606}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662610}
+{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662701}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662833}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662833}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662833}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662833}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662878}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662879}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662879}
+{"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": 1746662879}
+{"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": 14673, "completion_tokens": 281, "total_tokens": 14954, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662896}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662896}
diff --git a/aider/website/assets/sample.aider.conf.yml b/aider/website/assets/sample.aider.conf.yml
index f5f902c9a..b9c51d5d9 100644
--- a/aider/website/assets/sample.aider.conf.yml
+++ b/aider/website/assets/sample.aider.conf.yml
@@ -224,11 +224,11 @@
## Enable/disable commits when repo is found dirty (default: True)
#dirty-commits: true
-## Attribute aider code changes in the git author name (default: True)
-#attribute-author: true
+## Attribute aider code changes in the git author name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence.
+#attribute-author: xxx
-## Attribute aider commits in the git committer name (default: True)
-#attribute-committer: true
+## Attribute aider commits in the git committer name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence for aider edits.
+#attribute-committer: xxx
## Prefix commit messages with 'aider: ' if aider authored the changes (default: False)
#attribute-commit-message-author: false
@@ -236,6 +236,9 @@
## Prefix all commit messages with 'aider: ' (default: False)
#attribute-commit-message-committer: false
+## Attribute aider edits using the Co-authored-by trailer in the commit message (default: False). If True, this takes precedence over default --attribute-author and --attribute-committer behavior unless they are explicitly set to True.
+#attribute-co-authored-by: false
+
## Enable/disable git pre-commit hooks with --no-verify (default: False)
#git-commit-verify: false
diff --git a/aider/website/assets/sample.env b/aider/website/assets/sample.env
index 439e637de..6f694b2cf 100644
--- a/aider/website/assets/sample.env
+++ b/aider/website/assets/sample.env
@@ -213,11 +213,11 @@
## Enable/disable commits when repo is found dirty (default: True)
#AIDER_DIRTY_COMMITS=true
-## Attribute aider code changes in the git author name (default: True)
-#AIDER_ATTRIBUTE_AUTHOR=true
+## Attribute aider code changes in the git author name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence.
+#AIDER_ATTRIBUTE_AUTHOR=
-## Attribute aider commits in the git committer name (default: True)
-#AIDER_ATTRIBUTE_COMMITTER=true
+## Attribute aider commits in the git committer name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence for aider edits.
+#AIDER_ATTRIBUTE_COMMITTER=
## Prefix commit messages with 'aider: ' if aider authored the changes (default: False)
#AIDER_ATTRIBUTE_COMMIT_MESSAGE_AUTHOR=false
@@ -225,6 +225,9 @@
## Prefix all commit messages with 'aider: ' (default: False)
#AIDER_ATTRIBUTE_COMMIT_MESSAGE_COMMITTER=false
+## Attribute aider edits using the Co-authored-by trailer in the commit message (default: False). If True, this takes precedence over default --attribute-author and --attribute-committer behavior unless they are explicitly set to True.
+#AIDER_ATTRIBUTE_CO_AUTHORED_BY=false
+
## Enable/disable git pre-commit hooks with --no-verify (default: False)
#AIDER_GIT_COMMIT_VERIFY=false
diff --git a/aider/website/docs/config/aider_conf.md b/aider/website/docs/config/aider_conf.md
index 40483ae4b..5bb380b14 100644
--- a/aider/website/docs/config/aider_conf.md
+++ b/aider/website/docs/config/aider_conf.md
@@ -278,11 +278,11 @@ cog.outl("```")
## Enable/disable commits when repo is found dirty (default: True)
#dirty-commits: true
-## Attribute aider code changes in the git author name (default: True)
-#attribute-author: true
+## Attribute aider code changes in the git author name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence.
+#attribute-author: xxx
-## Attribute aider commits in the git committer name (default: True)
-#attribute-committer: true
+## Attribute aider commits in the git committer name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence for aider edits.
+#attribute-committer: xxx
## Prefix commit messages with 'aider: ' if aider authored the changes (default: False)
#attribute-commit-message-author: false
@@ -290,6 +290,9 @@ cog.outl("```")
## Prefix all commit messages with 'aider: ' (default: False)
#attribute-commit-message-committer: false
+## Attribute aider edits using the Co-authored-by trailer in the commit message (default: False). If True, this takes precedence over default --attribute-author and --attribute-committer behavior unless they are explicitly set to True.
+#attribute-co-authored-by: false
+
## Enable/disable git pre-commit hooks with --no-verify (default: False)
#git-commit-verify: false
diff --git a/aider/website/docs/config/dotenv.md b/aider/website/docs/config/dotenv.md
index 5a1c616e8..8ef6d3567 100644
--- a/aider/website/docs/config/dotenv.md
+++ b/aider/website/docs/config/dotenv.md
@@ -253,11 +253,11 @@ cog.outl("```")
## Enable/disable commits when repo is found dirty (default: True)
#AIDER_DIRTY_COMMITS=true
-## Attribute aider code changes in the git author name (default: True)
-#AIDER_ATTRIBUTE_AUTHOR=true
+## Attribute aider code changes in the git author name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence.
+#AIDER_ATTRIBUTE_AUTHOR=
-## Attribute aider commits in the git committer name (default: True)
-#AIDER_ATTRIBUTE_COMMITTER=true
+## Attribute aider commits in the git committer name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence for aider edits.
+#AIDER_ATTRIBUTE_COMMITTER=
## Prefix commit messages with 'aider: ' if aider authored the changes (default: False)
#AIDER_ATTRIBUTE_COMMIT_MESSAGE_AUTHOR=false
@@ -265,6 +265,9 @@ cog.outl("```")
## Prefix all commit messages with 'aider: ' (default: False)
#AIDER_ATTRIBUTE_COMMIT_MESSAGE_COMMITTER=false
+## Attribute aider edits using the Co-authored-by trailer in the commit message (default: False). If True, this takes precedence over default --attribute-author and --attribute-committer behavior unless they are explicitly set to True.
+#AIDER_ATTRIBUTE_CO_AUTHORED_BY=false
+
## Enable/disable git pre-commit hooks with --no-verify (default: False)
#AIDER_GIT_COMMIT_VERIFY=false
diff --git a/aider/website/docs/config/options.md b/aider/website/docs/config/options.md
index d07234921..8468c2bc3 100644
--- a/aider/website/docs/config/options.md
+++ b/aider/website/docs/config/options.md
@@ -56,6 +56,7 @@ usage: aider [-h] [--model] [--openai-api-key] [--anthropic-api-key]
[--attribute-committer | --no-attribute-committer]
[--attribute-commit-message-author | --no-attribute-commit-message-author]
[--attribute-commit-message-committer | --no-attribute-commit-message-committer]
+ [--attribute-co-authored-by | --no-attribute-co-authored-by]
[--git-commit-verify | --no-git-commit-verify]
[--commit] [--commit-prompt] [--dry-run | --no-dry-run]
[--skip-sanity-check-repo]
@@ -412,16 +413,14 @@ Aliases:
- `--no-dirty-commits`
### `--attribute-author`
-Attribute aider code changes in the git author name (default: True)
-Default: True
+Attribute aider code changes in the git author name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence.
Environment variable: `AIDER_ATTRIBUTE_AUTHOR`
Aliases:
- `--attribute-author`
- `--no-attribute-author`
### `--attribute-committer`
-Attribute aider commits in the git committer name (default: True)
-Default: True
+Attribute aider commits in the git committer name (default: True). If explicitly set to True, overrides --attribute-co-authored-by precedence for aider edits.
Environment variable: `AIDER_ATTRIBUTE_COMMITTER`
Aliases:
- `--attribute-committer`
@@ -443,6 +442,14 @@ Aliases:
- `--attribute-commit-message-committer`
- `--no-attribute-commit-message-committer`
+### `--attribute-co-authored-by`
+Attribute aider edits using the Co-authored-by trailer in the commit message (default: False). If True, this takes precedence over default --attribute-author and --attribute-committer behavior unless they are explicitly set to True.
+Default: False
+Environment variable: `AIDER_ATTRIBUTE_CO_AUTHORED_BY`
+Aliases:
+ - `--attribute-co-authored-by`
+ - `--no-attribute-co-authored-by`
+
### `--git-commit-verify`
Enable/disable git pre-commit hooks with --no-verify (default: False)
Default: False
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index 871a030b0..c16807ee5 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,321,813 | 67.1% |
-gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 22.4% |
-o3 | 138,842 | 7.0% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,283,258 | 66.4% |
+gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 22.9% |
+o3 | 138,842 | 7.2% |
openrouter/anthropic/claude-3.7-sonnet | 41,017 | 2.1% |
gemini/gemini-2.5-flash-preview-04-17 | 10,305 | 0.5% |
gemini/gemini-2.5-pro-preview-05-06 | 8,576 | 0.4% |
From 765ac2a14d43541980b2899fa98344c4d51f6b4e Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 17:11:03 -0700
Subject: [PATCH 103/133] Feat: Add gemini-2.5-pro-preview-05-06 model entries
---
aider/resources/model-settings.yml | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 8a7567d49..f3dbf2ae0 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1391,4 +1391,22 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
-
\ No newline at end of file
+
+- name: gemini/gemini-2.5-pro-preview-05-06
+ overeager: true
+ edit_format: diff-fenced
+ use_repo_map: true
+ weak_model_name: gemini/gemini-2.0-flash
+
+- name: vertex_ai/gemini-2.5-pro-preview-05-06
+ edit_format: diff-fenced
+ use_repo_map: true
+ weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ overeager: true
+ editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+
+- name: openrouter/google/gemini-2.5-pro-preview-05-06
+ edit_format: diff-fenced
+ use_repo_map: true
+ weak_model_name: openrouter/google/gemini-2.0-flash-001
+
From 84d6cf937bb6b6712da4ded904b841598b45ed6c Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 17:13:36 -0700
Subject: [PATCH 104/133] chore: Mark Gemini 2.5 Pro previews as overeager
---
aider/resources/model-settings.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index f3dbf2ae0..1046023a3 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1388,6 +1388,7 @@
accepts_settings: ["thinking_tokens"]
- name: openrouter/google/gemini-2.5-pro-preview-03-25
+ overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
@@ -1406,6 +1407,7 @@
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- name: openrouter/google/gemini-2.5-pro-preview-05-06
+ overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
From 67cbda3bd50f8d4bd9119d850c30c13db4a17884 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 17:25:29 -0700
Subject: [PATCH 105/133] docs: Explain --attribute-co-authored-by and its
interaction
---
aider/website/docs/git.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/aider/website/docs/git.md b/aider/website/docs/git.md
index 00ee5a272..572e1b703 100644
--- a/aider/website/docs/git.md
+++ b/aider/website/docs/git.md
@@ -71,4 +71,6 @@ Additionally, you can use the following options to prefix commit messages:
- `--attribute-commit-message-author`: Prefix commit messages with 'aider: ' if aider authored the changes.
- `--attribute-commit-message-committer`: Prefix all commit messages with 'aider: ', regardless of whether aider authored the changes or not.
-Both of these options are disabled by default, but can be useful for easily identifying changes made by aider.
+Finally, you can use `--attribute-co-authored-by` to have aider append a Co-authored-by trailer to the end of the commit string.
+This will disable appending `(aider)` to the git author and git committer unless you have explicitly enabled those settings.
+
From 8dd8fb52f4007836884e8308420e94334217966e Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 18:08:00 -0700
Subject: [PATCH 106/133] copy
---
HISTORY.md | 5 +-
aider/website/HISTORY.md | 5 +-
aider/website/assets/sample-analytics.jsonl | 58 +++++++++----------
aider/website/assets/sample.aider.conf.yml | 3 +
aider/website/assets/sample.env | 3 +
.../website/docs/config/adv-model-settings.md | 20 +++++++
aider/website/docs/config/aider_conf.md | 3 +
aider/website/docs/config/dotenv.md | 3 +
aider/website/docs/config/options.md | 12 +++-
aider/website/docs/faq.md | 6 +-
10 files changed, 81 insertions(+), 37 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index 846f0b08f..c2bf06ebe 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -9,7 +9,10 @@
- Added support for `gemini-2.5-pro-preview-05-06` models.
- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
Introduced `--attribute-co-authored-by` option to add a `Co-authored-by: aider () ` trailer to AI-generated commits. This setting takes precedence over default author/committer name modifications unless `--attribute-author` or `--attribute-committer` are explicitly set to true, by Andrew Grigorev.
- Aider wrote 55% of the code in this release.
+ Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
+ Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
+ Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
+ Aider wrote 44% of the code in this release.
### Aider v0.82.3
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index 5adf61ec8..3b3d9d4cc 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -33,7 +33,10 @@ cog.out(text)
- Added support for `gemini-2.5-pro-preview-05-06` models.
- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
Introduced `--attribute-co-authored-by` option to add a `Co-authored-by: aider () ` trailer to AI-generated commits. This setting takes precedence over default author/committer name modifications unless `--attribute-author` or `--attribute-committer` are explicitly set to true, by Andrew Grigorev.
- Aider wrote 55% of the code in this release.
+ Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
+ Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
+ Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
+ Aider wrote 44% of the code in this release.
### Aider v0.82.3
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index b0c5cc2d0..ba787a162 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,32 +1,3 @@
-{"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}
@@ -998,3 +969,32 @@
{"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": 1746662879}
{"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": 14673, "completion_tokens": 281, "total_tokens": 14954, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662896}
{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662896}
+{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662898}
+{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662900}
+{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662909}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746662959}
+{"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": 16375, "completion_tokens": 343, "total_tokens": 16718, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663063}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663153}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663154}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663154}
+{"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": 1746663154}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663170}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663207}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663207}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663212}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663213}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663213}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663216}
+{"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": 11173, "completion_tokens": 947, "total_tokens": 12120, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663253}
+{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663802}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663926}
+{"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663926}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663926}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746663929}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664012}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664482}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664482}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664482}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664482}
+{"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": 19959, "completion_tokens": 176, "total_tokens": 20135, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664554}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664554}
diff --git a/aider/website/assets/sample.aider.conf.yml b/aider/website/assets/sample.aider.conf.yml
index b9c51d5d9..da6956cd5 100644
--- a/aider/website/assets/sample.aider.conf.yml
+++ b/aider/website/assets/sample.aider.conf.yml
@@ -361,6 +361,9 @@
#################
# Other settings:
+## Never prompt for or attempt to install Playwright for web scraping (default: False).
+#disable-playwright: false
+
## specify a file to edit (can be used multiple times)
#file: xxx
## Specify multiple values like this:
diff --git a/aider/website/assets/sample.env b/aider/website/assets/sample.env
index 6f694b2cf..b08bb1a38 100644
--- a/aider/website/assets/sample.env
+++ b/aider/website/assets/sample.env
@@ -342,6 +342,9 @@
#################
# Other settings:
+## Never prompt for or attempt to install Playwright for web scraping (default: False).
+#AIDER_DISABLE_PLAYWRIGHT=false
+
## specify a file to edit (can be used multiple times)
#AIDER_FILE=
diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md
index b1a683b61..e9301d5b5 100644
--- a/aider/website/docs/config/adv-model-settings.md
+++ b/aider/website/docs/config/adv-model-settings.md
@@ -692,6 +692,12 @@ cog.out("```\n")
use_repo_map: true
overeager: true
+- name: gemini/gemini-2.5-pro-preview-05-06
+ edit_format: diff-fenced
+ weak_model_name: gemini/gemini-2.0-flash
+ use_repo_map: true
+ overeager: true
+
- name: gemini/gemini-exp-1114
edit_format: diff
use_repo_map: true
@@ -1226,6 +1232,13 @@ cog.out("```\n")
edit_format: diff-fenced
weak_model_name: openrouter/google/gemini-2.0-flash-001
use_repo_map: true
+ overeager: true
+
+- name: openrouter/google/gemini-2.5-pro-preview-05-06
+ edit_format: diff-fenced
+ weak_model_name: openrouter/google/gemini-2.0-flash-001
+ use_repo_map: true
+ overeager: true
- name: openrouter/google/gemma-3-27b-it
use_system_prompt: false
@@ -1500,6 +1513,13 @@ cog.out("```\n")
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+- name: vertex_ai/gemini-2.5-pro-preview-05-06
+ edit_format: diff-fenced
+ weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ use_repo_map: true
+ overeager: 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
use_repo_map: true
diff --git a/aider/website/docs/config/aider_conf.md b/aider/website/docs/config/aider_conf.md
index 5bb380b14..3eb580bce 100644
--- a/aider/website/docs/config/aider_conf.md
+++ b/aider/website/docs/config/aider_conf.md
@@ -415,6 +415,9 @@ cog.outl("```")
#################
# Other settings:
+## Never prompt for or attempt to install Playwright for web scraping (default: False).
+#disable-playwright: false
+
## specify a file to edit (can be used multiple times)
#file: xxx
## Specify multiple values like this:
diff --git a/aider/website/docs/config/dotenv.md b/aider/website/docs/config/dotenv.md
index 8ef6d3567..5dff49c51 100644
--- a/aider/website/docs/config/dotenv.md
+++ b/aider/website/docs/config/dotenv.md
@@ -382,6 +382,9 @@ cog.outl("```")
#################
# Other settings:
+## Never prompt for or attempt to install Playwright for web scraping (default: False).
+#AIDER_DISABLE_PLAYWRIGHT=false
+
## specify a file to edit (can be used multiple times)
#AIDER_FILE=
diff --git a/aider/website/docs/config/options.md b/aider/website/docs/config/options.md
index 8468c2bc3..f0bbe5177 100644
--- a/aider/website/docs/config/options.md
+++ b/aider/website/docs/config/options.md
@@ -73,9 +73,10 @@ usage: aider [-h] [--model] [--openai-api-key] [--anthropic-api-key]
[--copy-paste | --no-copy-paste] [--apply]
[--apply-clipboard-edits] [--exit] [--show-repo-map]
[--show-prompts] [--voice-format] [--voice-language]
- [--voice-input-device] [--file] [--read] [--vim]
- [--chat-language] [--yes-always] [-v] [--load]
- [--encoding] [--line-endings] [-c] [--env-file]
+ [--voice-input-device] [--disable-playwright] [--file]
+ [--read] [--vim] [--chat-language] [--yes-always] [-v]
+ [--load] [--encoding] [--line-endings] [-c]
+ [--env-file]
[--suggest-shell-commands | --no-suggest-shell-commands]
[--fancy-input | --no-fancy-input]
[--multiline | --no-multiline]
@@ -659,6 +660,11 @@ Environment variable: `AIDER_VOICE_INPUT_DEVICE`
## Other settings:
+### `--disable-playwright`
+Never prompt for or attempt to install Playwright for web scraping (default: False).
+Default: False
+Environment variable: `AIDER_DISABLE_PLAYWRIGHT`
+
### `--file FILE`
specify a file to edit (can be used multiple times)
Environment variable: `AIDER_FILE`
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index c16807ee5..6a9d144f9 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,283,258 | 66.4% |
-gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 22.9% |
-o3 | 138,842 | 7.2% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,332,231 | 67.3% |
+gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 22.3% |
+o3 | 138,842 | 7.0% |
openrouter/anthropic/claude-3.7-sonnet | 41,017 | 2.1% |
gemini/gemini-2.5-flash-preview-04-17 | 10,305 | 0.5% |
gemini/gemini-2.5-pro-preview-05-06 | 8,576 | 0.4% |
From fe20e528b0163ae89db7618a155a7c5b1ec964c9 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 18:09:09 -0700
Subject: [PATCH 107/133] pick up grep-ast 0.9.0 for ml/mli
---
requirements.txt | 2 +-
requirements/common-constraints.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index 52137b7e8..f3c08d722 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -137,7 +137,7 @@ googleapis-common-protos==1.70.0
# -c requirements/common-constraints.txt
# google-api-core
# grpcio-status
-grep-ast==0.8.1
+grep-ast==0.9.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
diff --git a/requirements/common-constraints.txt b/requirements/common-constraints.txt
index aaf158695..e23b6c23a 100644
--- a/requirements/common-constraints.txt
+++ b/requirements/common-constraints.txt
@@ -160,7 +160,7 @@ greenlet==3.2.1
# via
# playwright
# sqlalchemy
-grep-ast==0.8.1
+grep-ast==0.9.0
# via -r requirements/requirements.in
griffe==1.7.3
# via banks
From 8bb971c15d07139565b9e204450d138f74380b52 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 18:11:09 -0700
Subject: [PATCH 108/133] copy
---
HISTORY.md | 15 +++++++--------
aider/website/HISTORY.md | 15 +++++++--------
aider/website/docs/languages.md | 2 ++
3 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index c2bf06ebe..48a965555 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -2,16 +2,15 @@
### main branch
-- Set development version to 0.82.4.dev.
+- Added support for `gemini-2.5-pro-preview-05-06` models.
+- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
+- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
+ Introduced `--attribute-co-authored-by` option to add co-author trailer to commit messages, by Andrew Grigorev.
+- Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
+- Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
- Improved cost calculation using `litellm.completion_cost` where available.
- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
-- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
-- Added support for `gemini-2.5-pro-preview-05-06` models.
-- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
- Introduced `--attribute-co-authored-by` option to add a `Co-authored-by: aider () ` trailer to AI-generated commits. This setting takes precedence over default author/committer name modifications unless `--attribute-author` or `--attribute-committer` are explicitly set to true, by Andrew Grigorev.
- Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
- Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
- Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
+- Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
Aider wrote 44% of the code in this release.
### Aider v0.82.3
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index 3b3d9d4cc..81eedc99c 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -26,16 +26,15 @@ cog.out(text)
### main branch
-- Set development version to 0.82.4.dev.
+- Added support for `gemini-2.5-pro-preview-05-06` models.
+- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
+- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
+ Introduced `--attribute-co-authored-by` option to add co-author trailer to commit messages, by Andrew Grigorev.
+- Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
+- Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
- Improved cost calculation using `litellm.completion_cost` where available.
- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
-- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
-- Added support for `gemini-2.5-pro-preview-05-06` models.
-- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
- Introduced `--attribute-co-authored-by` option to add a `Co-authored-by: aider () ` trailer to AI-generated commits. This setting takes precedence over default author/committer name modifications unless `--attribute-author` or `--attribute-committer` are explicitly set to true, by Andrew Grigorev.
- Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
- Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
- Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
+- Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
Aider wrote 44% of the code in this release.
### Aider v0.82.3
diff --git a/aider/website/docs/languages.md b/aider/website/docs/languages.md
index ff9c14bfc..f5eba91ca 100644
--- a/aider/website/docs/languages.md
+++ b/aider/website/docs/languages.md
@@ -180,6 +180,8 @@ cog.out(get_supported_languages_md())
| nix | .nix | | ✓ |
| nqc | .nqc | | ✓ |
| objc | .mm | | ✓ |
+| ocaml | .ml | ✓ | ✓ |
+| ocaml_interface | .mli | ✓ | ✓ |
| odin | .odin | | ✓ |
| org | .org | | ✓ |
| pascal | .pas | | ✓ |
From 23ce877bd205f1999363915f5fe29592e94512f8 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 18:12:13 -0700
Subject: [PATCH 109/133] feat: Add Qwen3 235B and 32B leaderboard data
---
aider/website/_data/polyglot_leaderboard.yml | 52 ++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 6052fa1c8..89c5c2105 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1225,3 +1225,55 @@
seconds_per_case: 50.1
total_cost: 1.8451
+- dirname: 2025-05-07-22-39-51--qwen3-235b-high
+ test_cases: 225
+ model: Qwen3 235B A22B (high)
+ edit_format: diff
+ commit_hash: eabc98b-dirty
+ pass_rate_1: 18.2
+ pass_rate_2: 48.0
+ pass_num_1: 41
+ pass_num_2: 108
+ percent_cases_well_formed: 87.1
+ error_outputs: 68
+ num_malformed_responses: 43
+ num_with_malformed_responses: 29
+ user_asks: 89
+ lazy_comments: 0
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 0
+ test_timeouts: 3
+ total_tests: 225
+ command: aider --model openrouter/qwen/qwen3-235b-a22b
+ date: 2025-05-07
+ versions: 0.82.4.dev
+ seconds_per_case: 477.5
+ total_cost: 0.0000
+
+- dirname: 2025-05-07-23-12-42--qwen3-32b-high
+ test_cases: 225
+ model: Qwen3 32B (high)
+ edit_format: diff
+ commit_hash: c756b08-dirty
+ reasoning_effort: high
+ pass_rate_1: 16.0
+ pass_rate_2: 36.4
+ pass_num_1: 36
+ pass_num_2: 82
+ percent_cases_well_formed: 82.2
+ error_outputs: 73
+ num_malformed_responses: 52
+ num_with_malformed_responses: 40
+ user_asks: 99
+ lazy_comments: 0
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 2
+ test_timeouts: 5
+ total_tests: 225
+ command: aider --model openrouter/qwen/qwen3-32b
+ date: 2025-05-07
+ versions: 0.82.4.dev
+ seconds_per_case: 364.7
+ total_cost: 0.0000
\ No newline at end of file
From dd8db786801ccae53246b93b43e23022ed1186c0 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 18:13:44 -0700
Subject: [PATCH 110/133] feat: Add model settings for openrouter qwen3 models
---
aider/resources/model-settings.yml | 25 ++++++++++++++++++++
aider/website/_data/polyglot_leaderboard.yml | 4 ++--
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 1046023a3..1d0350bd7 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1412,3 +1412,28 @@
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
+
+- name: openrouter/qwen/qwen3-235b-a22b
+ use_temperature: 0.6
+ extra_params:
+ max_tokens: 24000
+ top_p: 0.95
+ top_k: 20
+ temperature: 0.6
+
+- name: openrouter/qwen/qwen3-30b-a3b
+ use_temperature: 0.6
+ extra_params:
+ max_tokens: 24000
+ top_p: 0.95
+ top_k: 20
+ temperature: 0.6
+
+- name: openrouter/qwen/qwen3-32b
+ use_temperature: 0.6
+ extra_params:
+ max_tokens: 24000
+ top_p: 0.95
+ top_k: 20
+ temperature: 0.6
+
\ No newline at end of file
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 89c5c2105..83e92fe9b 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1245,7 +1245,7 @@
exhausted_context_windows: 0
test_timeouts: 3
total_tests: 225
- command: aider --model openrouter/qwen/qwen3-235b-a22b
+ command: aider --model openrouter/qwen/qwen3-235b-a22b --reasoning-effort high
date: 2025-05-07
versions: 0.82.4.dev
seconds_per_case: 477.5
@@ -1272,7 +1272,7 @@
exhausted_context_windows: 2
test_timeouts: 5
total_tests: 225
- command: aider --model openrouter/qwen/qwen3-32b
+ command: aider --model openrouter/qwen/qwen3-32b --reasoning-effort high
date: 2025-05-07
versions: 0.82.4.dev
seconds_per_case: 364.7
From 592dea0f8c421c1cdf1ff5e88714812a19e67978 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 18:17:16 -0700
Subject: [PATCH 111/133] chore: Update weak model name for gemini to 2.5 flash
preview
---
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 1046023a3..4504ffffd 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1397,7 +1397,7 @@
overeager: true
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: vertex_ai/gemini-2.5-pro-preview-05-06
edit_format: diff-fenced
From 1d2818a064a704c6c18de89dbdbdf2e085b79423 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 18:23:18 -0700
Subject: [PATCH 112/133] cleanup
---
aider/resources/model-settings.yml | 26 --------------------------
1 file changed, 26 deletions(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 1d0350bd7..e104f9402 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1411,29 +1411,3 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
-
-
-- name: openrouter/qwen/qwen3-235b-a22b
- use_temperature: 0.6
- extra_params:
- max_tokens: 24000
- top_p: 0.95
- top_k: 20
- temperature: 0.6
-
-- name: openrouter/qwen/qwen3-30b-a3b
- use_temperature: 0.6
- extra_params:
- max_tokens: 24000
- top_p: 0.95
- top_k: 20
- temperature: 0.6
-
-- name: openrouter/qwen/qwen3-32b
- use_temperature: 0.6
- extra_params:
- max_tokens: 24000
- top_p: 0.95
- top_k: 20
- temperature: 0.6
-
\ No newline at end of file
From 4ab8faf21e04489caf1d2f0dfbace03521e90b25 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 18:27:35 -0700
Subject: [PATCH 113/133] copy
---
HISTORY.md | 5 +-
aider/website/HISTORY.md | 5 +-
aider/website/assets/sample-analytics.jsonl | 108 +++++++++---------
.../website/docs/config/adv-model-settings.md | 2 +-
aider/website/docs/faq.md | 9 +-
5 files changed, 65 insertions(+), 64 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index 48a965555..5ea1c939f 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,17 +1,18 @@
# Release history
### main branch
-
+- Automatically fetch model parameters (context window, pricing) for OpenRouter models directly from their website, by Stefan Hladnik.
- Added support for `gemini-2.5-pro-preview-05-06` models.
- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
Introduced `--attribute-co-authored-by` option to add co-author trailer to commit messages, by Andrew Grigorev.
- Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
+- The `aider scrape` command-line tool will now use Playwright for web scraping if it is available, by Jon Keys.
- Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
- Improved cost calculation using `litellm.completion_cost` where available.
- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
- Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
- Aider wrote 44% of the code in this release.
+- Aider wrote 45% of the code in this release.
### Aider v0.82.3
diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md
index 81eedc99c..60fba240e 100644
--- a/aider/website/HISTORY.md
+++ b/aider/website/HISTORY.md
@@ -25,17 +25,18 @@ cog.out(text)
### main branch
-
+- Automatically fetch model parameters (context window, pricing) for OpenRouter models directly from their website, by Stefan Hladnik.
- Added support for `gemini-2.5-pro-preview-05-06` models.
- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
Introduced `--attribute-co-authored-by` option to add co-author trailer to commit messages, by Andrew Grigorev.
- Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
+- The `aider scrape` command-line tool will now use Playwright for web scraping if it is available, by Jon Keys.
- Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
- Improved cost calculation using `litellm.completion_cost` where available.
- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
- Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
- Aider wrote 44% of the code in this release.
+- Aider wrote 45% of the code in this release.
### Aider v0.82.3
diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl
index ba787a162..4a5968384 100644
--- a/aider/website/assets/sample-analytics.jsonl
+++ b/aider/website/assets/sample-analytics.jsonl
@@ -1,57 +1,3 @@
-{"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}
-{"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}
@@ -998,3 +944,57 @@
{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664482}
{"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": 19959, "completion_tokens": 176, "total_tokens": 20135, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664554}
{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746664554}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666729}
+{"event": "repo", "properties": {"num_files": 621}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666730}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666730}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666733}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666821}
+{"event": "repo", "properties": {"num_files": 621}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666822}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666822}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666825}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666956}
+{"event": "repo", "properties": {"num_files": 621}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666956}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666956}
+{"event": "cli session", "properties": {"main_model": "gemini/gemini-2.0-flash", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.0-flash", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666956}
+{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666960}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666962}
+{"event": "repo", "properties": {"num_files": 621}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666962}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666962}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666966}
+{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666968}
+{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666988}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666997}
+{"event": "repo", "properties": {"num_files": 621}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666997}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666997}
+{"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": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666997}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666999}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746666999}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667009}
+{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667011}
+{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667027}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667033}
+{"event": "repo", "properties": {"num_files": 621}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667033}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667033}
+{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667036}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667201}
+{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667203}
+{"event": "repo", "properties": {"num_files": 621}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667207}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667207}
+{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667207}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667209}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667229}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667229}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667436}
+{"event": "repo", "properties": {"num_files": 621}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667439}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667439}
+{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667439}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667441}
+{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/REDACTED", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 9655, "completion_tokens": 395, "total_tokens": 10050, "cost": 0.00168525, "total_cost": 0.00168525}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667458}
+{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667467}
+{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667467}
+{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667540}
+{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667540}
+{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667540}
+{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667540}
+{"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": 23450, "completion_tokens": 234, "total_tokens": 23684, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667620}
+{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746667620}
diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md
index e9301d5b5..6d91b6922 100644
--- a/aider/website/docs/config/adv-model-settings.md
+++ b/aider/website/docs/config/adv-model-settings.md
@@ -694,7 +694,7 @@ cog.out("```\n")
- name: gemini/gemini-2.5-pro-preview-05-06
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
overeager: true
diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md
index 6a9d144f9..39c132394 100644
--- a/aider/website/docs/faq.md
+++ b/aider/website/docs/faq.md
@@ -264,13 +264,12 @@ tr:hover { background-color: #f5f5f5; }
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 1,332,231 | 67.3% |
-gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 22.3% |
-o3 | 138,842 | 7.0% |
+gemini/gemini-2.5-pro-exp-03-25 | 1,269,239 | 66.2% |
+gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 23.1% |
+o3 | 138,842 | 7.2% |
openrouter/anthropic/claude-3.7-sonnet | 41,017 | 2.1% |
-gemini/gemini-2.5-flash-preview-04-17 | 10,305 | 0.5% |
+openrouter/REDACTED | 15,587 | 0.8% |
gemini/gemini-2.5-pro-preview-05-06 | 8,576 | 0.4% |
-openrouter/REDACTED | 5,537 | 0.3% |
gemini/REDACTED | 1,989 | 0.1% |
From 03acee1ed271150fda006050a6e2af6d601d36d3 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 19:19:21 -0700
Subject: [PATCH 114/133] copy
---
aider/website/_posts/2025-05-07-gemini-cost.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-cost.md b/aider/website/_posts/2025-05-07-gemini-cost.md
index c54c18e05..fdadee5ed 100644
--- a/aider/website/_posts/2025-05-07-gemini-cost.md
+++ b/aider/website/_posts/2025-05-07-gemini-cost.md
@@ -41,7 +41,7 @@ completed the benchmark at a cost of about $37.
## Investigation detail
-The version of litellm available at that time appears to have been
+The version of litellm available at that time of the benchmark appears to have been
excluding reasoning tokens from the token counts it reported.
So even though aider had correct per-token pricing, it did not have the correct token counts
used during the benchmark.
From aaacee5d4d07ad4c6ca356dc0e0aa27adb283511 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 19:28:02 -0700
Subject: [PATCH 115/133] copy
---
aider/website/_posts/2025-05-07-gemini-cost.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/website/_posts/2025-05-07-gemini-cost.md b/aider/website/_posts/2025-05-07-gemini-cost.md
index fdadee5ed..32c9d9041 100644
--- a/aider/website/_posts/2025-05-07-gemini-cost.md
+++ b/aider/website/_posts/2025-05-07-gemini-cost.md
@@ -1,7 +1,7 @@
---
title: Gemini 2.5 Pro Preview 03-25 benchmark cost
excerpt: The $6.32 benchmark cost reported for Gemini 2.5 Pro Preview 03-25 was incorrect.
-draft: true
+draft: false
nav_exclude: true
---
{% if page.date %}
From 0c236d00352d49b49230e3b1ab693e0b47fcbe8e Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 20:28:46 -0700
Subject: [PATCH 116/133] except
---
aider/coders/base_coder.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py
index b36ad5098..8d1f73502 100755
--- a/aider/coders/base_coder.py
+++ b/aider/coders/base_coder.py
@@ -1989,7 +1989,7 @@ class Coder:
try:
# Try and use litellm's built in cost calculator. Seems to work for non-streaming only?
cost = litellm.completion_cost(completion_response=completion)
- except ValueError:
+ except Exception:
cost = 0
if not cost:
From 8956eef3394a1743732b7feac60b00ba8606d5d1 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 20:28:50 -0700
Subject: [PATCH 117/133] copy
---
aider/website/_data/polyglot_leaderboard.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 292454207..ded7cefcb 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1245,7 +1245,7 @@
exhausted_context_windows: 0
test_timeouts: 2
total_tests: 225
- command: aider --model gemini/gemini-2.5-pro-preview-03-25
+ command: aider --model gemini/gemini-2.5-pro-preview-05-06
date: 2025-05-07
versions: 0.82.4.dev
seconds_per_case: 165.3
From e7de5382fb49a50747fc75c203dd82b985241a8d Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 20:32:11 -0700
Subject: [PATCH 118/133] feat: Add reasoning_effort to Gemini 2.5 models in
model_settings.yml
---
aider/resources/model-settings.yml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 4504ffffd..a6cbc3016 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1398,6 +1398,7 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
+ accepts_settings: ["reasoning_effort"]
- name: vertex_ai/gemini-2.5-pro-preview-05-06
edit_format: diff-fenced
@@ -1405,10 +1406,11 @@
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ accepts_settings: ["reasoning_effort"]
- name: openrouter/google/gemini-2.5-pro-preview-05-06
overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
-
+ accepts_settings: ["reasoning_effort"]
From 8727ffbe68b26c2c99d64c96d993c77081a186c5 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 20:54:06 -0700
Subject: [PATCH 119/133] feat: Add thinking_tokens to Gemini 2.5 model
settings
---
aider/resources/model-settings.yml | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index a6cbc3016..1a7f4d894 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -962,12 +962,14 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: gemini/gemini-2.0-flash
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: gemini/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
use_repo_map: true
overeager: true
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: openrouter/google/gemini-2.5-pro-exp-03-25:free
edit_format: diff-fenced
@@ -981,6 +983,7 @@
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: vertex_ai/gemini-2.5-pro-preview-03-25
edit_format: diff-fenced
@@ -988,6 +991,7 @@
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: openrouter/openrouter/quasar-alpha
use_repo_map: true
@@ -1375,17 +1379,17 @@
- name: gemini/gemini-2.5-flash-preview-04-17
edit_format: diff
use_repo_map: true
- accepts_settings: ["thinking_tokens"]
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: gemini-2.5-flash-preview-04-17
edit_format: diff
use_repo_map: true
- accepts_settings: ["thinking_tokens"]
+ accepts_settings: ["reasoning_effort", "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"]
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: openrouter/google/gemini-2.5-pro-preview-03-25
overeager: true
@@ -1398,7 +1402,7 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
- accepts_settings: ["reasoning_effort"]
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: vertex_ai/gemini-2.5-pro-preview-05-06
edit_format: diff-fenced
@@ -1406,11 +1410,11 @@
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- accepts_settings: ["reasoning_effort"]
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: openrouter/google/gemini-2.5-pro-preview-05-06
overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
- accepts_settings: ["reasoning_effort"]
+ accepts_settings: ["reasoning_effort", "thinking_tokens"]
From a98b531bcc9c3738110b2e538a246fb7e4dbe81f Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 21:02:00 -0700
Subject: [PATCH 120/133] feat: add prompt_tokens and completion_tokens to
results summary
---
benchmark/benchmark.py | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index a3c2ca850..b3bbc94ea 100755
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -492,6 +492,8 @@ def summarize_results(dirname, stats_languages=None):
res.syntax_errors = 0
res.indentation_errors = 0
res.lazy_comments = 0
+ res.prompt_tokens = 0
+ res.completion_tokens = 0
res.reasoning_effort = None
res.thinking_tokens = None
@@ -523,6 +525,9 @@ def summarize_results(dirname, stats_languages=None):
res.syntax_errors += results.get("syntax_errors", 0)
res.indentation_errors += results.get("indentation_errors", 0)
+ res.prompt_tokens += results.get("prompt_tokens", 0)
+ res.completion_tokens += results.get("completion_tokens", 0)
+
res.reasoning_effort = results.get("reasoning_effort")
res.thinking_tokens = results.get("thinking_tokens")
@@ -590,6 +595,8 @@ def summarize_results(dirname, stats_languages=None):
show("syntax_errors")
show("indentation_errors")
show("exhausted_context_windows")
+ show("prompt_tokens", red=None)
+ show("completion_tokens", red=None)
show("test_timeouts")
print(f" total_tests: {res.total_tests}")
@@ -950,6 +957,8 @@ 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,
+ prompt_tokens=coder.message_tokens_sent,
+ completion_tokens=coder.message_tokens_received,
thinking_tokens=thinking_tokens,
chat_hashes=list(
zip(
From 5090f2815163b12fa672290bac9db0d464df71b8 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 21:08:29 -0700
Subject: [PATCH 121/133] feat: Track total tokens and use in benchmark stats
---
aider/coders/base_coder.py | 15 +++++++++++++--
benchmark/benchmark.py | 4 ++--
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py
index 8d1f73502..72b7999ed 100755
--- a/aider/coders/base_coder.py
+++ b/aider/coders/base_coder.py
@@ -108,8 +108,6 @@ class Coder:
partial_response_content = ""
commit_before_message = []
message_cost = 0.0
- message_tokens_sent = 0
- message_tokens_received = 0
add_cache_headers = False
cache_warming_thread = None
num_cache_warming_pings = 0
@@ -128,6 +126,8 @@ class Coder:
from_coder=None,
summarize_from_coder=True,
**kwargs,
+
+
):
import aider.coders as coders
@@ -175,6 +175,8 @@ class Coder:
commands=from_coder.commands.clone(),
total_cost=from_coder.total_cost,
ignore_mentions=from_coder.ignore_mentions,
+ total_tokens_sent=from_coder.total_tokens_sent,
+ total_tokens_received=from_coder.total_tokens_received,
file_watcher=from_coder.file_watcher,
)
use_kwargs.update(update) # override to complete the switch
@@ -327,6 +329,8 @@ class Coder:
chat_language=None,
detect_urls=True,
ignore_mentions=None,
+ total_tokens_sent=0,
+ total_tokens_received=0,
file_watcher=None,
auto_copy_context=False,
auto_accept_architect=True,
@@ -373,6 +377,10 @@ class Coder:
self.need_commit_before_edits = set()
self.total_cost = total_cost
+ self.total_tokens_sent = total_tokens_sent
+ self.total_tokens_received = total_tokens_received
+ self.message_tokens_sent = 0
+ self.message_tokens_received = 0
self.verbose = verbose
self.abs_fnames = set()
@@ -2057,6 +2065,9 @@ class Coder:
if not self.usage_report:
return
+ self.total_tokens_sent += self.message_tokens_sent
+ self.total_tokens_received += self.message_tokens_received
+
self.io.tool_output(self.usage_report)
prompt_tokens = self.message_tokens_sent
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index b3bbc94ea..3cfbe104d 100755
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -957,8 +957,8 @@ 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,
- prompt_tokens=coder.message_tokens_sent,
- completion_tokens=coder.message_tokens_received,
+ prompt_tokens=coder.total_tokens_sent,
+ completion_tokens=coder.total_tokens_received,
thinking_tokens=thinking_tokens,
chat_hashes=list(
zip(
From bdec02e290dc33d25a3f95c0e5c2a7591a432f63 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Wed, 7 May 2025 21:08:37 -0700
Subject: [PATCH 122/133] style: Run linter on base_coder.py
---
aider/coders/base_coder.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py
index 72b7999ed..7ae781450 100755
--- a/aider/coders/base_coder.py
+++ b/aider/coders/base_coder.py
@@ -126,8 +126,6 @@ class Coder:
from_coder=None,
summarize_from_coder=True,
**kwargs,
-
-
):
import aider.coders as coders
From aeaf2590213bd72c3508330136a80cec9cd52494 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Wed, 7 May 2025 21:16:14 -0700
Subject: [PATCH 123/133] 2.5-pro does not support thinking_budget
---
aider/resources/model-settings.yml | 7 -------
1 file changed, 7 deletions(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index 1a7f4d894..ee07b31f4 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -962,14 +962,12 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: gemini/gemini-2.0-flash
- accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: gemini/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
use_repo_map: true
overeager: true
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
- accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: openrouter/google/gemini-2.5-pro-exp-03-25:free
edit_format: diff-fenced
@@ -983,7 +981,6 @@
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: vertex_ai/gemini-2.5-pro-preview-03-25
edit_format: diff-fenced
@@ -991,7 +988,6 @@
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: openrouter/openrouter/quasar-alpha
use_repo_map: true
@@ -1402,7 +1398,6 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
- accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: vertex_ai/gemini-2.5-pro-preview-05-06
edit_format: diff-fenced
@@ -1410,11 +1405,9 @@
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: openrouter/google/gemini-2.5-pro-preview-05-06
overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
- accepts_settings: ["reasoning_effort", "thinking_tokens"]
From 71338a679e8cb99f3ee2108919e6714d6f572789 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 8 May 2025 06:41:36 -0700
Subject: [PATCH 124/133] cleanup
---
aider/website/_data/polyglot_leaderboard.yml | 52 --------------------
1 file changed, 52 deletions(-)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 83e92fe9b..6052fa1c8 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1225,55 +1225,3 @@
seconds_per_case: 50.1
total_cost: 1.8451
-- dirname: 2025-05-07-22-39-51--qwen3-235b-high
- test_cases: 225
- model: Qwen3 235B A22B (high)
- edit_format: diff
- commit_hash: eabc98b-dirty
- pass_rate_1: 18.2
- pass_rate_2: 48.0
- pass_num_1: 41
- pass_num_2: 108
- percent_cases_well_formed: 87.1
- error_outputs: 68
- num_malformed_responses: 43
- num_with_malformed_responses: 29
- user_asks: 89
- lazy_comments: 0
- syntax_errors: 0
- indentation_errors: 0
- exhausted_context_windows: 0
- test_timeouts: 3
- total_tests: 225
- command: aider --model openrouter/qwen/qwen3-235b-a22b --reasoning-effort high
- date: 2025-05-07
- versions: 0.82.4.dev
- seconds_per_case: 477.5
- total_cost: 0.0000
-
-- dirname: 2025-05-07-23-12-42--qwen3-32b-high
- test_cases: 225
- model: Qwen3 32B (high)
- edit_format: diff
- commit_hash: c756b08-dirty
- reasoning_effort: high
- pass_rate_1: 16.0
- pass_rate_2: 36.4
- pass_num_1: 36
- pass_num_2: 82
- percent_cases_well_formed: 82.2
- error_outputs: 73
- num_malformed_responses: 52
- num_with_malformed_responses: 40
- user_asks: 99
- lazy_comments: 0
- syntax_errors: 0
- indentation_errors: 0
- exhausted_context_windows: 2
- test_timeouts: 5
- total_tests: 225
- command: aider --model openrouter/qwen/qwen3-32b --reasoning-effort high
- date: 2025-05-07
- versions: 0.82.4.dev
- seconds_per_case: 364.7
- total_cost: 0.0000
\ No newline at end of file
From 114a0e5ab9ec833ea5e6160e5a8b744ae0aa98db Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 8 May 2025 06:42:12 -0700
Subject: [PATCH 125/133] feat: Add qwen3 leaderboard data for 32b and 235b
models
---
aider/website/_data/polyglot_leaderboard.yml | 58 +++++++++++++++++++-
1 file changed, 57 insertions(+), 1 deletion(-)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index ded7cefcb..3d19d7685 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1249,4 +1249,60 @@
date: 2025-05-07
versions: 0.82.4.dev
seconds_per_case: 165.3
- total_cost: 37.4104
\ No newline at end of file
+ total_cost: 37.4104
+
+- dirname: 2025-05-08-03-20-24--qwen3-32b-default
+ test_cases: 225
+ model: openrouter/qwen/qwen3-32b
+ edit_format: diff
+ commit_hash: aaacee5-dirty, aeaf259
+ pass_rate_1: 14.2
+ pass_rate_2: 40.0
+ pass_num_1: 32
+ pass_num_2: 90
+ percent_cases_well_formed: 83.6
+ error_outputs: 119
+ num_malformed_responses: 50
+ num_with_malformed_responses: 37
+ user_asks: 97
+ lazy_comments: 0
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 12
+ prompt_tokens: 317591
+ completion_tokens: 120418
+ test_timeouts: 5
+ total_tests: 225
+ command: aider --model openrouter/qwen/qwen3-32b
+ date: 2025-05-08
+ versions: 0.82.4.dev
+ seconds_per_case: 372.2
+ total_cost: 0.7603
+
+- dirname: 2025-05-08-03-22-37--qwen3-235b-defaults
+ test_cases: 225
+ model: openrouter/qwen/qwen3-235b-a22b
+ edit_format: diff
+ commit_hash: aaacee5-dirty
+ pass_rate_1: 17.3
+ pass_rate_2: 49.8
+ pass_num_1: 39
+ pass_num_2: 112
+ percent_cases_well_formed: 91.6
+ error_outputs: 58
+ num_malformed_responses: 29
+ num_with_malformed_responses: 19
+ user_asks: 102
+ lazy_comments: 0
+ syntax_errors: 0
+ indentation_errors: 0
+ exhausted_context_windows: 0
+ prompt_tokens: 0
+ completion_tokens: 0
+ test_timeouts: 1
+ total_tests: 225
+ command: aider --model openrouter/qwen/qwen3-235b-a22b
+ date: 2025-05-08
+ versions: 0.82.4.dev
+ seconds_per_case: 428.1
+ total_cost: 1.8037
\ No newline at end of file
From c89ac40f56d233d4127300c3b8962e4435c9e228 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 8 May 2025 06:50:57 -0700
Subject: [PATCH 126/133] fix system_prompt_prefix
---
aider/coders/base_coder.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py
index 7ae781450..b29347352 100755
--- a/aider/coders/base_coder.py
+++ b/aider/coders/base_coder.py
@@ -1193,14 +1193,13 @@ class Coder:
language=language,
)
- if self.main_model.system_prompt_prefix:
- prompt = self.main_model.system_prompt_prefix + prompt
-
return prompt
def format_chat_chunks(self):
self.choose_fence()
main_sys = self.fmt_system_prompt(self.gpt_prompts.main_system)
+ if self.main_model.system_prompt_prefix:
+ main_sys = self.main_model.system_prompt_prefix + "\n" + main_sys
example_messages = []
if self.main_model.examples_as_sys_msg:
From a39cec8e1dc0dff2bbb307fde5f6c96fa7f13e73 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 8 May 2025 06:52:41 -0700
Subject: [PATCH 127/133] feat: Add model settings for
openrouter/qwen/qwen3-235b-a22b
---
aider/resources/model-settings.yml | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index ee07b31f4..cf5671e2c 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1411,3 +1411,14 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
+
+- name: openrouter/qwen/qwen3-235b-a22b
+ system_prompt_prefix: "/nothink"
+ use_temperature: 0.7
+ extra_params:
+ max_tokens: 24000
+ top_p: 0.8
+ top_k: 20
+ min_p: 0.0
+ temperature: 0.7
+
\ No newline at end of file
From fef0f1fa3ad2c76284002897dfa02860217955af Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 8 May 2025 07:27:08 -0700
Subject: [PATCH 128/133] cleanup
---
aider/resources/model-settings.yml | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml
index cf5671e2c..56e7da53d 100644
--- a/aider/resources/model-settings.yml
+++ b/aider/resources/model-settings.yml
@@ -1411,14 +1411,4 @@
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
-
-- name: openrouter/qwen/qwen3-235b-a22b
- system_prompt_prefix: "/nothink"
- use_temperature: 0.7
- extra_params:
- max_tokens: 24000
- top_p: 0.8
- top_k: 20
- min_p: 0.0
- temperature: 0.7
\ No newline at end of file
From 4a14aeb7d90621dbd8a521efe023d68c3085e438 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 8 May 2025 07:35:55 -0700
Subject: [PATCH 129/133] copy
---
aider/website/_data/polyglot_leaderboard.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml
index 3d19d7685..92cac000a 100644
--- a/aider/website/_data/polyglot_leaderboard.yml
+++ b/aider/website/_data/polyglot_leaderboard.yml
@@ -1253,7 +1253,7 @@
- dirname: 2025-05-08-03-20-24--qwen3-32b-default
test_cases: 225
- model: openrouter/qwen/qwen3-32b
+ model: Qwen3 32B
edit_format: diff
commit_hash: aaacee5-dirty, aeaf259
pass_rate_1: 14.2
@@ -1281,7 +1281,7 @@
- dirname: 2025-05-08-03-22-37--qwen3-235b-defaults
test_cases: 225
- model: openrouter/qwen/qwen3-235b-a22b
+ model: Qwen3 235B A22B
edit_format: diff
commit_hash: aaacee5-dirty
pass_rate_1: 17.3
From 90b5f897f984c8e40d6c52b34c192beb5c92df90 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 8 May 2025 07:49:33 -0700
Subject: [PATCH 130/133] feat: Add generic rule for qwen3 235b models with
diff and repomap
---
aider/models.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/aider/models.py b/aider/models.py
index 992f1f728..cf0f832c7 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -518,6 +518,12 @@ class Model(ModelSettings):
self.extra_params = dict(top_p=0.95)
return # <--
+ if "qwen3" in model and "235b" in model:
+ self.edit_format = "diff"
+ self.use_repo_map = True
+ return # <--
+
+
# use the defaults
if self.edit_format == "diff":
self.use_repo_map = True
From 9badb711fff88089a89154d23846450f495bdbd2 Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 8 May 2025 07:49:38 -0700
Subject: [PATCH 131/133] style: Run linter on aider/models.py
---
aider/models.py | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/aider/models.py b/aider/models.py
index cf0f832c7..1cb64d0bb 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -238,7 +238,6 @@ class ModelInfoManager:
return cached_info
-
def fetch_openrouter_model_info(self, model):
"""
Fetch model info by scraping the openrouter model page.
@@ -246,19 +245,23 @@ class ModelInfoManager:
Example: openrouter/qwen/qwen-2.5-72b-instruct:free
Returns a dict with keys: max_tokens, max_input_tokens, max_output_tokens, input_cost_per_token, output_cost_per_token.
"""
- url_part = model[len("openrouter/"):]
+ url_part = model[len("openrouter/") :]
url = "https://openrouter.ai/" + url_part
try:
import requests
+
response = requests.get(url, timeout=5, verify=self.verify_ssl)
if response.status_code != 200:
return {}
html = response.text
import re
- if re.search(rf'The model\s*.*{re.escape(url_part)}.* is not available', html, re.IGNORECASE):
+
+ if re.search(
+ rf"The model\s*.*{re.escape(url_part)}.* is not available", html, re.IGNORECASE
+ ):
print(f"\033[91mError: Model '{url_part}' is not available\033[0m")
return {}
- text = re.sub(r'<[^>]+>', ' ', html)
+ text = re.sub(r"<[^>]+>", " ", html)
context_match = re.search(r"([\d,]+)\s*context", text)
if context_match:
context_str = context_match.group(1).replace(",", "")
@@ -283,6 +286,7 @@ class ModelInfoManager:
print("Error fetching openrouter info:", str(e))
return {}
+
model_info_manager = ModelInfoManager()
@@ -523,7 +527,6 @@ class Model(ModelSettings):
self.use_repo_map = True
return # <--
-
# use the defaults
if self.edit_format == "diff":
self.use_repo_map = True
From 08220f598cc7d565f3f2693946d38ac5df48d13e Mon Sep 17 00:00:00 2001
From: "Paul Gauthier (aider)"
Date: Thu, 8 May 2025 07:49:55 -0700
Subject: [PATCH 132/133] style: Format long line in
fetch_openrouter_model_info docstring
---
aider/models.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/aider/models.py b/aider/models.py
index 1cb64d0bb..166cb3974 100644
--- a/aider/models.py
+++ b/aider/models.py
@@ -243,7 +243,8 @@ class ModelInfoManager:
Fetch model info by scraping the openrouter model page.
Expected URL: https://openrouter.ai/
Example: openrouter/qwen/qwen-2.5-72b-instruct:free
- Returns a dict with keys: max_tokens, max_input_tokens, max_output_tokens, input_cost_per_token, output_cost_per_token.
+ Returns a dict with keys: max_tokens, max_input_tokens, max_output_tokens,
+ input_cost_per_token, output_cost_per_token.
"""
url_part = model[len("openrouter/") :]
url = "https://openrouter.ai/" + url_part
From 69f14ace01a0da810664b2d6c551b667918a38f1 Mon Sep 17 00:00:00 2001
From: Paul Gauthier
Date: Thu, 8 May 2025 07:58:01 -0700
Subject: [PATCH 133/133] copy
---
HISTORY.md | 18 +-
README.md | 2 +-
aider/website/HISTORY.md | 18 +-
aider/website/assets/sample-analytics.jsonl | 220 +++++++++---------
.../website/docs/config/adv-model-settings.md | 3 +
aider/website/docs/config/model-aliases.md | 4 +-
aider/website/docs/faq.md | 13 +-
aider/website/docs/leaderboards/index.md | 2 +-
aider/website/index.html | 2 +-
9 files changed, 150 insertions(+), 132 deletions(-)
diff --git a/HISTORY.md b/HISTORY.md
index 5ea1c939f..48738aa73 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,18 +1,26 @@
# Release history
### main branch
-- Automatically fetch model parameters (context window, pricing) for OpenRouter models directly from their website, by Stefan Hladnik.
+
+- Added support for `qwen3-235b` models, including `openrouter/qwen/qwen3-235b-a22b`.
- Added support for `gemini-2.5-pro-preview-05-06` models.
+- Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
+- Introduced `--attribute-co-authored-by` option to add co-author trailer to commit messages, by Andrew Grigorev.
+- Updated Gemini model aliases (e.g., `gemini`, `gemini-2.5-pro`) to point to the `05-06` preview versions.
+- Marked Gemini 2.5 Pro preview models as `overeager` by default.
+- Updated the default weak model for Gemini 2.5 Pro models to `gemini/gemini-2.5-flash-preview-04-17`.
+- Corrected `gemini-2.5-pro-exp-03-25` model settings to reflect its lack of support for `thinking_budget`.
+- Ensured model-specific system prompt prefixes are placed on a new line before the main system prompt.
+- Added tracking of total tokens sent and received, now included in benchmark statistics.
+- Automatically fetch model parameters (context window, pricing) for OpenRouter models directly from their website, by Stefan Hladnik.
- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models.
+- Improved cost calculation using `litellm.completion_cost` where available.
- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`.
- Introduced `--attribute-co-authored-by` option to add co-author trailer to commit messages, by Andrew Grigorev.
- Added `--disable-playwright` flag to prevent Playwright installation prompts and usage, by Andrew Grigorev.
- The `aider scrape` command-line tool will now use Playwright for web scraping if it is available, by Jon Keys.
-- Added repomap support for OCaml and OCaml interface files, by Andrey Popp.
-- Improved cost calculation using `litellm.completion_cost` where available.
- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan.
- Improved cross-platform display of shell commands by using `oslex` for robust argument quoting, by Titusz Pan.
-- Aider wrote 45% of the code in this release.
+- Aider wrote 46% of the code in this release.
### Aider v0.82.3
diff --git a/README.md b/README.md
index cdf0f5c1b..14db049f8 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ cog.out(text)
+src="https://img.shields.io/badge/📦%20Installs-2.2M-2ecc71?style=flat-square&labelColor=555555"/>
Model Name | Total Tokens | Percent |
-gemini/gemini-2.5-pro-exp-03-25 | 1,269,239 | 66.2% |
-gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 23.1% |
-o3 | 138,842 | 7.2% |
-openrouter/anthropic/claude-3.7-sonnet | 41,017 | 2.1% |
-openrouter/REDACTED | 15,587 | 0.8% |
-gemini/gemini-2.5-pro-preview-05-06 | 8,576 | 0.4% |
-gemini/REDACTED | 1,989 | 0.1% |
+gemini/gemini-2.5-pro-exp-03-25 | 668,483 | 55.7% |
+gemini/gemini-2.5-pro-preview-03-25 | 442,019 | 36.9% |
+o3 | 52,666 | 4.4% |
+gemini/gemini-2.5-pro-preview-05-06 | 18,654 | 1.6% |
+openrouter/REDACTED | 15,587 | 1.3% |
+gemini/REDACTED | 1,989 | 0.2% |
{: .note :}
diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md
index 6e763dfed..865f73b3a 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.')}")
]]]-->
-May 07, 2025.
+May 08, 2025.
diff --git a/aider/website/index.html b/aider/website/index.html
index 10fdf6d2e..f21b176d1 100644
--- a/aider/website/index.html
+++ b/aider/website/index.html
@@ -73,7 +73,7 @@ cog.out(text)
📦 Installs
- 2.1M
+ 2.2M
📈 Tokens/week