Compare commits

...

592 Commits

Author SHA1 Message Date
Paul Gauthier
53c14329bf set version to 0.85.5.dev 2025-08-07 15:33:44 -03:00
Paul Gauthier
0b13b27b51 version bump to 0.85.4 2025-08-07 15:33:43 -03:00
Paul Gauthier
d9d13f23b3 copy 2025-08-07 15:31:28 -03:00
Paul Gauthier
8c982f83ce feat: Disable temperature for GPT-5 models
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-08-07 15:26:20 -03:00
Paul Gauthier
ac7e274fe0 fix: Adapt to new PostHog SDK capture method signature
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-08-07 15:26:02 -03:00
Paul Gauthier
c23ebfe688 set version to 0.85.4.dev 2025-08-07 10:42:13 -03:00
Paul Gauthier
9d778bfdac version bump to 0.85.3 2025-08-07 10:42:12 -03:00
Paul Gauthier
70f2bbb796 copy 2025-08-07 10:17:58 -03:00
Paul Gauthier
6c7870dbcf copy 2025-08-07 10:16:46 -03:00
Paul Gauthier
ece9803fdc bump deps without llama-index-core==0.12.26 2025-08-07 09:18:12 -03:00
Paul Gauthier
ad39fdb2d1 bump deps 2025-08-07 09:00:03 -03:00
Paul Gauthier
8904e2966d Merge branch 'main' of github.com:Aider-AI/aider 2025-08-07 08:50:45 -03:00
Paul Gauthier
3c9e180b54 bump deps 2025-08-07 08:50:39 -03:00
paul-gauthier
1af0e59149 Merge pull request #4410 from liam61/main
chore: prettier scripting usage for faq
2025-08-05 08:29:08 -03:00
liam.liu
3402b151f7 chore: prettier scripting usage for faq 2025-08-05 19:18:16 +08:00
Paul Gauthier
f38200c511 copy 2025-07-18 11:05:51 +00:00
Paul Gauthier
89ad2ba2cb copy 2025-07-17 20:26:38 +00:00
Paul Gauthier
9d6ddcd0fc chore: Remove Kimi K2 model metadata and add test results 2025-07-17 18:03:14 +00:00
paul-gauthier
915ebffc8e Update polyglot_leaderboard.yml 2025-07-17 09:34:34 +00:00
Paul Gauthier
b336dee9b0 set version to 0.85.3.dev 2025-07-15 23:22:15 +00:00
Paul Gauthier
853532c48c version bump to 0.85.2 2025-07-15 23:22:12 +00:00
Paul Gauthier
1a0ef64011 copy 2025-07-15 23:20:34 +00:00
Paul Gauthier
fe3f77176e copy 2025-07-15 23:18:53 +00:00
Paul Gauthier
2a18a186b4 copy 2025-07-15 23:17:07 +00:00
Paul Gauthier
102f6ef284 feat: Add Kimi K2 model data to polyglot leaderboard 2025-07-15 19:44:40 +00:00
paul-gauthier
90dffa9eae Merge pull request #4342 from sentienthouseplant/bau-add-kimi-k2 2025-07-12 13:26:26 -03:00
Jack Harrington
63d3dbcc9b Add source for openrouter kimi-k2 information. Remove reminder: sys. 2025-07-12 17:10:35 +01:00
Jack Harrington
c3f0bdd391 Add kimi-k2 to model resources. 2025-07-12 16:51:17 +01:00
Jack Harrington
c24c2c862d Update model-metadata.json 2025-07-12 16:11:31 +01:00
Paul Gauthier
7bc2e4e911 feat: Add Grok-4 and Gemini Flash Lite, enhance CLI, fix model settings 2025-07-11 19:36:06 -03:00
Paul Gauthier
f7870b6d03 Merge branch 'main' of github.com:Aider-AI/aider 2025-07-10 12:10:01 -03:00
Paul Gauthier
bd78b9fe9d feat: Add openrouter/x-ai/grok-4 model setting
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-07-10 11:35:25 -03:00
Paul Gauthier
eab51242bb feat: Add xai/grok-4 model settings 2025-07-10 11:35:24 -03:00
paul-gauthier
6a28864c22 Merge pull request #4324 from tamirzb/main
Add gemini 2.5 flash lite preview 06-17
2025-07-09 12:18:56 -03:00
Tamir Zahavi-Brunner
ef59ecbcd8 Add gemini 2.5 flash lite preview 06-17 2025-07-09 23:08:55 +08:00
Paul Gauthier
6c16498de1 fix: Display first line of commit messages in /undo output
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-07-08 11:29:59 -03:00
paul-gauthier
f22fbf9b3a Merge pull request #4321 from yzx9/missing-cmd-output
fix: add missing output for clear command
2025-07-08 08:05:07 -03:00
Zexin Yuan
1a57730884 fix: add missing output for clear command 2025-07-08 11:28:34 +08:00
paul-gauthier
0967024304 Merge pull request #4307 from o-nix/patch-1 2025-07-04 16:47:06 -03:00
Kirill Vergun
456db697f0 Remove extra duplicated line in default commit instructions 2025-07-04 21:03:54 +02:00
paul-gauthier
3db4d378eb Merge pull request #4300 from ei-grad/robust-model-settings-override
fix: Remove existing model settings before adding new ones
2025-07-01 11:12:13 -03:00
Andrew Grigorev
02c27732af fix: Remove existing model settings before adding new ones
Fix #4298

Co-authored-by: aider (vertex_ai/gemini-2.5-pro) <aider@aider.chat>
2025-07-01 11:59:14 +03:00
Paul Gauthier
966cf2b9fb copy 2025-06-30 09:52:19 -03:00
Paul Gauthier
ac46e14ce4 set version to 0.85.2.dev 2025-06-30 09:51:05 -03:00
Paul Gauthier
9c9c6fe0b8 version bump to 0.85.1 2025-06-30 09:51:03 -03:00
Paul Gauthier
59a5190267 copy 2025-06-30 09:49:49 -03:00
Paul Gauthier
302b0cb5f9 chore: Add latest polyglot leaderboard results and adjust display cap 2025-06-30 09:49:21 -03:00
Paul Gauthier
f4605b2a86 feat: Display model announcements with no-arg /model command
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-06-29 09:01:10 -07:00
Paul Gauthier
3fec90340b chore: Remove commented out extra_params from model settings 2025-06-28 06:46:35 -07:00
Paul Gauthier
531838096b chore: Update polyglot leaderboard data 2025-06-27 17:33:58 -07:00
Paul Gauthier
540b27b577 blame 2025-06-27 17:03:14 -07:00
Paul Gauthier
4f4f00f37c set version to 0.85.1.dev 2025-06-27 16:39:50 -07:00
Paul Gauthier
a544112ff3 version bump to 0.85.0 2025-06-27 16:39:48 -07:00
Paul Gauthier
e0e2cb109a chore: Ignore Docker bash history file 2025-06-27 16:37:31 -07:00
Paul Gauthier
66cdfdefd5 copy 2025-06-27 16:37:02 -07:00
Paul Gauthier
d5785b57a4 copy 2025-06-27 16:36:27 -07:00
Paul Gauthier
ae539fb1f5 copy 2025-06-25 15:30:36 -07:00
Paul Gauthier
f5a512ba65 refactor: Remove -n short flag from benchmark --new option 2025-06-25 14:04:48 -07:00
Paul Gauthier
c48fea64a1 copy 2025-06-25 13:20:51 -07:00
Paul Gauthier
68f05f5b4f bump deps 2025-06-25 13:08:34 -07:00
Paul Gauthier
323910be11 test: Improve summary test with list-aware token counting mock 2025-06-25 12:57:59 -07:00
Paul Gauthier
19a7864168 refactor: Remove unused head variable in ChatSummary 2025-06-25 11:53:24 -07:00
Paul Gauthier
320ee06cc3 style: Add trailing commas to improve formatting 2025-06-25 11:52:31 -07:00
Paul Gauthier
8fe52d7b0d Merge branch 'main' of github.com:Aider-AI/aider 2025-06-25 11:51:28 -07:00
Paul Gauthier
338cfb46e4 Revert "bump deps"
This reverts commit 63a7d261ae.
2025-06-25 11:51:22 -07:00
paul-gauthier
63c92771f2 Merge pull request #3764 from jayeshthk/main
Optimize head‑truncation loop in summarize_real()
2025-06-25 11:51:07 -07:00
paul-gauthier
a0ffc5761c Merge pull request #3870 from susliko/custom-posthog-instance
feat: add configurable PostHog host and API key parameters
2025-06-25 11:47:18 -07:00
Paul Gauthier
d47cb40518 test: Add Clojure language repomap test fixture
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-06-25 11:40:26 -07:00
Paul Gauthier
d9e3ede000 Merge branch 'main' of github.com:Aider-AI/aider 2025-06-25 11:37:02 -07:00
paul-gauthier
ba97c83be6 Merge pull request #4028 from garrett-hopper/clojure-repomap
Add Clojure repomap queries
2025-06-25 11:36:53 -07:00
Paul Gauthier
22cdacc8e2 copy 2025-06-25 11:36:38 -07:00
Paul Gauthier
15806aa6ab feat: Enable co-authored-by by default
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-06-25 11:33:40 -07:00
Paul Gauthier
74ee340101 chore: Increase Deepseek v3 max tokens to 65536
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-06-25 11:28:24 -07:00
Paul Gauthier
63a7d261ae bump deps 2025-06-25 11:26:17 -07:00
Paul Gauthier
e2d3fc4594 fix: Update Co-authored-by email to aider@aider.chat 2025-06-25 11:17:07 -07:00
Paul Gauthier (aider)
14af218ea2 fix: Create parent directories for history files and improve error handling 2025-06-25 11:12:24 -07:00
Paul Gauthier
5b317e5ec0 copy 2025-06-25 11:10:21 -07:00
Paul Gauthier
75f1a33292 Merge branch 'main' of github.com:Aider-AI/aider 2025-06-25 11:08:15 -07:00
Paul Gauthier
32cdb7cfad copy 2025-06-25 11:07:59 -07:00
paul-gauthier
d022f4ac63 Merge pull request #4264 from FeepingCreature/fix/4277-accept-taggy-diff
refactor: update HEAD regex to accept optional closing tag in search blocks
2025-06-25 10:57:35 -07:00
Paul Gauthier
b787e17924 Revert "feat: better place to create history file dirs (InputOutput ctr)"
This reverts commit f695e71398.
2025-06-25 10:53:55 -07:00
Paul Gauthier
5e9daa3c56 Revert "fix: check for input_history_file none"
This reverts commit fb4d2f90c1.
2025-06-25 10:53:49 -07:00
Paul Gauthier
d5ae9eff88 Merge branch 'main' of github.com:Aider-AI/aider 2025-06-25 10:51:42 -07:00
paul-gauthier
856d94c1dc Merge pull request #4271 from contributor/chat-history-files-auto-create-dir
fix: Auto-create parent directories for chat history files
2025-06-25 06:29:10 -07:00
contributor
fb4d2f90c1 fix: check for input_history_file none 2025-06-25 16:09:40 +03:00
paul-gauthier
d85078a610 Merge pull request #4257 from contributor/chat-history-files-auto-create-dir 2025-06-25 04:57:04 -07:00
contributor
f695e71398 feat: better place to create history file dirs (InputOutput ctr)
this decreases number of IO operations
2025-06-25 13:48:38 +03:00
Paul Gauthier
d90936662b copy 2025-06-24 16:00:13 -07:00
paul-gauthier
6a00d8ff5f Merge pull request #4269 from iamFIREcracker/fix-for-literal-read-only-files 2025-06-24 12:34:14 -07:00
Matteo Landi
c4b9f14b90 fix: Resolve literal paths correctly in /read-only command 2025-06-24 20:58:43 +02:00
paul-gauthier
a785b0f463 Merge pull request #4268 from therealmarv/add-gemini-2.5-vertex-general-availability 2025-06-24 09:09:45 -07:00
Paul Gauthier
90ecde4da9 copy 2025-06-24 08:23:08 -07:00
Paul Gauthier
37b7a7b44f Merge branch 'main' of github.com:Aider-AI/aider 2025-06-24 08:22:33 -07:00
Paul Gauthier
89356e897e copy 2025-06-24 08:22:30 -07:00
therealmarv
05ca9e5c24 add Gemini 2.5 non-preview Vertex models 2025-06-24 17:07:01 +02:00
Mathis Beer (aider)
7c9cff2f6e refactor: update HEAD regex to accept optional closing tag in search blocks
When working with HTML text, the network has a strong bias to go "well, this is '<' followed by text, it's a tag! I should close it with '>'." Then the edit would be ignored.
2025-06-24 10:23:25 +02:00
paul-gauthier
f9fc2c6a44 Merge pull request #4260 from mtofano/add-matlab-repomap-support 2025-06-23 14:10:55 -07:00
Matthew Tofano
20429b6852 add MATLAB tags to enable repo map support 2025-06-23 21:24:52 +01:00
contributor
52d04430db feat: Auto-create parent directories for chat history files
This prevents aider startup errors like:
```
Warning: Unable to write to chat history file .chat/.aider.chat.history.md.
[Errno 2] No such file or directory: '.chat/.aider.chat.history.md'
```
2025-06-23 14:22:10 +03:00
Paul Gauthier (aider)
f16110717b fix: Ensure pip is available before installation 2025-06-20 14:23:04 -07:00
Paul Gauthier
a2d345fe3d docs: Condense docstring for think_tokens command 2025-06-20 14:08:41 -07:00
Paul Gauthier (aider)
1bdd4f0269 style: Format code 2025-06-20 14:08:09 -07:00
Paul Gauthier (aider)
9188cedc72 style: Fix line length in cmd_think_tokens docstring 2025-06-20 14:08:05 -07:00
Paul Gauthier (aider)
fdb49e18cd docs: Add Hacker News quote to Kind Words section 2025-06-20 14:01:47 -07:00
Paul Gauthier (aider)
ae927d85f0 style: Use triple quotes for docstring 2025-06-20 13:45:31 -07:00
Paul Gauthier
a1c2eeb88a style: Line wrap long string literals 2025-06-20 13:45:12 -07:00
Paul Gauthier
caf212c8d1 bump deps 2025-06-20 13:43:37 -07:00
Paul Gauthier
a29ae3ef37 Merge branch 'main' of github.com:Aider-AI/aider 2025-06-20 13:43:04 -07:00
paul-gauthier
90f9c813a0 Update analytics.md 2025-06-20 05:39:56 -07:00
paul-gauthier
9fdc6d4a44 Merge pull request #4254 from KennyDizi/main 2025-06-20 05:34:18 -07:00
Trung Dinh
bb1b9e8e2d Add meta data for openrouter/google/gemini-2.5-pro 2025-06-20 17:04:30 +07:00
Trung Dinh
0c480b7ea4 Support model openrouter/google/gemini-2.5-pro official 2025-06-20 17:04:13 +07:00
paul-gauthier
3cb120e0a9 Merge pull request #4242 from nims11/update-gemini
Update gemini models in model-settings.yml
2025-06-19 14:56:39 -07:00
Nimesh Ghelani
1677db3ca7 Add gemini model metadata 2025-06-19 12:42:26 +00:00
Nimesh Ghelani
ae94521242 Update gemini models in model-settings.yml 2025-06-18 12:46:34 +00:00
paul-gauthier
f8855ebc58 Merge pull request #4236 from daniel-sc/patch-1 2025-06-17 03:31:09 -07:00
Daniel Schreiber
262117d124 doc: add correct path for github copilot token for windows users 2025-06-17 11:39:18 +02:00
paul-gauthier
72c23800a9 Merge pull request #4228 from maliayas/reset-thinking-tokens 2025-06-15 16:52:38 -07:00
Ali Ayas (claude-sonnet-4-20250514)
e91efda8fe feat: add support for disabling thinking tokens with value 0 2025-06-16 01:13:47 +03:00
Paul Gauthier
1daeb01ff0 Merge branch 'main' of github.com:Aider-AI/aider 2025-06-13 06:15:28 -07:00
paul-gauthier
2df4beb6e9 Merge pull request #4022 from ei-grad/fix-vertex-ai 2025-06-12 09:27:20 -07:00
Andrew Grigorev
e54ac087cb fix: Vertex AI model names use vertex_ai/ prefix
Don't be confused with `llm_provider` which is `vertex_ai-language-models`
340a0453d3/litellm/__init__.py (L509)
2025-06-12 18:54:21 +03:00
paul-gauthier
17d40a62c9 Merge pull request #4210 from solatis/main 2025-06-10 19:28:54 -07:00
Leon Mergen
67e190c8d1 Adds support for openai/o3-pro 2025-06-11 08:53:20 +07:00
Paul Gauthier
5562caae0c copy 2025-06-09 06:41:04 -07:00
Paul Gauthier
d55beb5f24 fix: Adjust analytics repo file count condition 2025-06-09 06:39:11 -07:00
Paul Gauthier
df5b780d6c Merge branch 'main' of github.com:Aider-AI/aider 2025-06-09 06:38:00 -07:00
paul-gauthier
3e07d068ad Merge pull request #4199 from holoskii/large-repo-speedup
Skip expensive `get_tracked_files` call if `skip_sanity_check_repo` is true
2025-06-09 06:37:53 -07:00
Paul Gauthier
47ddce3e1b chore: Add DeepSeek R1 benchmark results 2025-06-09 06:34:26 -07:00
Paul Gauthier
e256ffd2c6 chore: Add Gemini 2.5 Pro results to leaderboard 2025-06-09 06:28:12 -07:00
Makar Ivashko
7a83f038d8 Skip expensive get_tracked_files call if skip_sanity_check_repo is true 2025-06-09 10:09:06 +03:00
Paul Gauthier (aider)
990a0566bb fix: Remove unused mock_stdout in tests 2025-06-08 10:19:47 -07:00
Paul Gauthier (aider)
0ac6068e1d fix: Remove unused mock_stdout in test_main 2025-06-08 10:19:01 -07:00
Paul Gauthier (aider)
1953c9815a fix: Remove unused mock_stdout in tests 2025-06-08 10:17:45 -07:00
Paul Gauthier
cc8be1453f style: Add whitespace in tests 2025-06-08 10:17:28 -07:00
Paul Gauthier
789aab8417 Merge branch 'main' of github.com:Aider-AI/aider 2025-06-08 10:17:09 -07:00
Paul Gauthier
226e23f06d chore: update max tokens for deepseek-coder 2025-06-08 10:17:02 -07:00
paul-gauthier
150711d7e0 Merge pull request #4182 from wietsevenema/main
fix: Correct Vertex AI model name prefixes in settings
2025-06-08 10:16:28 -07:00
paul-gauthier
8d48def24d Merge pull request #4193 from tanavamsikrishna/main 2025-06-08 07:11:31 -07:00
Vamsi Talupula
4c50fc6d69 Let 'rich' use code_theme as inline_code_theme 2025-06-08 17:30:12 +05:30
Wietse Venema
e67c9327fd fix: Correct Vertex AI model name prefixes in settings 2025-06-07 14:31:00 +02:00
paul-gauthier
837b8a93e9 Merge pull request #3609 from omarcinkonis/main 2025-06-07 05:16:45 -07:00
Paul Gauthier
4c161f9e12 build: Pin networkx to <3.5 for py3.10 compatibility 2025-06-06 09:43:25 -07:00
Paul Gauthier
f827f22f7a cleanup 2025-06-06 09:31:34 -07:00
Paul Gauthier
3064477cb8 bump deps 2025-06-06 09:30:56 -07:00
Paul Gauthier (aider)
a7ccdaf279 feat: Add thinking_tokens setting to Gemini 2.5 Pro 06-05 models 2025-06-06 09:29:13 -07:00
Paul Gauthier
2bc71cfd71 copy 2025-06-06 09:28:24 -07:00
Paul Gauthier
6b7a0565e9 Merge branch 'main' of github.com:Aider-AI/aider 2025-06-06 09:28:12 -07:00
Paul Gauthier (aider)
8c1ae95f87 chore: Add metadata for gemini-2.5-pro-preview-06-05 2025-06-06 09:27:54 -07:00
Paul Gauthier (aider)
c0509add21 chore: Update gemini alias to use 06-05 model 2025-06-06 06:54:19 -07:00
Paul Gauthier (aider)
77472e5913 feat: Add gemini-2.5-pro-preview-06-05 model settings 2025-06-06 06:53:57 -07:00
paul-gauthier
836aaece4f Merge pull request #4172 from jesstelford/patch-1 2025-06-05 07:51:45 -07:00
Jess Telford
c4fcc5ad70 VSCode Copilot no longer writes out tokens 2025-06-05 16:55:21 +10:00
Paul Gauthier
b259226770 lint 2025-06-03 09:27:57 -07:00
Paul Gauthier
db0f7d158d Merge branch 'main' of github.com:Aider-AI/aider 2025-06-03 09:27:42 -07:00
paul-gauthier
b9a9b4cf61 Merge pull request #4163 from vinnymac/vt/copilot-token-debug 2025-06-03 09:22:51 -07:00
Vincent Taverna
29874f1222 feat: validation and errors for copilot requests 2025-06-03 11:50:37 -04:00
paul-gauthier
7897d027d4 Merge pull request #4161 from lreeves/main
Use system prompt prefix for commit messages
2025-06-03 08:13:57 -07:00
Luke Reeves
09b2d49f11 Use system prompt prefix for commit messages
I've been using Qwen3 with reasoning disabled via a /no_think in the
system prompt prefix. I found that the commit message generation was
ignoring this setting. This change updates the commit message generation
loop to incorporate that setting if defined.
2025-06-03 10:30:42 -04:00
paul-gauthier
295122fc97 Merge pull request #4057 from emmanuel-ferdman/main 2025-06-02 14:03:17 -07:00
paul-gauthier
fa0aa9459b Merge pull request #4156 from stackbuilders/always_pass_extra_headers_to_copilot_models 2025-06-02 07:06:10 -07:00
Sebastian Estrella
c67f6905a5 fix: Always pass extra_headers to Copilot models 2025-06-02 08:39:48 -05:00
paul-gauthier
3266eaca91 Merge pull request #4150 from muravvv/fix_encoding
Fix issues on repositories with non-Unicode encodings
2025-06-01 12:46:17 -07:00
muravvv
bfaad12cac add missing encoding conversion for diff contents 2025-06-01 22:31:43 +03:00
muravvv
395188043b set fixed utf-8 encoding for llm history log 2025-06-01 20:15:51 +03:00
paul-gauthier
484b8a3603 Merge pull request #4146 from ktakayama/issues/4049-commit-language 2025-06-01 05:20:22 -07:00
Kyosuke Takayama
6eaf75f760 test: add test for commit-language option 2025-06-01 19:29:28 +09:00
Kyosuke Takayama
91f34e37f7 docs: add commit-language option to config and documentation files 2025-06-01 19:09:39 +09:00
Kyosuke Takayama
7ffd9c1859 feat: add commit language option for commit message localization 2025-06-01 18:52:38 +09:00
Paul Gauthier (aider)
0bb0f169d2 docs: Add link to release notes 2025-05-30 17:11:21 -07:00
Paul Gauthier
45ad3cdf47 copy 2025-05-30 16:32:21 -07:00
Paul Gauthier
fc30409f74 blame 2025-05-30 16:31:26 -07:00
Paul Gauthier
6d872b6dc0 copy 2025-05-30 16:30:10 -07:00
Paul Gauthier
6fdc956b9e set version to 0.84.1.dev 2025-05-30 16:27:25 -07:00
Paul Gauthier
196721d27d version bump to 0.84.0 2025-05-30 16:27:24 -07:00
Paul Gauthier (aider)
e331a967a6 fix: Update expected OpenRouter costs in tests 2025-05-30 15:57:45 -07:00
Paul Gauthier (aider)
48376e59c2 style: Apply formatting 2025-05-30 15:07:32 -07:00
Paul Gauthier (aider)
52510c7da5 test: Update OpenRouter default model expectations 2025-05-30 15:07:29 -07:00
Paul Gauthier
c24798c44f Merge branch 'main' of github.com:Aider-AI/aider 2025-05-30 14:46:36 -07:00
Paul Gauthier
6085be5883 copy 2025-05-30 14:46:28 -07:00
Paul Gauthier (aider)
05c56fe904 fix: Fix OpenRouter token cost calculation 2025-05-30 14:33:34 -07:00
Paul Gauthier
a7afbd0708 feat: Add claude-opus-4 and update default OpenRouter models 2025-05-30 14:30:10 -07:00
Paul Gauthier (aider)
3f2c403cf0 feat: Add openrouter/anthropic/claude-opus-4 model config 2025-05-30 14:26:50 -07:00
Paul Gauthier
d7504bed21 copy 2025-05-30 14:25:35 -07:00
paul-gauthier
119a44debe Merge pull request #4114 from therealmarv/increase-deepseek-v3-openrouter-context
increase context window of Deepseek V3 to new OpenRouter limits
2025-05-27 13:33:42 -07:00
therealmarv
87dee0a5f2 reduce output tokens again 2025-05-27 23:18:45 +03:00
therealmarv
1d0e463d83 increase context window of Deepseek V3 to new OpenRouter limits 2025-05-27 23:02:11 +03:00
Paul Gauthier
8304029b92 lint 2025-05-26 16:29:28 -07:00
Paul Gauthier
ef2986a231 Merge branch 'main' of github.com:Aider-AI/aider 2025-05-26 16:29:14 -07:00
Paul Gauthier
b79a777936 copy 2025-05-26 16:29:10 -07:00
Paul Gauthier
9c9eedd9c5 chore: Update polyglot leaderboard data for gemini-2.5-flash 2025-05-26 12:18:22 -07:00
paul-gauthier
ebaad9d865 Merge pull request #4092 from noitcudni/main 2025-05-26 10:43:53 -07:00
paul-gauthier
d922023815 Merge pull request #4096 from KennyDizi/main 2025-05-26 10:41:33 -07:00
Paul Gauthier
acebc11237 chore: Update model names in polyglot leaderboard 2025-05-26 08:56:35 -07:00
Paul Gauthier
214b811ef9 chore: Add new polyglot benchmark results 2025-05-26 08:56:01 -07:00
Trung Dinh
de9df51b47 Change max_tokens to 32000 for claude-sonnet-4-20250514 family model 2025-05-26 11:17:50 +07:00
Paul Gauthier
3194a35230 feat: Add Gemini 2.5 Flash model and leaderboard data 2025-05-25 16:00:07 -07:00
Paul Gauthier
a8568c3c4f build: Update website source path in Dockerfile 2025-05-25 15:30:30 -07:00
Paul Gauthier (aider)
114ec42563 feat: Add Claude Opus 4 provider variants to model-settings.yml 2025-05-25 15:03:41 -07:00
Paul Gauthier (aider)
f7df96d224 feat: Add missing Sonnet 4 models to settings 2025-05-25 15:01:43 -07:00
Paul Gauthier
79edb0e1e0 added opus polyglot 2025-05-25 14:57:49 -07:00
Lih Chen
5a0951caaf Refresh Github's open api key automatically 2025-05-25 14:54:03 -07:00
Paul Gauthier (aider)
6b2bcf651e fix: Update expected model name for 'opus' alias test 2025-05-25 13:15:15 -07:00
Paul Gauthier (aider)
fea0ff189f test: Update sonnet model alias test 2025-05-25 13:14:47 -07:00
Paul Gauthier
803a8db60c noop 2025-05-25 12:52:47 -07:00
Paul Gauthier
414b4e3882 feat: Add new Claude models and update aliases 2025-05-25 12:51:45 -07:00
Paul Gauthier (aider)
a17599152f feat: Add Claude Sonnet 4 settings for multiple providers 2025-05-25 12:49:51 -07:00
Paul Gauthier
7b9d8e6ba7 feat: add claude-opus-4-20250514 model settings 2025-05-25 12:49:47 -07:00
Paul Gauthier
9ef3211365 proper pin for configargparse 2025-05-24 15:44:31 -07:00
Paul Gauthier
d9bf69041c Revert "bump deps"
This reverts commit ef3f8bb301.
2025-05-24 15:43:50 -07:00
Paul Gauthier
e3cb907767 claude-sonnet-4-20250514 ex-user 2025-05-24 15:06:57 -07:00
Paul Gauthier
ef3f8bb301 bump deps 2025-05-24 13:33:19 -07:00
Paul Gauthier
03a489ea35 set version to 0.83.3.dev 2025-05-23 16:02:30 -07:00
Paul Gauthier
81389b87d7 version bump to 0.83.2 2025-05-23 16:02:26 -07:00
Paul Gauthier
0d8ff295d6 copy 2025-05-23 15:48:36 -07:00
Paul Gauthier
6176a8dee3 Patch yanked configargparse 1.7 #4072 2025-05-23 15:24:03 -07:00
Paul Gauthier
299e6ae7a2 Revert "bump deps"
This reverts commit cb88b7e62a.
2025-05-23 15:20:40 -07:00
Paul Gauthier
0b1d49d630 Revert "drop pin of torch"
This reverts commit 2b9e669930.
2025-05-23 15:20:27 -07:00
Paul Gauthier
037a36edba Revert "unpin llama-index-core"
This reverts commit 66bc9cf292.
2025-05-23 15:20:13 -07:00
Paul Gauthier
66bc9cf292 unpin llama-index-core 2025-05-23 14:59:09 -07:00
Paul Gauthier
2b9e669930 drop pin of torch 2025-05-23 14:42:09 -07:00
Paul Gauthier
cb88b7e62a bump deps 2025-05-23 14:29:57 -07:00
Paul Gauthier
4e9943f2aa copy 2025-05-23 14:29:42 -07:00
Emmanuel Ferdman
999c292482 fix: display marker on error
Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>
2025-05-21 17:15:45 -07:00
Paul Gauthier
9f5018e89e YAML -> yaml 2025-05-21 09:58:54 -07:00
Garrett Hopper
59dbce8575 Add Clojure repomap queries 2025-05-15 12:39:23 -05:00
Paul Gauthier (aider)
3caab85931 fix: Mark unused variable in test 2025-05-13 13:44:59 -07:00
Paul Gauthier
756372809e test: Update tests for git integration 2025-05-13 13:44:23 -07:00
Paul Gauthier (aider)
6aa05ab11c style: Format test file 2025-05-13 13:42:04 -07:00
Paul Gauthier (aider)
9cf373039e test: Add test for skipping gitignored files on init 2025-05-13 13:41:58 -07:00
Paul Gauthier (aider)
bc1272f029 fix: base coder not ignoring gitignore if --file is used. 2025-05-13 13:38:18 -07:00
Paul Gauthier
0049e78250 Merge branch 'main' of github.com:Aider-AI/aider 2025-05-12 13:20:59 -07:00
paul-gauthier
56b45ce1d3 Merge pull request #4008 from facelezzzz/main
fix: Fix #3987 Pass the coder object to repo.commit
2025-05-12 09:44:39 -07:00
wangboxue
bdd67eb229 fix: Fix #3987 Pass the coder object to repo.commit 2025-05-12 11:56:39 +08:00
Paul Gauthier (aider)
57020a2d5e test: Assert specific stderr messages for invalid edit format 2025-05-11 08:16:08 -07:00
Paul Gauthier (aider)
6b9045a2a2 fix: Fix F841 unused variable in test 2025-05-11 08:15:19 -07:00
Paul Gauthier (aider)
5f24a0013a test: Fix invalid edit format test assertion 2025-05-11 08:15:03 -07:00
Paul Gauthier (aider)
b79052501d style: Shorten comment to fix E501 2025-05-11 08:13:27 -07:00
Paul Gauthier (aider)
9e0d7d9c46 style: Fix code style in test 2025-05-11 08:13:18 -07:00
Paul Gauthier (aider)
a53ab7d937 fix: Correct test for invalid --edit-format argument 2025-05-11 08:13:11 -07:00
Paul Gauthier
c055602c6f Merge branch 'main' into completions 2025-05-11 08:01:15 -07:00
Paul Gauthier
170e8fc9a1 Merge branch 'main' of github.com:Aider-AI/aider 2025-05-11 08:01:03 -07:00
paul-gauthier
ee177054b8 Merge pull request #3993 from savioursho/file-path-completion
feat: Enable file completion for all file-related arguments
2025-05-11 08:00:49 -07:00
Paul Gauthier
f018b5fab5 include pip in uv installs 2025-05-11 07:56:55 -07:00
savioursho
5a29ba03dc Merge branch 'Aider-AI:main' into file-path-completion 2025-05-11 20:06:30 +09:00
Paul Gauthier (aider)
035d99d3d3 fix: Remove unused import Coder 2025-05-10 19:45:04 -07:00
Paul Gauthier (aider)
702eff1033 refactor: Get edit format choices from coder classes 2025-05-10 19:44:44 -07:00
Paul Gauthier (aider)
97f3885357 chore: Apply linter rules 2025-05-10 19:42:28 -07:00
Paul Gauthier (aider)
f8653613bc feat: Add shell completion for edit format options 2025-05-10 19:42:22 -07:00
Paul Gauthier (aider)
b1d47c47d9 chore: Add shtab file completions to args 2025-05-10 17:56:29 -07:00
Paul Gauthier
2c4a126093 copy 2025-05-10 17:13:36 -07:00
Paul Gauthier (aider)
cdd1546243 docs: Improve GitHub Copilot connection docs tone and structure 2025-05-10 17:12:55 -07:00
Paul Gauthier
6a3bb0f4ec docs: Remove closing line and clarify Copilot billing 2025-05-10 17:12:52 -07:00
Paul Gauthier (aider)
24c0fbd326 docs: Add doc page for GitHub Copilot model access 2025-05-10 17:10:25 -07:00
Paul Gauthier
7b9eae117f docs: Add GitHub LLM docs 2025-05-10 17:10:23 -07:00
Paul Gauthier (aider)
512b4d891b chore: Remove unused imports in test_openrouter.py 2025-05-10 12:57:14 -07:00
Paul Gauthier (aider)
a6b0f43dce chore: Run linter 2025-05-10 12:56:13 -07:00
Paul Gauthier (aider)
e8d9ae9a1f test: add tests for OpenRouter model info handling 2025-05-10 12:56:08 -07:00
Paul Gauthier
2ab0074915 test: Add OpenRouter tests 2025-05-10 12:56:06 -07:00
Paul Gauthier (aider)
225e01717c feat: Show active model metadata in /settings command 2025-05-10 12:54:11 -07:00
Paul Gauthier (aider)
4d39b88110 style: Reorder imports in models.py 2025-05-10 12:50:41 -07:00
Paul Gauthier (aider)
5052150e2e feat: Add local cache for OpenRouter models 2025-05-10 12:50:34 -07:00
Paul Gauthier
d8fbd9cbd3 feat: Add OpenRouter API support 2025-05-10 12:50:32 -07:00
Paul Gauthier
53cda2cc10 set version to 0.83.2.dev 2025-05-10 12:36:47 -07:00
Paul Gauthier
543e5570ae version bump to 0.83.1 2025-05-10 12:36:45 -07:00
Paul Gauthier
62c7e15a36 copy 2025-05-10 12:33:40 -07:00
Paul Gauthier
17a2773a22 refactor: Validate locale language result 2025-05-10 12:28:51 -07:00
Paul Gauthier (aider)
b8758ca791 test: Fix mock for babel.Locale in test_normalize_language 2025-05-10 11:55:03 -07:00
Paul Gauthier (aider)
bf9522a2fb style: Format test file 2025-05-10 11:53:08 -07:00
Paul Gauthier (aider)
ddc8621d6e fix: Correctly normalize hyphenated language codes 2025-05-10 11:53:00 -07:00
Paul Gauthier (aider)
7875de078a fix: Remove unused import/var and fix line length in test 2025-05-10 11:46:49 -07:00
Paul Gauthier (aider)
ea1189b8ec style: Format test_coder.py 2025-05-10 11:46:27 -07:00
Paul Gauthier (aider)
1127b8b559 test: Add tests for user language detection and normalization 2025-05-10 11:46:17 -07:00
Paul Gauthier
64f218a06e ask prompt 2025-05-10 11:43:37 -07:00
Paul Gauthier (aider)
efde8e867e fix: Prevent "Reply in C." instruction for C/POSIX locales 2025-05-10 11:43:35 -07:00
Paul Gauthier
f815f0377e copy 2025-05-10 07:52:39 -07:00
Paul Gauthier (aider)
883aa9e03d docs: Include platform in testimonial link text 2025-05-10 07:45:43 -07:00
Paul Gauthier (aider)
2a410fab81 docs: Add platform/community to kind words in README 2025-05-10 07:24:33 -07:00
Paul Gauthier
34409311a3 chore: Adjust spinner text and spinner timing 2025-05-10 07:21:21 -07:00
Paul Gauthier (aider)
97379aa02f fix: Update Spinner import path 2025-05-10 07:11:08 -07:00
Paul Gauthier (aider)
ee4e9c9711 refactor: Remove unused time import 2025-05-10 07:10:28 -07:00
Paul Gauthier (aider)
7d3c817664 style: apply code formatting 2025-05-10 07:10:19 -07:00
Paul Gauthier (aider)
8c755bf032 refactor: move Spinner class to waiting module 2025-05-10 07:10:12 -07:00
saviour
0b112e948f feat: Enable file completion for all file-related arguments 2025-05-10 21:38:08 +09:00
Paul Gauthier (aider)
c11d21a230 style: apply linter fixes 2025-05-09 18:08:04 -07:00
Paul Gauthier (aider)
a9cb1a9d61 chore: Move commit message spinner into model loop and show model name 2025-05-09 18:07:58 -07:00
Paul Gauthier (aider)
43cd0164e0 style: Apply linter formatting 2025-05-09 18:07:05 -07:00
Paul Gauthier (aider)
49b3f85cc5 feat: Add spinner when generating commit message 2025-05-09 18:07:00 -07:00
Paul Gauthier
3daf7d4df3 copy 2025-05-09 18:04:04 -07:00
Paul Gauthier
3dcb23c193 qwen3 whole official api 2025-05-09 18:03:17 -07:00
Paul Gauthier
cad31b638b copy 2025-05-09 15:57:04 -07:00
Paul Gauthier
7fbe0d25f5 Merge branch 'main' into qwen3 2025-05-09 15:51:55 -07:00
Paul Gauthier
637a31e083 blame 2025-05-09 15:51:13 -07:00
Paul Gauthier
f928ffc3fc set version to 0.83.1.dev 2025-05-09 15:41:07 -07:00
Paul Gauthier
23cb604e6e version bump to 0.83.0 2025-05-09 15:41:04 -07:00
Paul Gauthier
09880ee8f4 qwen3 official 2025-05-09 15:15:41 -07:00
Paul Gauthier
425fb6d7a8 copy 2025-05-09 13:38:17 -07:00
Paul Gauthier
28d87767cd update discord invite link 2025-05-09 13:37:54 -07:00
Paul Gauthier
ed262b8b06 Revert "refactor: Handle KeyboardInterrupt in get_repo_map"
This reverts commit 9d74e8c730.
2025-05-09 10:27:22 -07:00
Paul Gauthier
7f30320566 chore: Disable pretty printing in benchmark I/O 2025-05-09 10:07:21 -07:00
Paul Gauthier (aider)
9d74e8c730 refactor: Handle KeyboardInterrupt in get_repo_map 2025-05-09 10:05:59 -07:00
Paul Gauthier
1b2eeaff56 fix: Ensure cursor is shown on first Ctrl+C 2025-05-09 10:05:56 -07:00
Paul Gauthier (aider)
0632c7a90f chore: reorder imports 2025-05-09 10:04:14 -07:00
Paul Gauthier (aider)
c806f18698 fix: Show cursor on KeyboardInterrupt exit 2025-05-09 10:04:08 -07:00
Paul Gauthier (aider)
91d7fbd659 fix: Catch KeyboardInterrupt in main and end spinner 2025-05-09 09:51:44 -07:00
Paul Gauthier (aider)
fcc85a7ae6 fix: Update test mocks for get_commit_message signature 2025-05-09 09:17:59 -07:00
Paul Gauthier
dbfba029af copy 2025-05-09 09:02:42 -07:00
Paul Gauthier
88fba5f20b bump deps while dropping py3.9 support 2025-05-09 09:01:27 -07:00
Paul Gauthier (aider)
f7a073961c ci: Drop Python 3.9 from CI matrix 2025-05-09 08:59:16 -07:00
Paul Gauthier
f8c154edce drop pinned networx and scipy and therefore py3.9 support #3973 2025-05-09 08:57:08 -07:00
Paul Gauthier (aider)
c6ad5c8cd2 build: Drop support for Python 3.9 2025-05-09 08:56:27 -07:00
Paul Gauthier (aider)
af9ae849bd docs: Add HN testimonial to README 2025-05-09 08:51:44 -07:00
Paul Gauthier
64b4d13880 improve history prompt 2025-05-09 08:29:33 -07:00
Paul Gauthier (aider)
6620141420 chore: Remove plain git log from update-history script 2025-05-09 08:21:52 -07:00
Paul Gauthier
d79bc2c05b refactor: Move blame calculation after line counts 2025-05-09 08:21:50 -07:00
Paul Gauthier
9978f6c51e copy 2025-05-09 08:19:20 -07:00
Paul Gauthier
5be642fbec show repomap token progress 2025-05-09 08:18:31 -07:00
Paul Gauthier (aider)
9f1ef3f49f chore: Display line counts before calling aider 2025-05-09 08:14:02 -07:00
Paul Gauthier
a3562d1d62 feat: Forward script args to aider command 2025-05-09 08:14:00 -07:00
Paul Gauthier (aider)
4e608dbd77 refactor: Use sys.argv instead of argparse for model arg 2025-05-09 08:12:11 -07:00
Paul Gauthier (aider)
3f49acf390 feat: Allow specifying aider model in update-history.py 2025-05-09 08:10:39 -07:00
Paul Gauthier
77deb35022 chore: Add model option to update history script 2025-05-09 08:10:36 -07:00
Paul Gauthier (aider)
1a7960810c style: Fix E501 line length in spinner comments 2025-05-09 06:57:32 -07:00
Paul Gauthier (aider)
766a41d5de style: Apply formatting 2025-05-09 06:57:23 -07:00
Paul Gauthier (aider)
df967e4b41 feat: Clip spinner output to console width 2025-05-09 06:57:18 -07:00
Paul Gauthier (aider)
781ed90653 fix: Clear to end of line when spinner updates 2025-05-09 06:54:10 -07:00
Paul Gauthier (aider)
b9885bb76d refactor: refactor 'Updating repo map' text to constant 2025-05-09 06:53:58 -07:00
Paul Gauthier
11480f6110 chore: Add item name to repo map progress 2025-05-09 06:53:57 -07:00
Paul Gauthier (aider)
2bc9386876 feat: Add optional text param to Spinner.step 2025-05-09 06:50:42 -07:00
Paul Gauthier
04cbe87caa style: Update spinner unicode palette 2025-05-09 06:48:26 -07:00
Paul Gauthier (aider)
4c959f4542 chore: Print messages when verbose in simple_send 2025-05-09 06:21:05 -07:00
Paul Gauthier (aider)
8652fcf86e style: Remove empty lines 2025-05-09 06:17:55 -07:00
Paul Gauthier (aider)
23714d7db6 feat: Add user language instruction to commit prompt 2025-05-09 06:17:49 -07:00
Paul Gauthier (aider)
81b86441fd feat: Hide cursor when spinner is active 2025-05-09 06:01:48 -07:00
Paul Gauthier (aider)
edb3bf84cc chore: Adjust spinner ascii frame width 2025-05-08 19:52:12 -07:00
Paul Gauthier
4d5852a30e chore: Refine ASCII spinner animation 2025-05-08 19:49:19 -07:00
Paul Gauthier (aider)
7a5877ea50 style: Format spinner frames 2025-05-08 19:28:35 -07:00
Paul Gauthier (aider)
52ae22bcf8 Refactor: Update spinner frames definition 2025-05-08 19:28:30 -07:00
Paul Gauthier
4fb2d78011 spinner 2025-05-08 19:21:28 -07:00
Paul Gauthier
c93c22ec98 Merge branch 'main' of github.com:Aider-AI/aider 2025-05-08 17:55:14 -07:00
paul-gauthier
a26a3145ba Merge pull request #3983 from KebobZ/patch-1
Add Qwen3-235B-A22B-Q5_K_M to qwen3_leaderboard.yml
2025-05-08 17:54:39 -07:00
paul-gauthier
055a3d795a Merge pull request #3982 from cantalupo555/main
refactor: Update OpenRouter Gemini 2.5 Pro Exp model ID
2025-05-08 17:53:44 -07:00
Paul Gauthier
2d34b738bc chore: Update waiting spinner 2025-05-08 17:47:41 -07:00
KebobZ
292aa9bded Add Qwen3-235B-A22B-Q5_K_M to qwen3_leaderboard.yml 2025-05-08 17:36:22 -07:00
Paul Gauthier
4e86a82a08 copy 2025-05-08 17:21:48 -07:00
Paul Gauthier (aider)
784ac79da1 style: Apply formatting 2025-05-08 17:17:07 -07:00
Paul Gauthier (aider)
647f556582 refactor: Use str.translate for spinner unicode mapping 2025-05-08 17:17:02 -07:00
Paul Gauthier
aad6838e15 chore: Improve spinner ASCII animation 2025-05-08 17:17:01 -07:00
Paul Gauthier
95cc362c07 fix: Fix spinner backspace calculation 2025-05-08 17:12:28 -07:00
Paul Gauthier (aider)
9ef506dc25 feat: Continue spinner animation across instances 2025-05-08 17:09:43 -07:00
Paul Gauthier
b236e0c801 style: Improve spinner display order and output 2025-05-08 17:08:07 -07:00
Paul Gauthier
c706663841 fix: Ensure spinner ends on stop 2025-05-08 16:32:07 -07:00
cantalupo555
d7e091f315 refactor: Update OpenRouter Gemini 2.5 Pro Exp model ID 2025-05-08 20:32:00 -03:00
Paul Gauthier
37601eb4b7 copy 2025-05-08 16:27:51 -07:00
Paul Gauthier (aider)
a22772b388 style: remove trailing whitespace 2025-05-08 16:06:50 -07:00
Paul Gauthier (aider)
befff1f22e refactor: Centralize spinner logic in BaseCoder 2025-05-08 16:06:44 -07:00
Paul Gauthier
0864a7ca76 refactor: Prune spinner animation frames and char assignments 2025-05-08 16:00:53 -07:00
Paul Gauthier (aider)
01592afac3 fix: Remove unused variables in Spinner 2025-05-08 15:58:04 -07:00
Paul Gauthier
3a5a46253d feat: redesign spinner animation with tail 2025-05-08 15:57:56 -07:00
Paul Gauthier (aider)
5bb891b2bb refactor: Use pre-defined ASCII frames for spinner animation 2025-05-08 15:51:37 -07:00
Paul Gauthier (aider)
18f702b95a refactor: Simplify spinner animation by pre-rendering frames 2025-05-08 15:48:40 -07:00
Paul Gauthier (aider)
e6a35be5b7 style: Run linter 2025-05-08 15:43:52 -07:00
Paul Gauthier (aider)
6351964bcd fix: Make _stop_waiting_spinner a method of Coder 2025-05-08 15:43:03 -07:00
Paul Gauthier (aider)
ede3061fe0 style: Format imports in base_coder.py 2025-05-08 15:42:30 -07:00
Paul Gauthier (aider)
f1121e3b7c feat: add waiting spinner for non-streaming pretty mode 2025-05-08 15:41:43 -07:00
Paul Gauthier
a1cb86dca3 Revert "feat: Enhance spinner with head and trailing effect"
This reverts commit d3931f67ca.
2025-05-08 15:38:34 -07:00
Paul Gauthier
cf1d58745e Revert "style: Run linter"
This reverts commit 540b2519c2.
2025-05-08 15:38:19 -07:00
Paul Gauthier (aider)
98dc8e5d57 fix: Remove unused threading import 2025-05-08 15:33:34 -07:00
Paul Gauthier (aider)
21a05ead4e refactor: Extract WaitingSpinner to its own module 2025-05-08 15:33:19 -07:00
Paul Gauthier
80f78ee85d feat: add waiting module 2025-05-08 15:33:17 -07:00
Paul Gauthier (aider)
540b2519c2 style: Run linter 2025-05-08 15:32:56 -07:00
Paul Gauthier (aider)
d3931f67ca feat: Enhance spinner with head and trailing effect 2025-05-08 15:32:50 -07:00
Paul Gauthier
b6a32d8682 copy 2025-05-08 15:28:45 -07:00
Paul Gauthier (aider)
023e939798 style: Address flake8 errors 2025-05-08 15:15:17 -07:00
Paul Gauthier
38e7f04e60 lint 2025-05-08 15:13:38 -07:00
Paul Gauthier
b40baaceea do codespell the website 2025-05-08 15:12:57 -07:00
Paul Gauthier
ff549cf9ba Merge branch 'main' of github.com:Aider-AI/aider 2025-05-08 15:09:33 -07:00
paul-gauthier
2c1685bb36 Merge pull request #3823 from mdeweerd/pre-commit-wf
ci: add pre-commit.yml for GitHub Actions
2025-05-08 15:09:16 -07:00
Paul Gauthier
2a61494442 copy 2025-05-08 14:55:53 -07:00
Paul Gauthier (aider)
0af5563e77 style: Fix F841 unused variable in tests 2025-05-08 14:44:07 -07:00
Paul Gauthier
c147571b18 feat: add shell-completions option 2025-05-08 14:43:56 -07:00
Paul Gauthier (aider)
311981f4e5 test: Use os.path.samefile for robust read-only file assertion 2025-05-08 14:39:14 -07:00
Paul Gauthier
79923c954b Revert "fix: Preserve original read-only files across symlinks"
This reverts commit c3d4fdb4c1.
2025-05-08 14:35:08 -07:00
Paul Gauthier
0b4430f228 Revert "fix: Preserve original path spelling for read-only files"
This reverts commit 9297ee982d.
2025-05-08 14:34:56 -07:00
Paul Gauthier (aider)
ee9ad75509 style: apply linter fixes 2025-05-08 14:32:08 -07:00
Paul Gauthier (aider)
920b20b17d feat: add --shell-completions arg for shell completion scripts 2025-05-08 14:31:56 -07:00
Paul Gauthier (aider)
9297ee982d fix: Preserve original path spelling for read-only files 2025-05-08 14:30:31 -07:00
Paul Gauthier
1d5c3c3a2b add shtab 2025-05-08 14:30:27 -07:00
Paul Gauthier (aider)
217b45ae88 fix: Set parser.prog for shtab completion compatibility 2025-05-08 14:29:40 -07:00
MDW
1f6f480864 style(scripts): add flake8 noqa directive to 30k-image.py
This commit adds a flake8 directive to disable the E501 line length check for the 30k-image.py script.
2025-05-08 23:29:38 +02:00
MDW
40a5a88d56 style: remove or ignore unused imports
The following files had unused imports removed:
- `scripts/30k-image.py`
- `scripts/dl_icons.py`
- `scripts/redact-cast.py`
2025-05-08 23:29:18 +02:00
Paul Gauthier (aider)
30097ab859 fix: Exit with status code from main() 2025-05-08 14:29:01 -07:00
MDW
09acfc8147 style(pre-commit): apply python style from pre-commit hooks 2025-05-08 23:28:18 +02:00
Paul Gauthier (aider)
a2ecc5883b feat: add shell completion generation using shtab 2025-05-08 14:28:11 -07:00
MDW
d127d45669 chore: update codespell skip patterns
Update the `skip` patterns in the `pyproject.toml` file to exclude
`tests/fixtures/*` and `aider/website/*`.
2025-05-08 23:27:39 +02:00
MDW
2ebb2103b8 ci: add pre-commit.yml for GitHub Actions
This commit adds a new GitHub Actions workflow configuration file (`pre-commit.yml`) to automate the execution of pre-commit hooks on pull requests and pushes.

The workflow includes steps to install dependencies, cache pre-commit hooks, run the hooks, convert logs to Checkstyle format, save the cache, and upload logs as artifacts.

This setup ensures that code quality checks are enforced consistently across the repository.
2025-05-08 23:27:34 +02:00
Paul Gauthier (aider)
c3d4fdb4c1 fix: Preserve original read-only files across symlinks 2025-05-08 14:25:14 -07:00
Paul Gauthier
e1ab9cc0ab fix: Correct spinner erasure and update animation 2025-05-08 14:19:26 -07:00
Paul Gauthier (aider)
15317a9f4b style: Run linter and apply fixes 2025-05-08 14:09:38 -07:00
Paul Gauthier (aider)
62dc55dd77 feat: Position cursor on scanner char in spinner animation 2025-05-08 14:09:34 -07:00
Paul Gauthier (aider)
20faadcbd9 style: Apply linter fixes 2025-05-08 14:08:11 -07:00
Paul Gauthier (aider)
8f0fa6684d feat: implement Knight Rider style spinner animation 2025-05-08 14:08:06 -07:00
Paul Gauthier (aider)
7a3805d39f test: add tests for /reset and /drop with cloned coder 2025-05-08 14:02:46 -07:00
Paul Gauthier (aider)
4709a539c6 fix: Preserve original read-only files when cloning Commands 2025-05-08 14:01:28 -07:00
Paul Gauthier
8172125931 copy 2025-05-08 13:52:37 -07:00
Paul Gauthier
b8f9d459fb copy 2025-05-08 13:48:58 -07:00
Paul Gauthier
96bc57167f feat: Improve ask prompt to elide unchanging code 2025-05-08 12:35:10 -07:00
Paul Gauthier
606e27a337 copy 2025-05-08 12:35:02 -07:00
Paul Gauthier (aider)
1d7c56b8c5 chore: Reorder imports in mdstream.py 2025-05-08 12:30:11 -07:00
Paul Gauthier (aider)
6e1327f66d feat: Show spinner while waiting for first stream content 2025-05-08 12:30:06 -07:00
Paul Gauthier
82f33c1220 copy 2025-05-08 12:14:41 -07:00
Paul Gauthier
cd7567fcf6 chore: Refine ask mode prompt instructions 2025-05-08 12:08:14 -07:00
Paul Gauthier
e4274aa4f6 copy 2025-05-08 12:08:05 -07:00
Paul Gauthier
acd7309b78 copy 2025-05-08 11:41:51 -07:00
Paul Gauthier
d5ea078f24 copy 2025-05-08 11:34:42 -07:00
Paul Gauthier
8776830306 copy 2025-05-08 11:32:24 -07:00
Paul Gauthier
43dd9ef8a5 tweak qwen3 settings 2025-05-08 11:32:11 -07:00
Paul Gauthier (aider)
f047b2928b style: Format models.py 2025-05-08 11:31:14 -07:00
Paul Gauthier (aider)
d89d500eab chore: Update default settings for Qwen3 235b model 2025-05-08 11:31:07 -07:00
Paul Gauthier (aider)
35fe1df499 feat: Make leaderboard title configurable and set custom title in post 2025-05-08 11:05:40 -07:00
Paul Gauthier
d32d0b7909 chore: Remove last updated date cog code 2025-05-08 11:05:37 -07:00
Paul Gauthier
0a5c1960b3 cleanup 2025-05-08 11:01:15 -07:00
Paul Gauthier (aider)
eef0051b93 chore: Remove temporary comments 2025-05-08 11:01:03 -07:00
Paul Gauthier
b5cde63b37 initial 2025-05-08 11:00:41 -07:00
Paul Gauthier (aider)
043c42b2b4 feat: Create Qwen3 leaderboard data file 2025-05-08 10:59:49 -07:00
Paul Gauthier (aider)
758fa6f67e feat: Add Qwen3 benchmark blog post with leaderboard table 2025-05-08 10:58:26 -07:00
Paul Gauthier
c2fce2699e feat: Add blog post about Qwen3 2025-05-08 10:58:24 -07:00
Paul Gauthier
328584e5f4 together only on OR 2025-05-08 10:39:09 -07:00
Paul Gauthier
f12395f4d3 together 2025-05-08 10:33:50 -07:00
Paul Gauthier
024c3ed46e Merge branch 'main' into qwen3 2025-05-08 09:54:08 -07:00
Paul Gauthier (aider)
3ed897c665 fix: Correct Columns call count assertions in io tests 2025-05-08 09:43:36 -07:00
Paul Gauthier (aider)
bfcff84b28 fix: Patch rich.columns.Columns where it is used 2025-05-08 09:42:18 -07:00
Paul Gauthier (aider)
4124cee722 test: Fix TestInputOutputFormatFiles method signatures 2025-05-08 09:39:22 -07:00
Paul Gauthier (aider)
d18a9f32bc fix: Fix flaky tests for pretty file list formatting 2025-05-08 09:38:21 -07:00
Paul Gauthier (aider)
aef3863c4a fix: Remove unused import in test_io.py 2025-05-08 09:36:33 -07:00
Paul Gauthier (aider)
f31128706d style: Format test_io.py 2025-05-08 09:36:20 -07:00
Paul Gauthier (aider)
1307215b8f test: Test io.format_files_for_input pretty output 2025-05-08 09:36:15 -07:00
Paul Gauthier (aider)
cb380b423e fix: Use rich Text for filenames in prompt header 2025-05-08 09:34:31 -07:00
Paul Gauthier
86d338c811 no_think 2025-05-08 08:53:38 -07:00
Paul Gauthier
dd3ef07881 copy 2025-05-08 08:13:14 -07:00
Paul Gauthier
69f14ace01 copy 2025-05-08 07:58:01 -07:00
Paul Gauthier (aider)
08220f598c style: Format long line in fetch_openrouter_model_info docstring 2025-05-08 07:49:55 -07:00
Paul Gauthier (aider)
9badb711ff style: Run linter on aider/models.py 2025-05-08 07:49:38 -07:00
Paul Gauthier (aider)
90b5f897f9 feat: Add generic rule for qwen3 235b models with diff and repomap 2025-05-08 07:49:33 -07:00
Paul Gauthier
4a14aeb7d9 copy 2025-05-08 07:35:55 -07:00
Paul Gauthier
fef0f1fa3a cleanup 2025-05-08 07:27:08 -07:00
Paul Gauthier
a39cec8e1d feat: Add model settings for openrouter/qwen/qwen3-235b-a22b 2025-05-08 06:52:41 -07:00
Paul Gauthier
c89ac40f56 fix system_prompt_prefix 2025-05-08 06:50:57 -07:00
Paul Gauthier
114a0e5ab9 feat: Add qwen3 leaderboard data for 32b and 235b models 2025-05-08 06:42:12 -07:00
Paul Gauthier
371c82e5bb Merge branch 'main' into qwen3 2025-05-08 06:41:38 -07:00
Paul Gauthier
71338a679e cleanup 2025-05-08 06:41:36 -07:00
Paul Gauthier
aeaf259021 2.5-pro does not support thinking_budget 2025-05-07 21:16:14 -07:00
Paul Gauthier (aider)
bdec02e290 style: Run linter on base_coder.py 2025-05-07 21:08:37 -07:00
Paul Gauthier (aider)
5090f28151 feat: Track total tokens and use in benchmark stats 2025-05-07 21:08:29 -07:00
Paul Gauthier (aider)
a98b531bcc feat: add prompt_tokens and completion_tokens to results summary 2025-05-07 21:02:00 -07:00
Paul Gauthier
8727ffbe68 feat: Add thinking_tokens to Gemini 2.5 model settings 2025-05-07 20:54:58 -07:00
Paul Gauthier
e7de5382fb feat: Add reasoning_effort to Gemini 2.5 models in model_settings.yml 2025-05-07 20:32:11 -07:00
Paul Gauthier
8956eef339 copy 2025-05-07 20:28:50 -07:00
Paul Gauthier
0c236d0035 except 2025-05-07 20:28:46 -07:00
Paul Gauthier
aaacee5d4d copy 2025-05-07 19:28:02 -07:00
Paul Gauthier
da00455388 Merge branch 'main' into gemini0506 2025-05-07 19:22:36 -07:00
Paul Gauthier
03acee1ed2 copy 2025-05-07 19:19:21 -07:00
Paul Gauthier
4ab8faf21e copy 2025-05-07 18:27:35 -07:00
Paul Gauthier
2f45023f59 Merge branch 'main' of github.com:Aider-AI/aider 2025-05-07 18:23:31 -07:00
Paul Gauthier
1d2818a064 cleanup 2025-05-07 18:23:18 -07:00
paul-gauthier
582da0ee44 Merge pull request #3564 from shladnik/auto_openrouter
OpenRouter models parameters fetching directly from their website
2025-05-07 18:23:02 -07:00
Paul Gauthier
592dea0f8c chore: Update weak model name for gemini to 2.5 flash preview 2025-05-07 18:17:16 -07:00
Paul Gauthier
dd8db78680 feat: Add model settings for openrouter qwen3 models 2025-05-07 18:13:44 -07:00
Paul Gauthier
23ce877bd2 feat: Add Qwen3 235B and 32B leaderboard data 2025-05-07 18:12:13 -07:00
Paul Gauthier
8bb971c15d copy 2025-05-07 18:11:09 -07:00
Paul Gauthier
fe20e528b0 pick up grep-ast 0.9.0 for ml/mli 2025-05-07 18:09:09 -07:00
Paul Gauthier
8dd8fb52f4 copy 2025-05-07 18:08:00 -07:00
paul-gauthier
af9fcdcfa8 Merge pull request #3381 from jkeys089/scraper-main-use-playwright
use playwright if available when invoking scraper via cli
2025-05-07 17:30:59 -07:00
paul-gauthier
9990965e82 Merge pull request #3679 from andreypopp/main
feat: add repomap support for ocaml/ocaml_interface
2025-05-07 17:29:47 -07:00
Paul Gauthier
5b52063446 Merge branch 'main' of github.com:Aider-AI/aider 2025-05-07 17:27:04 -07:00
paul-gauthier
b2e3d47d14 Merge pull request #3806 from ei-grad/disable-playwright
feat: Add --disable-playwright flag to prevent Playwright installation and prompts
2025-05-07 17:26:00 -07:00
Paul Gauthier
67cbda3bd5 docs: Explain --attribute-co-authored-by and its interaction 2025-05-07 17:25:29 -07:00
Paul Gauthier
84d6cf937b chore: Mark Gemini 2.5 Pro previews as overeager 2025-05-07 17:13:36 -07:00
Paul Gauthier (aider)
765ac2a14d Feat: Add gemini-2.5-pro-preview-05-06 model entries 2025-05-07 17:11:03 -07:00
Paul Gauthier
1167700a53 copy 2025-05-07 17:09:05 -07:00
paul-gauthier
c6954f9972 Merge pull request #3789 from ei-grad/attribute-co-authored-by
feat: Add Co-authored-by attribution for AI commits
2025-05-07 16:54:46 -07:00
Paul Gauthier
c72e5fcc5e feat: Improve history, faq, and linter tests for Windows and special chars 2025-05-07 16:53:18 -07:00
Paul Gauthier
4ec075d290 copy 2025-05-07 16:44:40 -07:00
Paul Gauthier
60a1a3a8c8 drop pip, bump deps 2025-05-07 16:44:15 -07:00
Paul Gauthier
bf38754846 Merge branch 'main' of github.com:Aider-AI/aider 2025-05-07 16:33:10 -07:00
Paul Gauthier
94197cb25d feat: Add model settings for openrouter/google/gemini-2.5-pro-preview-03-25 2025-05-07 16:32:57 -07:00
paul-gauthier
cbaaf96324 Merge pull request #3869 from titusz/fix/shlex
Fix shlex.quote() use in linter on Windows
2025-05-07 16:23:53 -07:00
Paul Gauthier
96899a140b bump deps 2025-05-07 16:19:19 -07:00
Paul Gauthier (aider)
c756b080e8 style: Run linter on aider/models.py 2025-05-07 16:07:23 -07:00
Paul Gauthier (aider)
a61fb1e23b refactor: Move OpenRouter reasoning params to extra_body 2025-05-07 16:07:19 -07:00
Paul Gauthier (aider)
9660d95ceb feat: Support thinking_tokens and reasoning_effort for OpenRouter models 2025-05-07 16:04:57 -07:00
Paul Gauthier
eabc98b64a copy 2025-05-07 13:57:24 -07:00
Paul Gauthier
5ff3d1a0c5 feat: Update Gemini model aliases to 05-06 preview 2025-05-07 13:40:40 -07:00
Paul Gauthier
b6587de389 chore: Update polyglot leaderboard data 2025-05-07 13:38:50 -07:00
Paul Gauthier
4d9f4e0202 copy 2025-05-07 13:31:40 -07:00
Paul Gauthier
e9d2f527a1 copy 2025-05-07 13:27:13 -07:00
Paul Gauthier
98e6939c48 copy 2025-05-07 13:12:28 -07:00
Paul Gauthier
e3911f8621 copy 2025-05-07 13:08:08 -07:00
Paul Gauthier
efd5f79368 copy 2025-05-07 13:07:06 -07:00
Paul Gauthier
8e84b5c0b1 cleanup 2025-05-07 13:06:04 -07:00
Paul Gauthier
c1dc473ed8 copy 2025-05-07 12:59:57 -07:00
Paul Gauthier
3b08327792 copy 2025-05-07 12:29:44 -07:00
Paul Gauthier (aider)
8b08c5a5f3 fix: Replace placeholders with UTC timestamps in gemini-pricing.md 2025-05-07 12:24:49 -07:00
Paul Gauthier
eedea62ac1 docs: Explain Gemini 2.5 Pro Preview 0325 benchmark pricing error 2025-05-07 12:24:49 -07:00
Paul Gauthier
146f62abcc copy 2025-05-07 12:04:06 -07:00
Paul Gauthier
1c854f2e83 Merge branch 'main' into pricing 2025-05-07 11:54:29 -07:00
Paul Gauthier
d27bb56cf3 try to use litellm.completion_cost 2025-05-07 11:18:19 -07:00
Paul Gauthier
28aeb17cbe copy 2025-05-07 10:07:16 -07:00
Paul Gauthier
b3cf318c5e copy 2025-05-07 09:47:52 -07:00
Paul Gauthier (aider)
4acf65fcfb docs: Link commit hashes to aider and litellm github repos 2025-05-07 09:28:53 -07:00
Paul Gauthier
4c871c6f50 docs: Audit gemini pricing in 0325 benchmark results 2025-05-07 09:28:52 -07:00
Paul Gauthier
d56ce3ae56 copy 2025-05-07 09:17:29 -07:00
Paul Gauthier
5225d7f50c Merge branch 'main' into pricing 2025-05-07 09:11:52 -07:00
Paul Gauthier
41392a1c6e copy 2025-05-07 09:11:48 -07:00
Paul Gauthier (aider)
ca714157b8 fix: Correct typo in gemini pricing post 2025-05-07 09:09:14 -07:00
Paul Gauthier (aider)
9dd2d2a3b1 fix: Update timeline to show UTC time and original timestamp 2025-05-07 09:09:12 -07:00
Paul Gauthier
e53f2f7674 docs: Add post about Gemini pricing 2025-05-07 09:09:11 -07:00
Paul Gauthier
edbfec0ce4 copy 2025-05-07 07:42:25 -07:00
Paul Gauthier
d294e8cd49 add gemini-2.5-pro-preview-05-06 2025-05-07 07:41:51 -07:00
Paul Gauthier
2229bb9817 copy 2025-05-07 07:41:23 -07:00
Titusz
7ef7b6e042 Merge branch 'main' into fix/shlex 2025-05-07 09:28:15 +02:00
Titusz
edc941eb9e Merge branch 'main' into fix/shlex 2025-05-04 13:11:19 +02:00
Vasil Markoukin (aider)
98ee78edf0 feat: add configurable PostHog host and API key parameters 2025-04-30 14:46:54 +03:00
Titusz Pan
8ffe466257 Replace shlex with cross-platform oslex - fixes Aider-AI/aider#3746 2025-04-23 14:40:43 +02:00
Titusz Pan
d9aa3cb2d4 Replace shlex with cross-platform oslex 2025-04-23 14:33:01 +02:00
Titusz Pan
5251a2452c Add test to reproduce linting failure on windows 2025-04-23 14:18:23 +02:00
Titusz Pan
6df2c1595f fix: remove branch filter from Windows tests workflow 2025-04-23 11:20:08 +02:00
Andrew Grigorev
f106993cd1 fix: add --disable-playwright option to suppress Playwright prompts and usage
Co-authored-by: aider (openai/gpt-4.1) <noreply@aider.chat>
2025-04-15 02:35:25 +03:00
Andrew Grigorev
1d42690824 fix: update co-authored-by domain to aider.chat
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 20:52:55 +03:00
Andrew Grigorev
3f94fd5e4e refactor: Simplify access to attribute_co_authored_by
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 20:38:25 +03:00
Andrew Grigorev
165e237be7 chore: remove unnecessary comment in repo.py
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 20:25:01 +03:00
Andrew Grigorev
38dfd6f4f9 docs: clarify --attribute-co-authored-by precedence 2025-04-12 20:07:33 +03:00
Andrew Grigorev
5851d66174 test: improve test clarity with skipIf and assertion messages
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 20:00:44 +03:00
Andrew Grigorev
6a970c3515 test: remove redundant co-authored-by precedence test
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 19:58:29 +03:00
Andrew Grigorev
9e91e8f1b2 test: remove redundant commit attribution tests
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 19:58:06 +03:00
Andrew Grigorev
3e1bc77bf2 test: add tests for commit author/committer attribution logic
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 19:56:18 +03:00
Andrew Grigorev
d991cb6721 test: cover user commit with no committer attribution
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 19:54:56 +03:00
Andrew Grigorev
37a252748a test: Fix commit result assertion in test_noop_commit 2025-04-12 19:47:18 +03:00
Andrew Grigorev
5664b5b195 test: Assert commit return value in more tests
Co-authored-by: aider (vertex_ai/gemini-2.0-flash-lite-001) <noreply@aider.dev>
2025-04-12 19:41:24 +03:00
Andrew Grigorev
278a596bfa docs: clarify commit author/committer/co-authored-by logic
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 19:21:03 +03:00
Andrew Grigorev
ea74f31b3e feat: Explicit author/committer flags override co-authored-by
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 19:09:46 +03:00
Andrew Grigorev
dd4b61da20 test: add test for co-authored-by precedence over author/committer
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 18:26:46 +03:00
Andrew Grigorev
c56e836d22 refactor: simplify commit logic and use context manager for git env
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 18:19:55 +03:00
Andrew Grigorev
427f9c5b00 Revert "chore: Add test comment to dump function"
This reverts commit e951164399.
2025-04-12 18:14:09 +03:00
Andrew Grigorev
aa07e16f18 Revert "chore: Add test comment"
This reverts commit 482e0c2d0b.
2025-04-12 18:14:09 +03:00
Andrew Grigorev
7b8c7edfd5 Revert "chore: Add test comment"
This reverts commit d5671c2879.
2025-04-12 18:14:08 +03:00
Andrew Grigorev
cf7b35f90d Revert "test: add comment for testing"
This reverts commit 072bd30443.
2025-04-12 18:14:08 +03:00
Andrew Grigorev
02bc9a85c0 Revert "chore: add test comment to dump function"
This reverts commit ff8e9850ba.
2025-04-12 18:14:08 +03:00
Andrew Grigorev
e1820522db Revert "chore: add debug prints for attribute_co_authored_by"
This reverts commit d1437b7666.
2025-04-12 18:14:07 +03:00
Andrew Grigorev
0a59c38f31 Revert "chore: add another test comment to prompts"
This reverts commit 15d623f2c0.
2025-04-12 18:14:07 +03:00
Andrew Grigorev
66fdeceb3b Revert "chore: add third test comment"
This reverts commit 316d8f8e9b.
2025-04-12 18:14:06 +03:00
Andrew Grigorev
316d8f8e9b chore: add third test comment
Co-authored-by: aider (vertex_ai/gemini-2.5-pro-exp-03-25) <noreply@aider.dev>
2025-04-12 18:06:09 +03:00
Andrew Grigorev (aider)
15d623f2c0 chore: add another test comment to prompts 2025-04-12 17:57:44 +03:00
Andrew Grigorev (aider)
d1437b7666 chore: add debug prints for attribute_co_authored_by 2025-04-12 17:57:04 +03:00
Andrew Grigorev (aider)
ff8e9850ba chore: add test comment to dump function 2025-04-12 17:55:54 +03:00
Andrew Grigorev (aider)
f648a018a2 fix: Pass attribute_co_authored_by arg to GitRepo constructor 2025-04-12 17:55:13 +03:00
Andrew Grigorev (aider)
072bd30443 test: add comment for testing 2025-04-12 17:53:11 +03:00
Andrew Grigorev (aider)
48f89f226f fix: prevent name modification when using co-authored-by 2025-04-12 17:51:58 +03:00
Andrew Grigorev (aider)
d5671c2879 chore: Add test comment 2025-04-12 17:50:16 +03:00
Andrew Grigorev (aider)
80114e7a24 chore: revert intentional break introduced for testing 2025-04-12 17:48:52 +03:00
Andrew Grigorev (aider)
dede701423 test: intentionally break co-authored-by logic 2025-04-12 17:47:20 +03:00
Andrew Grigorev (aider)
43cb4d68f7 test: Temporarily disable co-author attribution to verify test failure 2025-04-12 17:45:48 +03:00
Andrew Grigorev (aider)
4783ad3a73 feat: add attribute-co-authored-by option for commit attribution 2025-04-12 17:39:49 +03:00
Andrew Grigorev (aider)
482e0c2d0b chore: Add test comment 2025-04-12 17:37:00 +03:00
Andrew Grigorev (aider)
e951164399 chore: Add test comment to dump function 2025-04-12 17:35:45 +03:00
Andrew Grigorev (aider)
c73b987cd0 fix: fix syntax error in commit logic 2025-04-12 17:32:57 +03:00
Andrew Grigorev (aider)
b22c9b8542 feat: implement Co-authored-by attribution option 2025-04-12 17:32:15 +03:00
Andrew Grigorev (aider)
a5327af5e9 test: fix mock setup for co-authored-by commit test 2025-04-12 17:19:04 +03:00
Andrew Grigorev (aider)
192f8bec26 test: fix mock model name setup in co-authored-by test 2025-04-12 17:09:12 +03:00
Andrew Grigorev (aider)
eb28e22891 test: fix mock setup for model name in co-authored-by test 2025-04-12 17:07:41 +03:00
Andrew Grigorev (aider)
b6b8f30378 test: add tests for co-authored-by commit attribution 2025-04-12 16:57:21 +03:00
Andrew Grigorev (aider)
67bb4f9552 feat: add co-authored-by commit attribution 2025-04-12 16:52:45 +03:00
jayesh thakare
23c9d9c34d Merge branch 'Aider-AI:main' into main 2025-04-10 02:35:41 +05:30
jayeshthk
188e9e1114 Optimize head‑truncation loop in summarize_real 2025-04-10 02:29:40 +05:30
Andrey Popp
e980973621 feat: add repomap support for ocaml/ocaml_interface 2025-03-30 22:09:06 +04:00
omarcinkonis
3447f06208 feat: Add --add-gitignore-files flag 2025-03-23 01:15:16 +02:00
Stefan Hladnik (aider)
b3d9e0d1b0 fix: Return empty dict instead of exiting on model availability error 2025-03-18 13:03:32 +07:00
Stefan Hladnik
7c3d96d0e7 fix: Remove debug print statement from ModelInfoManager class 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
cdd730e627 feat: Print error message in red for unavailable models 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
21cca34392 fix: Allow arbitrary characters in model availability check regex 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
d64427d726 feat: Add error handling for unavailable model in response text 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
87ccacb99f fix: Return empty dict if any required parameters are missing 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
b37773c630 style: Update import location and add SSL verification in fetch_openrouter_model_info() 2025-03-18 13:03:32 +07:00
Stefan Hladnik
4765a90f97 fix: Adjust input and output cost calculations to use million scale 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
29587cd07c fix: Update return keys in fetch_openrouter_model_info() to match JSON metadata 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
2651d99676 feat: Update cost extraction to capture non-zero input/output costs 2025-03-18 13:03:32 +07:00
Stefan Hladnik
44e5525e6f style: Remove unnecessary blank lines in ModelInfoManager class 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
5e48f6898d fix: Improve print statement to include model name in parameters output 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
08d48f42ad refactor: Remove BeautifulSoup dependency and use regex to strip HTML tags 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
4600dbcda5 feat: Print parsed model parameters in fetch_openrouter_model_info() method 2025-03-18 13:03:32 +07:00
Stefan Hladnik (aider)
c1b2ff20de feat: Add method to fetch model info from openrouter pages 2025-03-18 13:03:32 +07:00
Jon Keys
c980fd0e77 use playwright if available when invoking scraper via cli 2025-02-25 19:08:02 -08:00
115 changed files with 7773 additions and 1992 deletions

View File

@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
python-version: ["3.10", "3.11", "3.12"]
steps:
- name: Set up Python ${{ matrix.python-version }}

48
.github/workflows/pre-commit.yml vendored Normal file
View File

@@ -0,0 +1,48 @@
---
name: pre-commit
on:
pull_request:
push:
workflow_dispatch:
jobs:
pre-commit:
runs-on: ubuntu-latest
env:
RAW_LOG: pre-commit.log
CS_XML: pre-commit.xml
steps:
- run: sudo apt-get update && sudo apt-get install cppcheck uncrustify
if: false
- uses: actions/checkout@v4
- run: python -m pip install pre-commit
- uses: actions/cache/restore@v4
with:
path: ~/.cache/pre-commit/
key: pre-commit-4|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
- name: Run pre-commit hooks
env:
SKIP: no-commit-to-branch
run: |
set -o pipefail
pre-commit gc
pre-commit run --show-diff-on-failure --color=always --all-files | tee ${RAW_LOG}
- name: Convert Raw Log to Checkstyle format (launch action)
uses: mdeweerd/logToCheckStyle@v2025.1.1
if: ${{ failure() }}
with:
in: ${{ env.RAW_LOG }}
# out: ${{ env.CS_XML }}
- uses: actions/cache/save@v4
if: ${{ ! cancelled() }}
with:
path: ~/.cache/pre-commit/
key: pre-commit-4|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
- name: Provide log as artifact
uses: actions/upload-artifact@v4
if: ${{ ! cancelled() }}
with:
name: precommit-logs
path: |
${{ env.RAW_LOG }}
${{ env.CS_XML }}
retention-days: 2

View File

@@ -25,7 +25,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
python-version: ["3.10", "3.11", "3.12"]
steps:
- name: Check out repository

View File

@@ -25,7 +25,7 @@ jobs:
runs-on: windows-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
python-version: ["3.10", "3.11", "3.12"]
steps:
- name: Check out repository

View File

@@ -15,7 +15,7 @@ jobs:
runs-on: windows-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
python-version: ["3.10", "3.11", "3.12"]
defaults:
run:
shell: pwsh # Use PowerShell for all run steps

3
.gitignore vendored
View File

@@ -15,4 +15,5 @@ aider/_version.py
.venv/
.#*
.gitattributes
tmp.benchmarks/
tmp.benchmarks/
.docker_bash_history

View File

@@ -1,6 +1,121 @@
# Release history
### main branch
### Aider v0.85.4
- Added support for openai/gpt-5
- Fixed analytics to support the latest PostHog SDK event-capture API.
- Disabled temperature when using GPT-5 models for more deterministic outputs.
### Aider v0.85.3
- Bumped dependencies to pick up latest litellm==1.75.0.
### Aider v0.85.2
- Added support for Grok-4 via `xai/grok-4` and `openrouter/x-ai/grok-4` model names.
- Added support for `gemini/gemini-2.5-flash-lite-preview-06-17` model, by Tamir Zahavi-Brunner.
- `/clear` now prints “All chat history cleared.” so you know it worked, by Zexin Yuan.
- `/undo` output now shows only the first line of each commit message, making it easier to read.
- Fixed an issue where new settings for an existing model didn't replace the old ones, by Andrew Grigorev.
- Added support for `openrouter/moonshotai/kimi-k2` model, by Jack Harrington.
### Aider v0.85.1
- Display model announcements with no-arg `/model` command.
### Aider v0.85.0
- Support for Responses API models like o1-pro, o3-pro.
- Updated pricing for o3.
- Added support for new Gemini models including `gemini-2.5-pro`, `gemini-2.5-flash`, and `gemini-2.5-pro-preview-06-05` with thinking tokens support.
- Updated model aliases: `flash` now points to `gemini-2.5-flash` and `gemini` now points to `gemini-2.5-pro`.
- Added `--add-gitignore-files` flag to enable adding files listed in .gitignore to Aider's editing scope, by omarcinkonis.
- Added `--commit-language` option to specify the language for commit messages, by Kyosuke Takayama.
- Enhanced thinking tokens support: can now be disabled by setting to 0, and improved help text with examples.
- Added MATLAB language support for repository maps, by Matthew Tofano.
- Added support for OpenAI o3-pro model across multiple providers.
- Improved GitHub Copilot token handling with better validation and error messages, by Vincent Taverna and Sebastian Estrella.
- Fixed encoding issues in git diff output and LLM history logging.
- Enhanced commit message generation to use system prompt prefixes, by Luke Reeves.
- Improved inline code rendering in Rich markdown output, by Vamsi Talupula.
- Fixed Vertex AI model name prefixes in settings, by Wietse Venema.
- Improved `/read-only` command to resolve literal paths correctly, by Matteo Landi.
- Skip expensive file tracking operations when `--skip-sanity-check-repo` is enabled for better performance, by Makar Ivashko.
- Ensure pip is available before package installation.
- Auto-create parent directories for chat history files to prevent startup errors, by contributor.
- Fixed search block regex to accept optional closing tags when working with HTML content, by Mathis Beer.
- Co-authored-by attribution is now enabled by default for commit messages.
- Added Clojure language support for repository maps, by Garrett Hopper.
- Added custom PostHog analytics configuration options with `--analytics-posthog-host` and `--analytics-posthog-project-api-key` flags, by Vasil Markoukin.
- Optimized chat history summarization performance, by jayeshthk.
- Improved kebab-case identifier recognition in repository maps for better code analysis.
- Increased max tokens for Deepseek models to 65536 for better performance.
- Aider wrote 21% of the code in this release.
### Aider v0.84.0
- Added support for new Claude models including the Sonnet 4 and Opus 4 series (e.g., `claude-sonnet-4-20250514`,
`claude-opus-4-20250514`) across various providers. The default `sonnet` and `opus` aliases were updated to these newer
versions.
- Added support for the `vertex_ai/gemini-2.5-flash-preview-05-20` model.
- Fixed OpenRouter token cost calculation for improved accuracy.
- Updated default OpenRouter models during onboarding to `deepseek/deepseek-r1:free` for the free tier and
`anthropic/claude-sonnet-4` for paid tiers.
- Automatically refresh GitHub Copilot tokens when used as OpenAI API keys, by Lih Chen.
- Aider wrote 79% of the code in this release.
### Aider v0.83.2
- Bumped configargparse to 1.7.1 as 1.7 was pulled.
- Added shell tab completion for file path arguments (by saviour) and for `--edit-format`/`--editor-edit-format` options.
- Improved OpenRouter model metadata handling by introducing a local cache, increasing reliability and performance.
- The `/settings` command now displays detailed metadata for active main, editor, and weak models.
- Fixed an issue where files explicitly added via the command line were not correctly ignored if listed in `.gitignore`.
- Improved automatic commit messages by providing more context during their generation, by wangboxue.
### Aider v0.83.1
- Improved user language detection by correctly normalizing hyphenated language codes (e.g., `en-US` to `en`) and enhancing the validation of locale results.
- Prevented Aider from instructing the LLM to reply in 'C' or 'POSIX' when these are detected as the system locale.
- Displayed a spinner with the model name when generating commit messages.
### Aider v0.83.0
- Added support for `gemini-2.5-pro-preview-05-06` models.
- Added support for `qwen3-235b` models.
- Added repo-map support for OCaml and OCaml interface files, by Andrey Popp.
- Added a spinner animation while waiting for the LLM to start streaming its response.
- Updated the spinner animation to a Knight Rider style.
- 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.
- Commit message prompt specifies the user's language.
- 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`.
- 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.
- 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.
- Improved `/ask` mode to instruct the LLM to elide unchanging code in its responses.
- Ensured web scraping in the GUI also respects Playwright availability and the `--disable-playwright` flag.
- Improved display of filenames in the prompt header using rich Text formatting.
- Enabled `reasoning_effort` for Gemini 2.5 Flash models.
- Added a `--shell-completions` argument to generate shell completion scripts (e.g., for bash, zsh).
- Explicit `--attribute-author` or `--attribute-committer` flags now override the default behavior when `--attribute-co-authored-by` is used, allowing finer control over commit attribution, by Andrew Grigorev.
- Fixed an issue where read-only status of files might not be preserved correctly by some commands (e.g. `/drop` after adding a read-only file).
- The `aider-args` utility (or `python -m aider.args`) now defaults to printing a sample YAML configuration if no arguments are provided.
- Displayed token count progress and the name of the file or identifier being processed during repo map updates.
- Extended the waiting spinner to also show for non-streaming responses and further enhanced its animation with console width clipping, cursor hiding, and a more continuous appearance.
- Dropped support for Python 3.9.
- Aider wrote 55% of the code in this release.
### 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.
@@ -10,9 +125,8 @@
- 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.
### Aider v0.82.2
@@ -369,7 +483,7 @@
- [Aider works with LLM web chat UIs](https://aider.chat/docs/usage/copypaste.html).
- New `--copy-paste` mode.
- New `/copy-context` command.
- [Set API keys and other environment variables for all providers from command line or yaml conf file](https://aider.chat/docs/config/aider_conf.html#storing-llm-keys).
- [Set API keys and other environment variables for all providers from command line or YAML conf file](https://aider.chat/docs/config/aider_conf.html#storing-llm-keys).
- New `--api-key provider=key` setting.
- New `--set-env VAR=value` setting.
- Added bash and zsh support to `--watch-files`.
@@ -537,7 +651,7 @@
### Aider v0.59.1
- Check for obsolete `yes: true` in yaml config, show helpful error.
- Check for obsolete `yes: true` in YAML config, show helpful error.
- Model settings for openrouter/anthropic/claude-3.5-sonnet:beta
### Aider v0.59.0
@@ -547,7 +661,7 @@
- Still auto-completes the full paths of the repo files like `/add`.
- Now supports globs like `src/**/*.py`
- Renamed `--yes` to `--yes-always`.
- Now uses `AIDER_YES_ALWAYS` env var and `yes-always:` yaml key.
- Now uses `AIDER_YES_ALWAYS` env var and `yes-always:` YAML key.
- Existing YAML and .env files will need to be updated.
- Can still abbreviate to `--yes` on the command line.
- Config file now uses standard YAML list syntax with ` - list entries`, one per line.
@@ -754,7 +868,7 @@
- Use `--map-refresh <always|files|manual|auto>` to configure.
- Improved cost estimate logic for caching.
- Improved editing performance on Jupyter Notebook `.ipynb` files.
- Show which config yaml file is loaded with `--verbose`.
- Show which config YAML file is loaded with `--verbose`.
- Bumped dependency versions.
- Bugfix: properly load `.aider.models.metadata.json` data.
- Bugfix: Using `--msg /ask ...` caused an exception.

View File

@@ -27,13 +27,13 @@ cog.out(text)
<a href="https://github.com/Aider-AI/aider/stargazers"><img alt="GitHub Stars" title="Total number of GitHub stars the Aider project has received"
src="https://img.shields.io/github/stars/Aider-AI/aider?style=flat-square&logo=github&color=f1c40f&labelColor=555555"/></a>
<a href="https://pypi.org/project/aider-chat/"><img alt="PyPI Downloads" title="Total number of installations via pip from PyPI"
src="https://img.shields.io/badge/📦%20Installs-2.1M-2ecc71?style=flat-square&labelColor=555555"/></a>
src="https://img.shields.io/badge/📦%20Installs-3.0M-2ecc71?style=flat-square&labelColor=555555"/></a>
<img alt="Tokens per week" title="Number of tokens processed weekly by Aider users"
src="https://img.shields.io/badge/📈%20Tokens%2Fweek-15B-3498db?style=flat-square&labelColor=555555"/>
<a href="https://openrouter.ai/#options-menu"><img alt="OpenRouter Ranking" title="Aider's ranking among applications on the OpenRouter platform"
src="https://img.shields.io/badge/🏆%20OpenRouter-Top%2020-9b59b6?style=flat-square&labelColor=555555"/></a>
<a href="https://aider.chat/HISTORY.html"><img alt="Singularity" title="Percentage of the new code in Aider's last release written by Aider itself"
src="https://img.shields.io/badge/🔄%20Singularity-92%25-e74c3c?style=flat-square&labelColor=555555"/></a>
src="https://img.shields.io/badge/🔄%20Singularity-21%25-e74c3c?style=flat-square&labelColor=555555"/></a>
<!--[[[end]]]-->
</p>
@@ -135,43 +135,46 @@ See the [installation instructions](https://aider.chat/docs/install.html) and [u
### Community & Resources
- [LLM Leaderboards](https://aider.chat/docs/leaderboards/)
- [GitHub Repository](https://github.com/Aider-AI/aider)
- [Discord Community](https://discord.gg/Tv2uQnR88V)
- [Discord Community](https://discord.gg/Y7X7bhMQFV)
- [Release notes](https://aider.chat/HISTORY.html)
- [Blog](https://aider.chat/blog/)
## Kind Words From Users
- *"My life has changed... There's finally an AI coding tool that's good enough to keep up with me... Aider... It's going to rock your world."* — [Eric S. Raymond](https://x.com/esrtweet/status/1910809356381413593)
- *"The best free open source AI coding assistant."* — [IndyDevDan](https://youtu.be/YALpX8oOn78)
- *"The best AI coding assistant so far."* — [Matthew Berman](https://www.youtube.com/watch?v=df8afeb1FY8)
- *"Aider ... has easily quadrupled my coding productivity."* — [SOLAR_FIELDS](https://news.ycombinator.com/item?id=36212100)
- *"It's a cool workflow... Aider's ergonomics are perfect for me."* — [qup](https://news.ycombinator.com/item?id=38185326)
- *"It's really like having your senior developer live right in your Git repo - truly amazing!"* — [rappster](https://github.com/Aider-AI/aider/issues/124)
- *"What an amazing tool. It's incredible."* — [valyagolev](https://github.com/Aider-AI/aider/issues/6#issue-1722897858)
- *"Aider is such an astounding thing!"* — [cgrothaus](https://github.com/Aider-AI/aider/issues/82#issuecomment-1631876700)
- *"It was WAY faster than I would be getting off the ground and making the first few working versions."* — [Daniel Feldman](https://twitter.com/d_feldman/status/1662295077387923456)
- *"THANK YOU for Aider! It really feels like a glimpse into the future of coding."* — [derwiki](https://news.ycombinator.com/item?id=38205643)
- *"It's just amazing. It is freeing me to do things I felt were out my comfort zone before."* — [Dougie](https://discord.com/channels/1131200896827654144/1174002618058678323/1174084556257775656)
- *"This project is stellar."* — [funkytaco](https://github.com/Aider-AI/aider/issues/112#issuecomment-1637429008)
- *"Amazing project, definitely the best AI coding assistant I've used."* — [joshuavial](https://github.com/Aider-AI/aider/issues/84)
- *"I absolutely love using Aider ... It makes software development feel so much lighter as an experience."* — [principalideal0](https://discord.com/channels/1131200896827654144/1133421607499595858/1229689636012691468)
- *"I have been recovering from multiple shoulder surgeries ... and have used aider extensively. It has allowed me to continue productivity."* — [codeninja](https://www.reddit.com/r/OpenAI/s/nmNwkHy1zG)
- *"I am an aider addict. I'm getting so much more work done, but in less time."* — [dandandan](https://discord.com/channels/1131200896827654144/1131200896827654149/1135913253483069470)
- *"After wasting $100 on tokens trying to find something better, I'm back to Aider. It blows everything else out of the water hands down, there's no competition whatsoever."* — [SystemSculpt](https://discord.com/channels/1131200896827654144/1131200896827654149/1178736602797846548)
- *"Aider is amazing, coupled with Sonnet 3.5 it's quite mind blowing."* — [Josh Dingus](https://discord.com/channels/1131200896827654144/1133060684540813372/1262374225298198548)
- *"Hands down, this is the best AI coding assistant tool so far."* — [IndyDevDan](https://www.youtube.com/watch?v=MPYFPvxfGZs)
- *"[Aider] changed my daily coding workflows. It's mind-blowing how a single Python application can change your life."* — [maledorak](https://discord.com/channels/1131200896827654144/1131200896827654149/1258453375620747264)
- *"Best agent for actual dev work in existing codebases."* — [Nick Dobos](https://twitter.com/NickADobos/status/1690408967963652097?s=20)
- *"One of my favorite pieces of software. Blazing trails on new paradigms!"* — [Chris Wall](https://x.com/chris65536/status/1905053299251798432)
- *"Aider has been revolutionary for me and my work."* — [Starry Hope](https://x.com/starryhopeblog/status/1904985812137132056)
- *"Try aider! One of the best ways to vibe code."* — [Chris Wall](https://x.com/Chris65536/status/1905053418961391929)
- *"Aider is hands down the best. And it's free and opensource."* — [AriyaSavakaLurker](https://www.reddit.com/r/ChatGPTCoding/comments/1ik16y6/whats_your_take_on_aider/mbip39n/)
- *"Aider is also my best friend."* — [jzn21](https://www.reddit.com/r/ChatGPTCoding/comments/1heuvuo/aider_vs_cline_vs_windsurf_vs_cursor/m27dcnb/)
- *"Try Aider, it's worth it."* — [jorgejhms](https://www.reddit.com/r/ChatGPTCoding/comments/1heuvuo/aider_vs_cline_vs_windsurf_vs_cursor/m27cp99/)
- *"I like aider :)"* — [Chenwei Cui](https://x.com/ccui42/status/1904965344999145698)
- *"Aider is the precision tool of LLM code gen... Minimal, thoughtful and capable of surgical changes to your codebase all while keeping the developer in control."* — [Reilly Sweetland](https://x.com/rsweetland/status/1904963807237259586)
- *"Cannot believe aider vibe coded a 650 LOC feature across service and cli today in 1 shot."* - [autopoietist](https://discord.com/channels/1131200896827654144/1131200896827654149/1355675042259796101)
- *"Oh no the secret is out! Yes, Aider is the best coding tool around. I highly, highly recommend it to anyone."* [Joshua D Vander Hook](https://x.com/jodavaho/status/1911154899057795218)
- *"thanks to aider, i have started and finished three personal projects within the last two days"* — [joseph stalzyn](https://x.com/anitaheeder/status/1908338609645904160)
- *"Been using aider as my daily driver for over a year ... I absolutely love the tool, like beyond words."* — [koleok](https://discord.com/channels/1131200896827654144/1273248471394291754/1356727448372252783)
- *"aider is really cool"* — [kache (@yacineMTB)](https://x.com/yacineMTB/status/1911224442430124387)
- *"My life has changed... Aider... It's going to rock your world."* — [Eric S. Raymond on X](https://x.com/esrtweet/status/1910809356381413593)
- *"The best free open source AI coding assistant."* — [IndyDevDan on YouTube](https://youtu.be/YALpX8oOn78)
- *"The best AI coding assistant so far."* — [Matthew Berman on YouTube](https://www.youtube.com/watch?v=df8afeb1FY8)
- *"Aider ... has easily quadrupled my coding productivity."* — [SOLAR_FIELDS on Hacker News](https://news.ycombinator.com/item?id=36212100)
- *"It's a cool workflow... Aider's ergonomics are perfect for me."* — [qup on Hacker News](https://news.ycombinator.com/item?id=38185326)
- *"It's really like having your senior developer live right in your Git repo - truly amazing!"* — [rappster on GitHub](https://github.com/Aider-AI/aider/issues/124)
- *"What an amazing tool. It's incredible."* — [valyagolev on GitHub](https://github.com/Aider-AI/aider/issues/6#issue-1722897858)
- *"Aider is such an astounding thing!"* — [cgrothaus on GitHub](https://github.com/Aider-AI/aider/issues/82#issuecomment-1631876700)
- *"It was WAY faster than I would be getting off the ground and making the first few working versions."* — [Daniel Feldman on X](https://twitter.com/d_feldman/status/1662295077387923456)
- *"THANK YOU for Aider! It really feels like a glimpse into the future of coding."* — [derwiki on Hacker News](https://news.ycombinator.com/item?id=38205643)
- *"It's just amazing. It is freeing me to do things I felt were out my comfort zone before."* — [Dougie on Discord](https://discord.com/channels/1131200896827654144/1174002618058678323/1174084556257775656)
- *"This project is stellar."* — [funkytaco on GitHub](https://github.com/Aider-AI/aider/issues/112#issuecomment-1637429008)
- *"Amazing project, definitely the best AI coding assistant I've used."* — [joshuavial on GitHub](https://github.com/Aider-AI/aider/issues/84)
- *"I absolutely love using Aider ... It makes software development feel so much lighter as an experience."* — [principalideal0 on Discord](https://discord.com/channels/1131200896827654144/1133421607499595858/1229689636012691468)
- *"I have been recovering from ... surgeries ... aider ... has allowed me to continue productivity."* — [codeninja on Reddit](https://www.reddit.com/r/OpenAI/s/nmNwkHy1zG)
- *"I am an aider addict. I'm getting so much more work done, but in less time."* — [dandandan on Discord](https://discord.com/channels/1131200896827654144/1131200896827654149/1135913253483069470)
- *"Aider... blows everything else out of the water hands down, there's no competition whatsoever."* — [SystemSculpt on Discord](https://discord.com/channels/1131200896827654144/1131200896827654149/1178736602797846548)
- *"Aider is amazing, coupled with Sonnet 3.5 it's quite mind blowing."* — [Josh Dingus on Discord](https://discord.com/channels/1131200896827654144/1133060684540813372/1262374225298198548)
- *"Hands down, this is the best AI coding assistant tool so far."* — [IndyDevDan on YouTube](https://www.youtube.com/watch?v=MPYFPvxfGZs)
- *"[Aider] changed my daily coding workflows. It's mind-blowing how ...(it)... can change your life."* — [maledorak on Discord](https://discord.com/channels/1131200896827654144/1131200896827654149/1258453375620747264)
- *"Best agent for actual dev work in existing codebases."* — [Nick Dobos on X](https://twitter.com/NickADobos/status/1690408967963652097?s=20)
- *"One of my favorite pieces of software. Blazing trails on new paradigms!"* — [Chris Wall on X](https://x.com/chris65536/status/1905053299251798432)
- *"Aider has been revolutionary for me and my work."* — [Starry Hope on X](https://x.com/starryhopeblog/status/1904985812137132056)
- *"Try aider! One of the best ways to vibe code."* — [Chris Wall on X](https://x.com/Chris65536/status/1905053418961391929)
- *"Freaking love Aider."* — [hztar on Hacker News](https://news.ycombinator.com/item?id=44035015)
- *"Aider is hands down the best. And it's free and opensource."* — [AriyaSavakaLurker on Reddit](https://www.reddit.com/r/ChatGPTCoding/comments/1ik16y6/whats_your_take_on_aider/mbip39n/)
- *"Aider is also my best friend."* — [jzn21 on Reddit](https://www.reddit.com/r/ChatGPTCoding/comments/1heuvuo/aider_vs_cline_vs_windsurf_vs_cursor/m27dcnb/)
- *"Try Aider, it's worth it."* — [jorgejhms on Reddit](https://www.reddit.com/r/ChatGPTCoding/comments/1heuvuo/aider_vs_cline_vs_windsurf_vs_cursor/m27cp99/)
- *"I like aider :)"* — [Chenwei Cui on X](https://x.com/ccui42/status/1904965344999145698)
- *"Aider is the precision tool of LLM code gen... Minimal, thoughtful and capable of surgical changes ... while keeping the developer in control."* [Reilly Sweetland on X](https://x.com/rsweetland/status/1904963807237259586)
- *"Cannot believe aider vibe coded a 650 LOC feature across service and cli today in 1 shot."* - [autopoietist on Discord](https://discord.com/channels/1131200896827654144/1131200896827654149/1355675042259796101)
- *"Oh no the secret is out! Yes, Aider is the best coding tool around. I highly, highly recommend it to anyone."* — [Joshua D Vander Hook on X](https://x.com/jodavaho/status/1911154899057795218)
- *"thanks to aider, i have started and finished three personal projects within the last two days"* — [joseph stalzyn on X](https://x.com/anitaheeder/status/1908338609645904160)
- *"Been using aider as my daily driver for over a year ... I absolutely love the tool, like beyond words."* — [koleok on Discord](https://discord.com/channels/1131200896827654144/1273248471394291754/1356727448372252783)
- *"Aider ... is the tool to benchmark against."* — [BeetleB on Hacker News](https://news.ycombinator.com/item?id=43930201)
- *"aider is really cool"* — [kache on X](https://x.com/yacineMTB/status/1911224442430124387)

View File

@@ -1,6 +1,6 @@
from packaging import version
__version__ = "0.82.4.dev"
__version__ = "0.85.5.dev"
safe_version = __version__
try:

View File

@@ -70,9 +70,17 @@ class Analytics:
# ephemeral
logfile = None
def __init__(self, logfile=None, permanently_disable=False):
def __init__(
self,
logfile=None,
permanently_disable=False,
posthog_host=None,
posthog_project_api_key=None,
):
self.logfile = logfile
self.get_or_create_uuid()
self.custom_posthog_host = posthog_host
self.custom_posthog_project_api_key = posthog_project_api_key
if self.permanently_disable or permanently_disable or not self.asked_opt_in:
self.disable(permanently_disable)
@@ -92,8 +100,8 @@ class Analytics:
# self.mp = Mixpanel(mixpanel_project_token)
self.ph = Posthog(
project_api_key=posthog_project_api_key,
host=posthog_host,
project_api_key=self.custom_posthog_project_api_key or posthog_project_api_key,
host=self.custom_posthog_host or posthog_host,
on_error=self.posthog_error,
enable_exception_autocapture=True,
super_properties=self.get_system_info(), # Add system info to all events
@@ -229,7 +237,7 @@ class Analytics:
self.mp = None # Disable mixpanel on connection errors
if self.ph:
self.ph.capture(self.user_id, event_name, dict(properties))
self.ph.capture(event_name, distinct_id=self.user_id, properties=dict(properties))
if self.logfile:
log_entry = {

View File

@@ -6,6 +6,7 @@ import sys
from pathlib import Path
import configargparse
import shtab
from aider import __version__
from aider.args_formatter import (
@@ -39,10 +40,22 @@ def get_parser(default_config_files, git_root):
config_file_parser_class=configargparse.YAMLConfigFileParser,
auto_env_var_prefix="AIDER_",
)
# List of valid edit formats for argparse validation & shtab completion.
# Dynamically gather them from the registered coder classes so the list
# stays in sync if new formats are added.
from aider import coders as _aider_coders
edit_format_choices = sorted(
{
c.edit_format
for c in _aider_coders.__all__
if hasattr(c, "edit_format") and c.edit_format is not None
}
)
group = parser.add_argument_group("Main model")
group.add_argument(
"files", metavar="FILE", nargs="*", help="files to edit with an LLM (optional)"
)
).complete = shtab.FILE
group.add_argument(
"--model",
metavar="MODEL",
@@ -109,13 +122,13 @@ def get_parser(default_config_files, git_root):
metavar="MODEL_SETTINGS_FILE",
default=".aider.model.settings.yml",
help="Specify a file with aider model settings for unknown models",
)
).complete = shtab.FILE
group.add_argument(
"--model-metadata-file",
metavar="MODEL_METADATA_FILE",
default=".aider.model.metadata.json",
help="Specify a file with context window and costs for unknown models",
)
).complete = shtab.FILE
group.add_argument(
"--alias",
action="append",
@@ -130,7 +143,10 @@ def get_parser(default_config_files, git_root):
group.add_argument(
"--thinking-tokens",
type=str,
help="Set the thinking token budget for models that support it (default: not set)",
help=(
"Set the thinking token budget for models that support it. Use 0 to disable. (default:"
" not set)"
),
)
group.add_argument(
"--verify-ssl",
@@ -148,6 +164,7 @@ def get_parser(default_config_files, git_root):
"--edit-format",
"--chat-mode",
metavar="EDIT_FORMAT",
choices=edit_format_choices,
default=None,
help="Specify what edit format the LLM should use (default depends on model)",
)
@@ -182,6 +199,7 @@ def get_parser(default_config_files, git_root):
group.add_argument(
"--editor-edit-format",
metavar="EDITOR_EDIT_FORMAT",
choices=edit_format_choices,
default=None,
help="Specify the edit format for the editor model (default: depends on editor model)",
)
@@ -261,13 +279,13 @@ def get_parser(default_config_files, git_root):
metavar="INPUT_HISTORY_FILE",
default=default_input_history_file,
help=f"Specify the chat input history file (default: {default_input_history_file})",
)
).complete = shtab.FILE
group.add_argument(
"--chat-history-file",
metavar="CHAT_HISTORY_FILE",
default=default_chat_history_file,
help=f"Specify the chat history file (default: {default_chat_history_file})",
)
).complete = shtab.FILE
group.add_argument(
"--restore-chat-history",
action=argparse.BooleanOptionalAction,
@@ -279,7 +297,7 @@ def get_parser(default_config_files, git_root):
metavar="LLM_HISTORY_FILE",
default=None,
help="Log the conversation with the LLM to this file (for example, .aider.llm.history)",
)
).complete = shtab.FILE
##########
group = parser.add_argument_group("Output settings")
@@ -395,6 +413,12 @@ def get_parser(default_config_files, git_root):
default=True,
help="Enable/disable adding .aider* to .gitignore (default: True)",
)
group.add_argument(
"--add-gitignore-files",
action=argparse.BooleanOptionalAction,
default=False,
help="Enable/disable the addition of files listed in .gitignore to Aider's editing scope.",
)
default_aiderignore_file = (
os.path.join(git_root, ".aiderignore") if git_root else ".aiderignore"
)
@@ -405,7 +429,7 @@ def get_parser(default_config_files, git_root):
type=lambda path_str: resolve_aiderignore_path(path_str, git_root),
default=default_aiderignore_file,
help="Specify the aider ignore file (default: .aiderignore in git root)",
)
).complete = shtab.FILE
group.add_argument(
"--subtree-only",
action="store_true",
@@ -427,14 +451,20 @@ def get_parser(default_config_files, git_root):
group.add_argument(
"--attribute-author",
action=argparse.BooleanOptionalAction,
default=True,
help="Attribute aider code changes in the git author name (default: True)",
default=None,
help=(
"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",
@@ -448,6 +478,16 @@ 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=True,
help=(
"Attribute aider edits using the Co-authored-by trailer in the commit message"
" (default: True). 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",
action=argparse.BooleanOptionalAction,
@@ -535,13 +575,23 @@ def get_parser(default_config_files, git_root):
"--analytics-log",
metavar="ANALYTICS_LOG_FILE",
help="Specify a file to log analytics events",
)
).complete = shtab.FILE
group.add_argument(
"--analytics-disable",
action="store_true",
help="Permanently disable analytics",
default=False,
)
group.add_argument(
"--analytics-posthog-host",
metavar="ANALYTICS_POSTHOG_HOST",
help="Send analytics to custom PostHog instance",
)
group.add_argument(
"--analytics-posthog-project-api-key",
metavar="ANALYTICS_POSTHOG_PROJECT_API_KEY",
help="Send analytics to custom PostHog project",
)
#########
group = parser.add_argument_group("Upgrading")
@@ -602,7 +652,7 @@ def get_parser(default_config_files, git_root):
"Specify a file containing the message to send the LLM, process reply, then exit"
" (disables chat mode)"
),
)
).complete = shtab.FILE
group.add_argument(
"--gui",
"--browser",
@@ -620,7 +670,7 @@ def get_parser(default_config_files, git_root):
"--apply",
metavar="FILE",
help="Apply the changes from the given file instead of running the chat (debug)",
)
).complete = shtab.FILE
group.add_argument(
"--apply-clipboard-edits",
action="store_true",
@@ -670,18 +720,24 @@ 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",
metavar="FILE",
help="specify a file to edit (can be used multiple times)",
)
).complete = shtab.FILE
group.add_argument(
"--read",
action="append",
metavar="FILE",
help="specify a read-only file (can be used multiple times)",
)
).complete = shtab.FILE
group.add_argument(
"--vim",
action="store_true",
@@ -694,6 +750,12 @@ def get_parser(default_config_files, git_root):
default=None,
help="Specify the language to use in the chat (default: None, uses system settings)",
)
group.add_argument(
"--commit-language",
metavar="COMMIT_LANGUAGE",
default=None,
help="Specify the language to use in the commit message (default: None, user language)",
)
group.add_argument(
"--yes-always",
action="store_true",
@@ -711,7 +773,7 @@ def get_parser(default_config_files, git_root):
"--load",
metavar="LOAD_FILE",
help="Load and execute /commands from a file on launch",
)
).complete = shtab.FILE
group.add_argument(
"--encoding",
default="utf-8",
@@ -732,7 +794,7 @@ def get_parser(default_config_files, git_root):
"Specify the config file (default: search for .aider.conf.yml in git root, cwd"
" or home directory)"
),
)
).complete = shtab.FILE
# This is a duplicate of the argument in the preparser and is a no-op by this time of
# argument parsing, but it's here so that the help is displayed as expected.
group.add_argument(
@@ -740,7 +802,7 @@ def get_parser(default_config_files, git_root):
metavar="ENV_FILE",
default=default_env_file(git_root),
help="Specify the .env file to load (default: .env in git root)",
)
).complete = shtab.FILE
group.add_argument(
"--suggest-shell-commands",
action=argparse.BooleanOptionalAction,
@@ -788,6 +850,17 @@ def get_parser(default_config_files, git_root):
help="Specify which editor to use for the /editor command",
)
supported_shells_list = sorted(list(shtab.SUPPORTED_SHELLS))
group.add_argument(
"--shell-completions",
metavar="SHELL",
choices=supported_shells_list,
help=(
"Print shell completion script for the specified SHELL and exit. Supported shells:"
f" {', '.join(supported_shells_list)}. Example: aider --shell-completions bash"
),
)
##########
group = parser.add_argument_group("Deprecated model settings")
# Add deprecated model shortcut arguments
@@ -836,13 +909,34 @@ def get_sample_dotenv():
def main():
arg = sys.argv[1] if len(sys.argv[1:]) else None
if arg == "md":
print(get_md_help())
elif arg == "dotenv":
print(get_sample_dotenv())
if len(sys.argv) > 1:
command = sys.argv[1]
else:
command = "yaml" # Default to yaml if no command is given
if command == "md":
print(get_md_help())
elif command == "dotenv":
print(get_sample_dotenv())
elif command == "yaml":
print(get_sample_yaml())
elif command == "completion":
if len(sys.argv) > 2:
shell = sys.argv[2]
if shell not in shtab.SUPPORTED_SHELLS:
print(f"Error: Unsupported shell '{shell}'.", file=sys.stderr)
print(f"Supported shells are: {', '.join(shtab.SUPPORTED_SHELLS)}", file=sys.stderr)
sys.exit(1)
parser = get_parser([], None)
parser.prog = "aider" # Set the program name on the parser
print(shtab.complete(parser, shell=shell))
else:
print("Error: Please specify a shell for completion.", file=sys.stderr)
print(f"Usage: python {sys.argv[0]} completion <shell_name>", file=sys.stderr)
print(f"Supported shells are: {', '.join(shtab.SUPPORTED_SHELLS)}", file=sys.stderr)
sys.exit(1)
else:
# Default to YAML for any other unrecognized argument, or if 'yaml' was explicitly passed
print(get_sample_yaml())

View File

@@ -96,7 +96,7 @@ class YamlHelpFormatter(argparse.HelpFormatter):
# Place in your home dir, or at the root of your git repo.
##########################################################
# Note: You can only put OpenAI and Anthropic API keys in the yaml
# Note: You can only put OpenAI and Anthropic API keys in the YAML
# config file. Keys for all APIs can be stored in a .env file
# https://aider.chat/docs/config/dotenv.html

View File

@@ -8,7 +8,7 @@ class AskPrompts(CoderPrompts):
Answer questions about the supplied code.
Always reply to the user in {language}.
Describe code changes however you like. Don't use SEARCH/REPLACE blocks!
If you need to describe code changes, do so *briefly*.
"""
example_messages = []

View File

@@ -26,6 +26,8 @@ from json.decoder import JSONDecodeError
from pathlib import Path
from typing import List
from rich.console import Console
from aider import __version__, models, prompts, urls, utils
from aider.analytics import Analytics
from aider.commands import Commands
@@ -45,6 +47,7 @@ from aider.repo import ANY_GIT_ERROR, GitRepo
from aider.repomap import RepoMap
from aider.run_cmd import run_cmd
from aider.utils import format_content, format_messages, format_tokens, is_image_file
from aider.waiting import WaitingSpinner
from ..dump import dump # noqa: F401
from .chat_chunks import ChatChunks
@@ -108,8 +111,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
@@ -117,6 +118,7 @@ class Coder:
detect_urls = True
ignore_mentions = None
chat_language = None
commit_language = None
file_watcher = None
@classmethod
@@ -175,6 +177,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
@@ -298,6 +302,7 @@ class Coder:
io,
repo=None,
fnames=None,
add_gitignore_files=False,
read_only_fnames=None,
show_diffs=False,
auto_commits=True,
@@ -325,8 +330,11 @@ class Coder:
num_cache_warming_pings=0,
suggest_shell_commands=True,
chat_language=None,
commit_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,
@@ -336,6 +344,7 @@ class Coder:
self.event = self.analytics.event
self.chat_language = chat_language
self.commit_language = commit_language
self.commit_before_message = []
self.aider_commit_hashes = set()
self.rejected_urls = set()
@@ -373,10 +382,15 @@ 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()
self.abs_read_only_fnames = set()
self.add_gitignore_files = add_gitignore_files
if cur_messages:
self.cur_messages = cur_messages
@@ -434,8 +448,9 @@ class Coder:
for fname in fnames:
fname = Path(fname)
if self.repo and self.repo.git_ignored_file(fname):
if self.repo and self.repo.git_ignored_file(fname) and not self.add_gitignore_files:
self.io.tool_warning(f"Skipping {fname} that matches gitignore spec.")
continue
if self.repo and self.repo.ignored_file(fname):
self.io.tool_warning(f"Skipping {fname} that matches aiderignore spec.")
@@ -571,6 +586,15 @@ class Coder:
return True
def _stop_waiting_spinner(self):
"""Stop and clear the waiting spinner if it is running."""
spinner = getattr(self, "waiting_spinner", None)
if spinner:
try:
spinner.stop()
finally:
self.waiting_spinner = None
def get_abs_fnames_content(self):
for fname in list(self.abs_fnames):
content = self.io.read_text(fname)
@@ -960,6 +984,9 @@ class Coder:
return inp
def keyboard_interrupt(self):
# Ensure cursor is visible on exit
Console().show_cursor(True)
now = time.time()
thresh = 2 # seconds
@@ -1028,6 +1055,9 @@ class Coder:
if not lang_code:
return None
if lang_code.upper() in ("C", "POSIX"):
return None
# Probably already a language name
if (
len(lang_code) > 3
@@ -1058,7 +1088,8 @@ class Coder:
"ko": "Korean",
"ru": "Russian",
}
return fallback.get(lang_code.split("_")[0].lower(), lang_code)
primary_lang_code = lang_code.replace("-", "_").split("_")[0].lower()
return fallback.get(primary_lang_code, lang_code)
def get_user_language(self):
"""
@@ -1069,6 +1100,7 @@ class Coder:
2. ``locale.getlocale()``
3. ``LANG`` / ``LANGUAGE`` / ``LC_ALL`` / ``LC_MESSAGES`` environment variables
"""
# Explicit override
if self.chat_language:
return self.normalize_language(self.chat_language)
@@ -1077,9 +1109,11 @@ class Coder:
try:
lang = locale.getlocale()[0]
if lang:
return self.normalize_language(lang)
lang = self.normalize_language(lang)
if lang:
return lang
except Exception:
pass # pragma: no cover
pass
# Environment variables
for env_var in ("LANG", "LANGUAGE", "LC_ALL", "LC_MESSAGES"):
@@ -1161,10 +1195,10 @@ class Coder:
)
rename_with_shell = ""
if self.chat_language:
language = self.chat_language
if user_lang: # user_lang is the result of self.get_user_language()
language = user_lang
else:
language = "the same language they are using"
language = "the same language they are using" # Default if no specific lang detected
if self.fence[0] == "`" * 4:
quad_backtick_reminder = (
@@ -1187,14 +1221,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:
@@ -1403,8 +1436,13 @@ class Coder:
utils.show_messages(messages, functions=self.functions)
self.multi_response_content = ""
if self.show_pretty() and self.stream:
self.mdstream = self.io.get_assistant_mdstream()
if self.show_pretty():
self.waiting_spinner = WaitingSpinner("Waiting for " + self.main_model.name)
self.waiting_spinner.start()
if self.stream:
self.mdstream = self.io.get_assistant_mdstream()
else:
self.mdstream = None
else:
self.mdstream = None
@@ -1477,6 +1515,9 @@ class Coder:
self.live_incremental_response(True)
self.mdstream = None
# Ensure any waiting spinner is stopped
self._stop_waiting_spinner()
self.partial_response_content = self.get_multi_response_content_in_progress(True)
self.remove_reasoning_content()
self.multi_response_content = ""
@@ -1793,6 +1834,9 @@ class Coder:
self.io.ai_output(json.dumps(args, indent=4))
def show_send_output(self, completion):
# Stop spinner once we have a response
self._stop_waiting_spinner()
if self.verbose:
print(completion)
@@ -1907,6 +1951,8 @@ class Coder:
except AttributeError:
pass
if received_content:
self._stop_waiting_spinner()
self.partial_response_content += text
if self.show_pretty():
@@ -1986,6 +2032,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 Exception:
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,35 +2097,15 @@ 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:
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
@@ -2316,7 +2380,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
@@ -2352,7 +2416,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)

View File

@@ -383,7 +383,7 @@ def do_replace(fname, content, before_text, after_text, fence=None):
return new_content
HEAD = r"^<{5,9} SEARCH\s*$"
HEAD = r"^<{5,9} SEARCH>?\s*$"
DIVIDER = r"^={5,9}\s*$"
UPDATED = r"^>{5,9} REPLACE\s*$"

View File

@@ -5,5 +5,6 @@ from .editblock_fenced_prompts import EditBlockFencedPrompts
class EditBlockFencedCoder(EditBlockCoder):
"""A coder that uses fenced search/replace blocks for code modifications."""
edit_format = "diff-fenced"
gpt_prompts = EditBlockFencedPrompts()

View File

@@ -5,6 +5,7 @@ from .help_prompts import HelpPrompts
class HelpCoder(Coder):
"""Interactive help and documentation about aider."""
edit_format = "help"
gpt_prompts = HelpPrompts()

View File

@@ -109,7 +109,7 @@ class RelativeIndenter:
"""
if self.marker in text:
raise ValueError("Text already contains the outdent marker: {self.marker}")
raise ValueError(f"Text already contains the outdent marker: {self.marker}")
lines = text.splitlines(keepends=True)

View File

@@ -22,4 +22,4 @@ Don't leave out any lines or the diff patch won't apply correctly.
To make a new file, show a diff from `--- /dev/null` to `+++ path/to/new/file.ext`.
{final_reminders}
""" # noqa
""" # noqa

View File

@@ -47,6 +47,7 @@ class Commands:
parser=self.parser,
verbose=self.verbose,
editor=self.editor,
original_read_only_fnames=self.original_read_only_fnames,
)
def __init__(
@@ -87,6 +88,11 @@ class Commands:
"Switch the Main Model to a new LLM"
model_name = args.strip()
if not model_name:
announcements = "\n".join(self.coder.get_announcements())
self.io.tool_output(announcements)
return
model = models.Model(
model_name,
editor_model=self.coder.main_model.editor_model.name,
@@ -220,12 +226,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 ""
@@ -339,7 +351,7 @@ class Commands:
return
commit_message = args.strip() if args else None
self.coder.repo.commit(message=commit_message)
self.coder.repo.commit(message=commit_message, coder=self.coder)
def cmd_lint(self, args="", fnames=None):
"Lint and fix in-chat files or all dirty files if none in chat"
@@ -400,6 +412,7 @@ class Commands:
"Clear the chat history"
self._clear_chat_history()
self.io.tool_output("All chat history cleared.")
def _drop_all_files(self):
self.coder.abs_fnames = set()
@@ -556,6 +569,7 @@ class Commands:
last_commit_hash = self.coder.repo.get_head_commit_sha(short=True)
last_commit_message = self.coder.repo.get_head_commit_message("(unknown)").strip()
last_commit_message = (last_commit_message.splitlines() or [""])[0]
if last_commit_hash not in self.coder.aider_commit_hashes:
self.io.tool_error("The last commit was not made by aider in this chat session.")
self.io.tool_output(
@@ -634,6 +648,7 @@ class Commands:
# Get the current HEAD after undo
current_head_hash = self.coder.repo.get_head_commit_sha(short=True)
current_head_message = self.coder.repo.get_head_commit_message("(unknown)").strip()
current_head_message = (current_head_message.splitlines() or [""])[0]
self.io.tool_output(f"Now at: {current_head_hash} {current_head_message}")
if self.coder.main_model.send_undo_reply:
@@ -837,7 +852,11 @@ class Commands:
)
continue
if self.coder.repo and self.coder.repo.git_ignored_file(matched_file):
if (
self.coder.repo
and self.coder.repo.git_ignored_file(matched_file)
and not self.coder.add_gitignore_files
):
self.io.tool_error(f"Can't add {matched_file} which is in gitignore")
continue
@@ -1305,12 +1324,23 @@ class Commands:
# First collect all expanded paths
for pattern in filenames:
expanded_pattern = expanduser(pattern)
if os.path.isabs(expanded_pattern):
# For absolute paths, glob it
matches = list(glob.glob(expanded_pattern))
path_obj = Path(expanded_pattern)
is_abs = path_obj.is_absolute()
if not is_abs:
path_obj = Path(self.coder.root) / path_obj
matches = []
# Check for literal path existence first
if path_obj.exists():
matches = [path_obj]
else:
# For relative paths and globs, use glob from the root directory
matches = list(Path(self.coder.root).glob(expanded_pattern))
# If literal path doesn't exist, try globbing
if is_abs:
# For absolute paths, glob it
matches = [Path(p) for p in glob.glob(expanded_pattern)]
else:
# For relative paths and globs, use glob from the root directory
matches = list(Path(self.coder.root).glob(expanded_pattern))
if not matches:
self.io.tool_error(f"No matches found for: {pattern}")
@@ -1385,7 +1415,30 @@ class Commands:
"Print out the current settings"
settings = format_settings(self.parser, self.args)
announcements = "\n".join(self.coder.get_announcements())
# Build metadata for the active models (main, editor, weak)
model_sections = []
active_models = [
("Main model", self.coder.main_model),
("Editor model", getattr(self.coder.main_model, "editor_model", None)),
("Weak model", getattr(self.coder.main_model, "weak_model", None)),
]
for label, model in active_models:
if not model:
continue
info = getattr(model, "info", {}) or {}
if not info:
continue
model_sections.append(f"{label} ({model.name}):")
for k, v in sorted(info.items()):
model_sections.append(f" {k}: {v}")
model_sections.append("") # blank line between models
model_metadata = "\n".join(model_sections)
output = f"{announcements}\n{settings}"
if model_metadata:
output += "\n" + model_metadata
self.io.tool_output(output)
def completions_raw_load(self, document, complete_event):
@@ -1507,7 +1560,7 @@ class Commands:
return self.cmd_editor(args)
def cmd_think_tokens(self, args):
"Set the thinking token budget (supports formats like 8096, 8k, 10.5k, 0.5M)"
"""Set the thinking token budget, eg: 8096, 8k, 10.5k, 0.5M, or 0 to disable."""
model = self.coder.main_model
if not args.strip():
@@ -1525,10 +1578,16 @@ class Commands:
value = args.strip()
model.set_thinking_tokens(value)
formatted_budget = model.get_thinking_tokens()
budget = model.get_raw_thinking_tokens()
# Handle the special case of 0 to disable thinking tokens
if value == "0":
self.io.tool_output("Thinking tokens disabled.")
else:
formatted_budget = model.get_thinking_tokens()
budget = model.get_raw_thinking_tokens()
self.io.tool_output(
f"Set thinking token budget to {budget:,} tokens ({formatted_budget})."
)
self.io.tool_output(f"Set thinking token budget to {budget:,} tokens ({formatted_budget}).")
self.io.tool_output()
# Output announcements

View File

@@ -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():

View File

@@ -63,37 +63,37 @@ class ChatSummary:
if split_index <= min_split:
return self.summarize_all(messages)
head = messages[:split_index]
# Split head and tail
tail = messages[split_index:]
sized = sized[:split_index]
head.reverse()
sized.reverse()
# Only size the head once
sized_head = sized[:split_index]
# Precompute token limit (fallback to 4096 if undefined)
model_max_input_tokens = self.models[0].info.get("max_input_tokens") or 4096
model_max_input_tokens -= 512 # reserve buffer for safety
keep = []
total = 0
# These sometimes come set with value = None
model_max_input_tokens = self.models[0].info.get("max_input_tokens") or 4096
model_max_input_tokens -= 512
for i in range(split_index):
total += sized[i][0]
# Iterate in original order, summing tokens until limit
for tokens, msg in sized_head:
total += tokens
if total > model_max_input_tokens:
break
keep.append(head[i])
keep.reverse()
keep.append(msg)
# No need to reverse lists back and forth
summary = self.summarize_all(keep)
tail_tokens = sum(tokens for tokens, msg in sized[split_index:])
# If the combined summary and tail still fits, return directly
summary_tokens = self.token_count(summary)
result = summary + tail
tail_tokens = sum(tokens for tokens, _ in sized[split_index:])
if summary_tokens + tail_tokens < self.max_tokens:
return result
return summary + tail
return self.summarize_real(result, depth + 1)
# Otherwise recurse with increased depth
return self.summarize_real(summary + tail, depth + 1)
def summarize_all(self, messages):
content = ""

View File

@@ -308,6 +308,12 @@ class InputOutput:
self.yes = yes
self.input_history_file = input_history_file
if self.input_history_file:
try:
Path(self.input_history_file).parent.mkdir(parents=True, exist_ok=True)
except (PermissionError, OSError) as e:
self.tool_warning(f"Could not create directory for input history: {e}")
self.input_history_file = None
self.llm_history_file = llm_history_file
if chat_history_file is not None:
self.chat_history_file = Path(chat_history_file)
@@ -749,9 +755,14 @@ class InputOutput:
if not self.llm_history_file:
return
timestamp = datetime.now().isoformat(timespec="seconds")
with open(self.llm_history_file, "a", encoding=self.encoding) as log_file:
log_file.write(f"{role.upper()} {timestamp}\n")
log_file.write(content + "\n")
try:
Path(self.llm_history_file).parent.mkdir(parents=True, exist_ok=True)
with open(self.llm_history_file, "a", encoding="utf-8") as log_file:
log_file.write(f"{role.upper()} {timestamp}\n")
log_file.write(content + "\n")
except (PermissionError, OSError) as err:
self.tool_warning(f"Unable to write to llm history file {self.llm_history_file}: {err}")
self.llm_history_file = None
def display_user_input(self, inp):
if self.pretty and self.user_input_color:
@@ -1001,7 +1012,11 @@ class InputOutput:
self.console.print(*messages, style=style)
def get_assistant_mdstream(self):
mdargs = dict(style=self.assistant_output_color, code_theme=self.code_theme)
mdargs = dict(
style=self.assistant_output_color,
code_theme=self.code_theme,
inline_code_lexer="text",
)
mdStream = MarkdownStream(mdargs=mdargs)
return mdStream
@@ -1112,6 +1127,7 @@ class InputOutput:
text += "\n"
if self.chat_history_file is not None:
try:
self.chat_history_file.parent.mkdir(parents=True, exist_ok=True)
with self.chat_history_file.open("a", encoding=self.encoding, errors="ignore") as f:
f.write(text)
except (PermissionError, OSError) as err:
@@ -1144,18 +1160,19 @@ class InputOutput:
ro_paths = []
for rel_path in read_only_files:
abs_path = os.path.abspath(os.path.join(self.root, rel_path))
ro_paths.append(abs_path if len(abs_path) < len(rel_path) else rel_path)
ro_paths.append(Text(abs_path if len(abs_path) < len(rel_path) else rel_path))
files_with_label = ["Readonly:"] + ro_paths
files_with_label = [Text("Readonly:")] + ro_paths
read_only_output = StringIO()
Console(file=read_only_output, force_terminal=False).print(Columns(files_with_label))
read_only_lines = read_only_output.getvalue().splitlines()
console.print(Columns(files_with_label))
if editable_files:
files_with_label = editable_files
text_editable_files = [Text(f) for f in editable_files]
files_with_label = text_editable_files
if read_only_files:
files_with_label = ["Editable:"] + editable_files
files_with_label = [Text("Editable:")] + text_editable_files
editable_output = StringIO()
Console(file=editable_output, force_terminal=False).print(Columns(files_with_label))
editable_lines = editable_output.getvalue().splitlines()

View File

@@ -4,10 +4,10 @@ import subprocess
import sys
import traceback
import warnings
import shlex
from dataclasses import dataclass
from pathlib import Path
import oslex
from grep_ast import TreeContext, filename_to_lang
from grep_ast.tsl import get_parser # noqa: E402
@@ -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 = ""

View File

@@ -14,6 +14,7 @@ except ImportError:
git = None
import importlib_resources
import shtab
from dotenv import load_dotenv
from prompt_toolkit.enums import EditingMode
@@ -502,6 +503,12 @@ 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)
if args.shell_completions:
# Ensure parser.prog is set for shtab, though it should be by default
parser.prog = "aider"
print(shtab.complete(parser, shell=args.shell_completions))
sys.exit(0)
if git is None:
args.git = False
@@ -626,7 +633,12 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
)
os.environ["OPENAI_ORGANIZATION"] = args.openai_organization_id
analytics = Analytics(logfile=args.analytics_log, permanently_disable=args.analytics_disable)
analytics = Analytics(
logfile=args.analytics_log,
permanently_disable=args.analytics_disable,
posthog_host=args.analytics_posthog_host,
posthog_project_api_key=args.analytics_posthog_project_api_key,
)
if args.analytics is not False:
if analytics.need_to_ask(args.analytics):
io.tool_output(
@@ -904,6 +916,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
@@ -913,8 +926,9 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
analytics.event("exit", reason="Repository sanity check failed")
return 1
if repo:
analytics.event("repo", num_files=len(repo.get_tracked_files()))
if repo and not args.skip_sanity_check_repo:
num_files = len(repo.get_tracked_files())
analytics.event("repo", num_files=num_files)
else:
analytics.event("no-repo")
@@ -985,9 +999,11 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
num_cache_warming_pings=args.cache_keepalive_pings,
suggest_shell_commands=args.suggest_shell_commands,
chat_language=args.chat_language,
commit_language=args.commit_language,
detect_urls=args.detect_urls,
auto_copy_context=args.copy_paste,
auto_accept_architect=args.auto_accept_architect,
add_gitignore_files=args.add_gitignore_files,
)
except UnknownEditFormat as err:
io.tool_error(str(err))

View File

@@ -115,9 +115,9 @@ class MarkdownStream:
else:
self.mdargs = dict()
# Initialize rich Live display with empty text
self.live = Live(Text(""), refresh_per_second=1.0 / self.min_delay)
self.live.start()
# Defer Live creation until the first update.
self.live = None
self._live_started = False
def _render_markdown_to_lines(self, text):
"""Render markdown text to a list of lines.
@@ -163,6 +163,12 @@ class MarkdownStream:
Markdown going to the console works better in terminal scrollback buffers.
The live window doesn't play nice with terminal scrollback.
"""
# On the first call, stop the spinner and start the Live renderer
if not getattr(self, "_live_started", False):
self.live = Live(Text(""), refresh_per_second=1.0 / self.min_delay)
self.live.start()
self._live_started = True
now = time.time()
# Throttle updates to maintain smooth rendering
if not final and now - self.when < self.min_delay:

View File

@@ -8,6 +8,7 @@ import platform
import sys
import time
from dataclasses import dataclass, fields
from datetime import datetime
from pathlib import Path
from typing import Optional, Union
@@ -15,8 +16,10 @@ import json5
import yaml
from PIL import Image
from aider import __version__
from aider.dump import dump # noqa: F401
from aider.llm import litellm
from aider.openrouter import OpenRouterModelManager
from aider.sendchat import ensure_alternating_roles, sanity_check_messages
from aider.utils import check_pip_install_extra
@@ -69,6 +72,8 @@ claude-3-opus-20240229
claude-3-sonnet-20240229
claude-3-5-sonnet-20240620
claude-3-5-sonnet-20241022
claude-sonnet-4-20250514
claude-opus-4-20250514
"""
ANTHROPIC_MODELS = [ln.strip() for ln in ANTHROPIC_MODELS.splitlines() if ln.strip()]
@@ -76,9 +81,9 @@ ANTHROPIC_MODELS = [ln.strip() for ln in ANTHROPIC_MODELS.splitlines() if ln.str
# Mapping of model aliases to their canonical names
MODEL_ALIASES = {
# Claude models
"sonnet": "anthropic/claude-3-7-sonnet-20250219",
"sonnet": "anthropic/claude-sonnet-4-20250514",
"haiku": "claude-3-5-haiku-20241022",
"opus": "claude-3-opus-20240229",
"opus": "claude-opus-4-20250514",
# GPT models
"4": "gpt-4-0613",
"4o": "gpt-4o",
@@ -88,11 +93,11 @@ MODEL_ALIASES = {
"3": "gpt-3.5-turbo",
# Other models
"deepseek": "deepseek/deepseek-chat",
"flash": "gemini/gemini-2.5-flash-preview-04-17",
"flash": "gemini/gemini-2.5-flash",
"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",
"gemini": "gemini/gemini-2.5-pro",
"gemini-exp": "gemini/gemini-2.5-pro-exp-03-25",
"grok3": "xai/grok-3-beta",
"optimus": "openrouter/openrouter/optimus-alpha",
@@ -149,8 +154,13 @@ class ModelInfoManager:
self.verify_ssl = True
self._cache_loaded = False
# Manager for the cached OpenRouter model database
self.openrouter_manager = OpenRouterModelManager()
def set_verify_ssl(self, verify_ssl):
self.verify_ssl = verify_ssl
if hasattr(self, "openrouter_manager"):
self.openrouter_manager.set_verify_ssl(verify_ssl)
def _load_cache(self):
if self._cache_loaded:
@@ -231,8 +241,68 @@ class ModelInfoManager:
if litellm_info:
return litellm_info
if not cached_info and model.startswith("openrouter/"):
# First try using the locally cached OpenRouter model database
openrouter_info = self.openrouter_manager.get_model_info(model)
if openrouter_info:
return openrouter_info
# Fallback to legacy web-scraping if the API cache does not contain the model
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/<model_route>
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 = "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
):
print(f"\033[91mError: Model '{url_part}' is not available\033[0m")
return {}
text = re.sub(r"<[^>]+>", " ", html)
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*([\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)) / 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,
"max_output_tokens": context_size,
"input_cost_per_token": input_cost,
"output_cost_per_token": output_cost,
}
return params
except Exception as e:
print("Error fetching openrouter info:", str(e))
return {}
model_info_manager = ModelInfoManager()
@@ -332,6 +402,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"
@@ -357,6 +436,10 @@ class Model(ModelSettings):
self.examples_as_sys_msg = False
return # <--
if "gpt-5" in model:
self.use_temperature = False
return # <--
if "/o1-mini" in model:
self.use_repo_map = True
self.use_temperature = False
@@ -460,6 +543,14 @@ 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
self.system_prompt_prefix = "/no_think"
self.use_temperature = 0.7
self.extra_params = {"top_p": 0.8, "top_k": 20, "min_p": 0.0}
return # <--
# use the defaults
if self.edit_format == "diff":
self.use_repo_map = True
@@ -659,11 +750,18 @@ 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 = {}
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):
"""
@@ -700,6 +798,7 @@ class Model(ModelSettings):
"""
Set the thinking token budget for models that support it.
Accepts formats: 8096, "8k", "10.5k", "0.5M", "10K", etc.
Pass "0" to disable thinking tokens.
"""
if value is not None:
num_tokens = self.parse_token_value(value)
@@ -709,9 +808,19 @@ 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"] = {}
if num_tokens > 0:
self.extra_params["extra_body"]["reasoning"] = {"max_tokens": num_tokens}
else:
if "reasoning" in self.extra_params["extra_body"]:
del self.extra_params["extra_body"]["reasoning"]
else:
self.extra_params["thinking"] = {"type": "enabled", "budget_tokens": num_tokens}
if num_tokens > 0:
self.extra_params["thinking"] = {"type": "enabled", "budget_tokens": num_tokens}
else:
if "thinking" in self.extra_params:
del self.extra_params["thinking"]
def get_raw_thinking_tokens(self):
"""Get formatted thinking token budget if available"""
@@ -719,8 +828,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"]
@@ -750,12 +864,21 @@ 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 (
"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
and "reasoning_effort" in self.extra_params["extra_body"]
):
return self.extra_params["extra_body"]["reasoning_effort"]
return None
def is_deepseek_r1(self):
@@ -767,6 +890,57 @@ class Model(ModelSettings):
def is_ollama(self):
return self.name.startswith("ollama/") or self.name.startswith("ollama_chat/")
def github_copilot_token_to_open_ai_key(self, extra_headers):
# check to see if there's an openai api key
# If so, check to see if it's expire
openai_api_key = "OPENAI_API_KEY"
if openai_api_key not in os.environ or (
int(dict(x.split("=") for x in os.environ[openai_api_key].split(";"))["exp"])
< int(datetime.now().timestamp())
):
import requests
class GitHubCopilotTokenError(Exception):
"""Custom exception for GitHub Copilot token-related errors."""
pass
# Validate GitHub Copilot token exists
if "GITHUB_COPILOT_TOKEN" not in os.environ:
raise KeyError("GITHUB_COPILOT_TOKEN environment variable not found")
github_token = os.environ["GITHUB_COPILOT_TOKEN"]
if not github_token.strip():
raise KeyError("GITHUB_COPILOT_TOKEN environment variable is empty")
headers = {
"Authorization": f"Bearer {os.environ['GITHUB_COPILOT_TOKEN']}",
"Editor-Version": extra_headers["Editor-Version"],
"Copilot-Integration-Id": extra_headers["Copilot-Integration-Id"],
"Content-Type": "application/json",
}
url = "https://api.github.com/copilot_internal/v2/token"
res = requests.get(url, headers=headers)
if res.status_code != 200:
safe_headers = {k: v for k, v in headers.items() if k != "Authorization"}
token_preview = github_token[:5] + "..." if len(github_token) >= 5 else github_token
safe_headers["Authorization"] = f"Bearer {token_preview}"
raise GitHubCopilotTokenError(
f"GitHub Copilot API request failed (Status: {res.status_code})\n"
f"URL: {url}\n"
f"Headers: {json.dumps(safe_headers, indent=2)}\n"
f"JSON: {res.text}"
)
response_data = res.json()
token = response_data.get("token")
if not token:
raise GitHubCopilotTokenError("Response missing 'token' field")
os.environ[openai_api_key] = token
def send_completion(self, messages, functions, stream, temperature=None):
if os.environ.get("AIDER_SANITY_CHECK_TURNS"):
sanity_check_messages(messages)
@@ -808,6 +982,16 @@ class Model(ModelSettings):
dump(kwargs)
kwargs["messages"] = messages
# Are we using github copilot?
if "GITHUB_COPILOT_TOKEN" in os.environ:
if "extra_headers" not in kwargs:
kwargs["extra_headers"] = {
"Editor-Version": f"aider/{__version__}",
"Copilot-Integration-Id": "vscode-chat",
}
self.github_copilot_token_to_open_ai_key(kwargs["extra_headers"])
res = litellm.completion(**kwargs)
return hash_object, res
@@ -819,6 +1003,9 @@ class Model(ModelSettings):
messages = ensure_alternating_roles(messages)
retry_delay = 0.125
if self.verbose:
dump(messages)
while True:
try:
kwargs = {
@@ -869,12 +1056,10 @@ def register_models(model_settings_fnames):
for model_settings_dict in model_settings_list:
model_settings = ModelSettings(**model_settings_dict)
existing_model_settings = next(
(ms for ms in MODEL_SETTINGS if ms.name == model_settings.name), None
)
if existing_model_settings:
MODEL_SETTINGS.remove(existing_model_settings)
# Remove all existing settings for this model name
MODEL_SETTINGS[:] = [ms for ms in MODEL_SETTINGS if ms.name != model_settings.name]
# Add the new settings
MODEL_SETTINGS.append(model_settings)
except Exception as e:
raise Exception(f"Error loading model settings from {model_settings_fname}: {e}")

View File

@@ -55,9 +55,9 @@ def try_to_select_default_model():
# Check if the user is on a free tier
is_free_tier = check_openrouter_tier(openrouter_key)
if is_free_tier:
return "openrouter/google/gemini-2.5-pro-exp-03-25:free"
return "openrouter/deepseek/deepseek-r1:free"
else:
return "openrouter/anthropic/claude-3.7-sonnet"
return "openrouter/anthropic/claude-sonnet-4"
# Select model based on other available API keys
model_key_pairs = [

128
aider/openrouter.py Normal file
View File

@@ -0,0 +1,128 @@
"""
OpenRouter model metadata caching and lookup.
This module keeps a local cached copy of the OpenRouter model list
(downloaded from ``https://openrouter.ai/api/v1/models``) and exposes a
helper class that returns metadata for a given model in a format compatible
with litellms ``get_model_info``.
"""
from __future__ import annotations
import json
import time
from pathlib import Path
from typing import Dict
import requests
def _cost_per_token(val: str | None) -> float | None:
"""Convert a price string (USD per token) to a float."""
if val in (None, "", "0"):
return 0.0 if val == "0" else None
try:
return float(val)
except Exception: # noqa: BLE001
return None
class OpenRouterModelManager:
MODELS_URL = "https://openrouter.ai/api/v1/models"
CACHE_TTL = 60 * 60 * 24 # 24 h
def __init__(self) -> None:
self.cache_dir = Path.home() / ".aider" / "caches"
self.cache_file = self.cache_dir / "openrouter_models.json"
self.content: Dict | None = None
self.verify_ssl: bool = True
self._cache_loaded = False
# ------------------------------------------------------------------ #
# Public API #
# ------------------------------------------------------------------ #
def set_verify_ssl(self, verify_ssl: bool) -> None:
"""Enable/disable SSL verification for API requests."""
self.verify_ssl = verify_ssl
def get_model_info(self, model: str) -> Dict:
"""
Return metadata for *model* or an empty ``dict`` when unknown.
``model`` should use the aider naming convention, e.g.
``openrouter/nousresearch/deephermes-3-mistral-24b-preview:free``.
"""
self._ensure_content()
if not self.content or "data" not in self.content:
return {}
route = self._strip_prefix(model)
# Consider both the exact id and id without any “:suffix”.
candidates = {route}
if ":" in route:
candidates.add(route.split(":", 1)[0])
record = next((item for item in self.content["data"] if item.get("id") in candidates), None)
if not record:
return {}
context_len = (
record.get("top_provider", {}).get("context_length")
or record.get("context_length")
or None
)
pricing = record.get("pricing", {})
return {
"max_input_tokens": context_len,
"max_tokens": context_len,
"max_output_tokens": context_len,
"input_cost_per_token": _cost_per_token(pricing.get("prompt")),
"output_cost_per_token": _cost_per_token(pricing.get("completion")),
"litellm_provider": "openrouter",
}
# ------------------------------------------------------------------ #
# Internal helpers #
# ------------------------------------------------------------------ #
def _strip_prefix(self, model: str) -> str:
return model[len("openrouter/") :] if model.startswith("openrouter/") else model
def _ensure_content(self) -> None:
self._load_cache()
if not self.content:
self._update_cache()
def _load_cache(self) -> None:
if self._cache_loaded:
return
try:
self.cache_dir.mkdir(parents=True, exist_ok=True)
if self.cache_file.exists():
cache_age = time.time() - self.cache_file.stat().st_mtime
if cache_age < self.CACHE_TTL:
try:
self.content = json.loads(self.cache_file.read_text())
except json.JSONDecodeError:
self.content = None
except OSError:
# Cache directory might be unwritable; ignore.
pass
self._cache_loaded = True
def _update_cache(self) -> None:
try:
response = requests.get(self.MODELS_URL, timeout=10, verify=self.verify_ssl)
if response.status_code == 200:
self.content = response.json()
try:
self.cache_file.write_text(json.dumps(self.content, indent=2))
except OSError:
pass # Non-fatal if we cant write the cache
except Exception as ex: # noqa: BLE001
print(f"Failed to fetch OpenRouter model list: {ex}")
try:
self.cache_file.write_text("{}")
except OSError:
pass

View File

@@ -13,13 +13,12 @@ Generate a one-line commit message for those changes.
The commit message should be structured as follows: <type>: <description>
Use these for <type>: fix, feat, build, chore, ci, docs, style, refactor, perf, test
Ensure the commit message:
Ensure the commit message:{language_instruction}
- Starts with the appropriate prefix.
- Is in the imperative mood (e.g., \"add feature\" not \"added feature\" or \"adding feature\").
- Does not exceed 72 characters.
Reply only with the one-line commit message, without any additional text, explanations, \
or line breaks.
Reply only with the one-line commit message, without any additional text, explanations, or line breaks.
"""
# COMMANDS

View File

@@ -0,0 +1,7 @@
(list_lit
meta: _*
. (sym_lit name: (sym_name) @ignore)
. (sym_lit name: (sym_name) @name.definition.method)
(#match? @ignore "^def.*"))
(sym_lit name: (sym_name) @name.reference.call)

View File

@@ -0,0 +1,10 @@
(class_definition
name: (identifier) @name.definition.class) @definition.class
(function_definition
name: (identifier) @name.definition.function) @definition.function
(function_call
name: (identifier) @name.reference.call) @reference.call
(command (command_name) @name.reference.call) @reference.call

View File

@@ -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

View File

@@ -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*\\*+\\)$")
)

View File

@@ -0,0 +1,10 @@
(class_definition
name: (identifier) @name.definition.class) @definition.class
(function_definition
name: (identifier) @name.definition.function) @definition.function
(function_call
name: (identifier) @name.reference.call) @reference.call
(command (command_name) @name.reference.call) @reference.call

View File

@@ -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*\\*+\\)$")
)

View File

@@ -1,3 +1,4 @@
import contextlib
import os
import time
from pathlib import Path, PurePosixPath
@@ -20,6 +21,7 @@ import pathspec
from aider import prompts, utils
from .dump import dump # noqa: F401
from .waiting import WaitingSpinner
ANY_GIT_ERROR += [
OSError,
@@ -34,6 +36,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
@@ -58,6 +73,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,6 +85,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
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
@@ -111,7 +128,76 @@ 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):
"""
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 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 for 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 (<model>) <aider@aider.chat>" trailer to 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
@@ -122,19 +208,71 @@ class GitRepo:
if message:
commit_message = message
else:
commit_message = self.get_commit_message(diffs, context)
user_language = None
if coder:
user_language = coder.commit_language
if not user_language:
user_language = coder.get_user_language()
commit_message = self.get_commit_message(diffs, context, user_language)
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
# 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 = self.attribute_co_authored_by
# 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 (
attribute_commit_message_author or attribute_commit_message_committer
)
# Determine Co-authored-by trailer
commit_message_trailer = ""
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}) <aider@aider.chat>"
# Determine if author/committer names should be modified
# 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)"
full_commit_message = commit_message
# if context:
# full_commit_message += "\n\n# Aider chat conversation:\n\n" + context
if prefix_commit_message:
commit_message = "aider: " + commit_message
full_commit_message = commit_message + commit_message_trailer
cmd = ["-m", full_commit_message]
if not self.git_commit_verify:
@@ -152,36 +290,32 @@ 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:
os.environ["GIT_COMMITTER_NAME"] = committer_name
if aider_edits and self.attribute_author:
original_author_name_env = os.environ.get("GIT_AUTHOR_NAME")
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 self.attribute_committer:
if original_committer_name_env is not None:
os.environ["GIT_COMMITTER_NAME"] = original_committer_name_env
else:
del os.environ["GIT_COMMITTER_NAME"]
if aider_edits and self.attribute_author:
if original_author_name_env is not None:
os.environ["GIT_AUTHOR_NAME"] = original_author_name_env
else:
del os.environ["GIT_AUTHOR_NAME"]
# No return here, implicitly returns None
def get_rel_repo_dir(self):
try:
@@ -189,7 +323,7 @@ class GitRepo:
except (ValueError, OSError):
return self.repo.git_dir
def get_commit_message(self, diffs, context):
def get_commit_message(self, diffs, context, user_language=None):
diffs = "# Diffs:\n" + diffs
content = ""
@@ -198,20 +332,35 @@ class GitRepo:
content += diffs
system_content = self.commit_prompt or prompts.commit_system
messages = [
dict(role="system", content=system_content),
dict(role="user", content=content),
]
language_instruction = ""
if user_language:
language_instruction = f"\n- Is written in {user_language}."
system_content = system_content.format(language_instruction=language_instruction)
commit_message = None
for model in self.models:
num_tokens = model.token_count(messages)
max_tokens = model.info.get("max_input_tokens") or 0
if max_tokens and num_tokens > max_tokens:
continue
commit_message = model.simple_send_with_retries(messages)
if commit_message:
break
spinner_text = f"Generating commit message with {model.name}"
with WaitingSpinner(spinner_text):
if model.system_prompt_prefix:
current_system_content = model.system_prompt_prefix + "\n" + system_content
else:
current_system_content = system_content
messages = [
dict(role="system", content=current_system_content),
dict(role="user", content=content),
]
num_tokens = model.token_count(messages)
max_tokens = model.info.get("max_input_tokens") or 0
if max_tokens and num_tokens > max_tokens:
continue
commit_message = model.simple_send_with_retries(messages)
if commit_message:
break # Found a model that could generate the message
if not commit_message:
self.io.tool_error("Failed to generate commit message!")
@@ -248,14 +397,20 @@ class GitRepo:
try:
if current_branch_has_commits:
args = ["HEAD", "--"] + list(fnames)
diffs += self.repo.git.diff(*args)
diffs += self.repo.git.diff(*args, stdout_as_string=False).decode(
self.io.encoding, "replace"
)
return diffs
wd_args = ["--"] + list(fnames)
index_args = ["--cached"] + wd_args
diffs += self.repo.git.diff(*index_args)
diffs += self.repo.git.diff(*wd_args)
diffs += self.repo.git.diff(*index_args, stdout_as_string=False).decode(
self.io.encoding, "replace"
)
diffs += self.repo.git.diff(*wd_args, stdout_as_string=False).decode(
self.io.encoding, "replace"
)
return diffs
except ANY_GIT_ERROR as err:
@@ -269,7 +424,9 @@ class GitRepo:
args += ["--color=never"]
args += [from_commit, to_commit]
diffs = self.repo.git.diff(*args)
diffs = self.repo.git.diff(*args, stdout_as_string=False).decode(
self.io.encoding, "replace"
)
return diffs

View File

@@ -19,7 +19,7 @@ from tqdm import tqdm
from aider.dump import dump
from aider.special import filter_important_files
from aider.utils import Spinner
from aider.waiting import Spinner
# tree_sitter is throwing a FutureWarning
warnings.simplefilter("ignore", category=FutureWarning)
@@ -35,6 +35,8 @@ CACHE_VERSION = 3
if USING_TSL_PACK:
CACHE_VERSION = 4
UPDATING_REPO_MAP_MESSAGE = "Updating repo map"
class RepoMap:
TAGS_CACHE_DIR = f".aider.tags.cache.v{CACHE_VERSION}"
@@ -380,7 +382,7 @@ class RepoMap:
if self.verbose:
self.io.tool_output(f"Processing {fname}")
if progress and not showing_bar:
progress()
progress(f"{UPDATING_REPO_MAP_MESSAGE}: {fname}")
try:
file_ok = Path(fname).is_file()
@@ -459,17 +461,18 @@ class RepoMap:
for ident in idents:
if progress:
progress()
progress(f"{UPDATING_REPO_MAP_MESSAGE}: {ident}")
definers = defines[ident]
mul = 1.0
is_snake = ("_" in ident) and any(c.isalpha() for c in ident)
is_kebab = ("-" in ident) and any(c.isalpha() for c in ident)
is_camel = any(c.isupper() for c in ident) and any(c.islower() for c in ident)
if ident in mentioned_idents:
mul *= 10
if (is_snake or is_camel) and len(ident) >= 8:
if (is_snake or is_kebab or is_camel) and len(ident) >= 8:
mul *= 10
if ident.startswith("_"):
mul *= 0.1
@@ -512,7 +515,7 @@ class RepoMap:
ranked_definitions = defaultdict(float)
for src in G.nodes:
if progress:
progress()
progress(f"{UPDATING_REPO_MAP_MESSAGE}: {src}")
src_rank = ranked[src]
total_weight = sum(data["weight"] for _src, _dst, data in G.out_edges(src, data=True))
@@ -621,7 +624,7 @@ class RepoMap:
if not mentioned_idents:
mentioned_idents = set()
spin = Spinner("Updating repo map")
spin = Spinner(UPDATING_REPO_MAP_MESSAGE)
ranked_tags = self.get_ranked_tags(
chat_fnames,
@@ -655,7 +658,11 @@ class RepoMap:
while lower_bound <= upper_bound:
# dump(lower_bound, middle, upper_bound)
spin.step()
if middle > 1500:
show_tokens = f"{middle / 1000.0:.1f}K"
else:
show_tokens = str(middle)
spin.step(f"{UPDATING_REPO_MAP_MESSAGE}: {show_tokens} tokens")
tree = self.to_tree(ranked_tags[:middle], chat_rel_fnames)
num_tokens = self.token_count(tree)

View File

@@ -49,7 +49,7 @@
},
"openrouter/deepseek/deepseek-chat-v3-0324": {
"max_tokens": 8192,
"max_input_tokens": 64000,
"max_input_tokens": 131072,
"max_output_tokens": 8192,
"input_cost_per_token": 0.00000055,
"input_cost_per_token_cache_hit": 0.00000014,
@@ -276,6 +276,61 @@
"supports_tool_choice": true,
"source": "https://cloud.google.com/vertex-ai/generative-ai/pricing"
},
"vertex_ai/gemini-2.5-pro": {
"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": 20,
"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",
"rpm": 2000,
"tpm": 8000000,
"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://cloud.google.com/vertex-ai/generative-ai/pricing"
},
"vertex_ai/gemini-2.5-flash": {
"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": 20,
"input_cost_per_token": 0.0000003,
"input_cost_per_audio_token": 0.000001,
"output_cost_per_token": 0.0000025,
"litellm_provider": "vertex_ai-language-models",
"mode": "chat",
"rpm": 10000,
"tpm": 8000000,
"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://cloud.google.com/vertex-ai/generative-ai/pricing"
},
"openrouter/google/gemini-2.5-pro-preview-03-25": {
"max_tokens": 8192,
"max_input_tokens": 1048576,
@@ -312,7 +367,43 @@
"supports_tool_choice": true,
"source": "https://cloud.google.com/vertex-ai/generative-ai/pricing"
},
"openrouter/google/gemini-2.5-pro-exp-03-25:free": {
"openrouter/google/gemini-2.5-pro-exp-03-25": {
"max_tokens": 8192,
"max_input_tokens": 1048576,
"max_output_tokens": 64000,
"max_images_per_prompt": 3000,
"max_videos_per_prompt": 10,
"max_video_length": 1,
"max_audio_length_hours": 8.4,
"max_audio_per_prompt": 1,
"max_pdf_size_mb": 30,
"input_cost_per_image": 0,
"input_cost_per_video_per_second": 0,
"input_cost_per_audio_per_second": 0,
"input_cost_per_token": 0,
"input_cost_per_character": 0,
"input_cost_per_token_above_128k_tokens": 0,
"input_cost_per_character_above_128k_tokens": 0,
"input_cost_per_image_above_128k_tokens": 0,
"input_cost_per_video_per_second_above_128k_tokens": 0,
"input_cost_per_audio_per_second_above_128k_tokens": 0,
"output_cost_per_token": 0,
"output_cost_per_character": 0,
"output_cost_per_token_above_128k_tokens": 0,
"output_cost_per_character_above_128k_tokens": 0,
"litellm_provider": "openrouter",
"mode": "chat",
"supports_system_messages": true,
"supports_function_calling": true,
"supports_vision": true,
"supports_audio_input": true,
"supports_video_input": true,
"supports_pdf_input": true,
"supports_response_schema": true,
"supports_tool_choice": true,
"source": "https://cloud.google.com/vertex-ai/generative-ai/pricing"
},
"openrouter/google/gemini-2.5": {
"max_tokens": 8192,
"max_input_tokens": 1048576,
"max_output_tokens": 64000,
@@ -403,4 +494,206 @@
"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-2.5-pro-preview-06-05": {
"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"
},
"gemini/gemini-2.5-pro-preview-06-05": {
"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"
},
"gemini/gemini-2.5-pro": {
"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": 20,
"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": 2000,
"tpm": 8000000,
"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"
},
"gemini/gemini-2.5-flash": {
"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": 20,
"input_cost_per_token": 0.00000035,
"input_cost_per_audio_token": 0.000001,
"output_cost_per_token": 0.0000025,
"litellm_provider": "gemini",
"mode": "chat",
"rpm": 10000,
"tpm": 8000000,
"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-flash"
},
"gemini/gemini-2.5-flash-lite-preview-06-17": {
"max_tokens": 64000,
"max_input_tokens": 1000000,
"max_output_tokens": 64000,
"max_images_per_prompt": 3000,
"max_videos_per_prompt": 10,
"max_video_length": 1,
"max_audio_length_hours": 8.4,
"max_audio_per_prompt": 1,
"max_pdf_size_mb": 20,
"input_cost_per_token": 0.00000001,
"input_cost_per_audio_token": 0.0000005,
"output_cost_per_token": 0.0000004,
"litellm_provider": "gemini",
"mode": "chat",
"rpm": 30000,
"tpm": 30000000,
"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-flash-lite"
},
"together_ai/Qwen/Qwen3-235B-A22B-fp8-tput": {
"input_cost_per_token": 0.0000002,
"output_cost_per_token": 0.0000006,
}
}

View File

@@ -315,7 +315,7 @@
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: vertex_ai-anthropic_models/vertex_ai/claude-3-7-sonnet@20250219
- name: vertex_ai/claude-3-7-sonnet@20250219
overeager: true
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
@@ -323,7 +323,7 @@
examples_as_sys_msg: true
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai-anthropic_models/vertex_ai/claude-3-7-sonnet@20250219
editor_model_name: vertex_ai/claude-3-7-sonnet@20250219
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
@@ -533,28 +533,10 @@
edit_format: diff-fenced
use_repo_map: true
- name: gemini/gemini-1.5-pro-exp-0827
edit_format: diff-fenced
use_repo_map: true
- name: gemini/gemini-exp-1206
edit_format: diff
use_repo_map: true
- name: gemini/gemini-exp-1114
edit_format: diff
use_repo_map: true
- name: gemini/gemini-exp-1121
edit_format: diff
use_repo_map: true
- name: vertex_ai/gemini-pro-experimental
edit_format: diff-fenced
use_repo_map: true
- name: gemini/gemini-1.5-flash-exp-0827
- name: gemini/gemini-2.0-flash-exp
edit_format: diff
use_repo_map: true
@@ -603,7 +585,7 @@
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
max_tokens: 64000
caches_by_default: true
use_temperature: false
editor_model_name: deepseek/deepseek-chat
@@ -674,7 +656,7 @@
reminder: sys
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
max_tokens: 65536
caches_by_default: true
- name: openrouter/openai/gpt-4o
@@ -818,6 +800,13 @@
editor_model_name: openrouter/deepseek/deepseek-chat
editor_edit_format: editor-diff
- name: openrouter/moonshotai/kimi-k2
edit_format: diff
use_repo_map: true
examples_as_sys_msg: true
extra_params:
temperature: 0.6
- name: fireworks_ai/accounts/fireworks/models/deepseek-r1
edit_format: diff
weak_model_name: fireworks_ai/accounts/fireworks/models/deepseek-v3
@@ -969,7 +958,7 @@
overeager: true
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
- name: openrouter/google/gemini-2.5-pro-exp-03-25:free
- name: openrouter/google/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
overeager: true
use_repo_map: true
@@ -978,16 +967,16 @@
- name: vertex_ai/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
use_repo_map: true
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
weak_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
editor_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
- name: vertex_ai/gemini-2.5-pro-preview-03-25
edit_format: diff-fenced
use_repo_map: true
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
weak_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
editor_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
- name: openrouter/openrouter/quasar-alpha
use_repo_map: true
@@ -1007,9 +996,6 @@
edit_format: whole
accepts_settings:
- reasoning_effort
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openai/o4-mini
edit_format: diff
@@ -1021,9 +1007,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openrouter/openai/o4-mini
edit_format: diff
@@ -1035,9 +1018,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: azure/o4-mini
edit_format: diff
@@ -1049,18 +1029,24 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: xai/grok-4
use_repo_map: true
edit_format: diff
accepts_settings:
- reasoning_effort
- name: openrouter/x-ai/grok-4
use_repo_map: true
edit_format: diff
accepts_settings:
- reasoning_effort
- name: xai/grok-3-mini-beta
use_repo_map: true
edit_format: whole
accepts_settings:
- reasoning_effort
#extra_params:
# extra_body:
# reasoning_effort: low
- name: openrouter/x-ai/grok-3-fast-beta
use_repo_map: true
@@ -1153,9 +1139,17 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: o3-pro
streaming: false
edit_format: diff
weak_model_name: gpt-4.1-mini
use_repo_map: true
editor_model_name: gpt-4.1
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
- name: openai/o4-mini
edit_format: diff
@@ -1167,9 +1161,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openrouter/openai/o4-mini
edit_format: diff
@@ -1181,9 +1172,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: azure/o4-mini
edit_format: diff
@@ -1195,9 +1183,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openai/o3
streaming: false
@@ -1209,9 +1194,17 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openai/o3-pro
streaming: false
edit_format: diff
weak_model_name: openai/gpt-4.1-mini
use_repo_map: true
editor_model_name: openai/gpt-4.1
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
- name: openai/o4-mini
edit_format: diff
@@ -1223,9 +1216,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openrouter/openai/o4-mini
edit_format: diff
@@ -1237,9 +1227,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: azure/o4-mini
edit_format: diff
@@ -1251,9 +1238,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openrouter/openai/o3
streaming: false
@@ -1265,9 +1249,17 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openrouter/openai/o3-pro
streaming: false
edit_format: diff
weak_model_name: openrouter/openai/gpt-4.1-mini
use_repo_map: true
editor_model_name: openrouter/openai/gpt-4.1
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
- name: openai/o4-mini
edit_format: diff
@@ -1279,9 +1271,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: openrouter/openai/o4-mini
edit_format: diff
@@ -1293,9 +1282,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: azure/o4-mini
edit_format: diff
@@ -1307,9 +1293,6 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: azure/o3
streaming: false
@@ -1321,9 +1304,17 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: azure/o3-pro
streaming: false
edit_format: diff
weak_model_name: azure/gpt-4.1-mini
use_repo_map: true
editor_model_name: azure/gpt-4.1
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
- name: openai/o4-mini
edit_format: diff
@@ -1368,21 +1359,463 @@
system_prompt_prefix: "Formatting re-enabled. "
accepts_settings: ["reasoning_effort"]
examples_as_sys_msg: true
#extra_params:
# extra_body:
# reasoning_effort: high
- name: gemini/gemini-2.5-flash-preview-04-17
edit_format: diff
use_repo_map: true
accepts_settings: ["thinking_tokens"]
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
- name: vertex_ai/gemini-2.5-flash-preview-04-17
edit_format: diff
use_repo_map: true
accepts_settings: ["reasoning_effort", "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
- 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.5-flash-preview-04-17
- name: gemini/gemini-2.5-pro-preview-06-05
overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
accepts_settings: ["thinking_tokens"]
- name: gemini/gemini-2.5-flash
overeager: true
edit_format: diff-fenced
use_repo_map: true
use_temperature: false
accepts_settings: ["thinking_tokens"]
- name: gemini/gemini-2.5-pro
overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: gemini/gemini-2.5-flash
use_temperature: false
accepts_settings: ["thinking_tokens"]
- name: gemini/gemini-2.5-flash-lite-preview-06-17
overeager: true
edit_format: diff-fenced
use_repo_map: true
use_temperature: false
accepts_settings: ["thinking_tokens"]
- name: vertex_ai/gemini-2.5-pro-preview-05-06
edit_format: diff-fenced
use_repo_map: true
weak_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
- name: vertex_ai/gemini-2.5-pro-preview-06-05
edit_format: diff-fenced
use_repo_map: true
weak_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
overeager: true
editor_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
accepts_settings: ["thinking_tokens"]
- name: vertex_ai/gemini-2.5-pro
edit_format: diff-fenced
use_repo_map: true
weak_model_name: vertex_ai/gemini-2.5-flash
overeager: true
editor_model_name: vertex_ai/gemini-2.5-flash
accepts_settings: ["thinking_tokens"]
- name: vertex_ai/gemini-2.5-flash
overeager: true
edit_format: diff-fenced
use_repo_map: true
accepts_settings: ["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
- name: openrouter/google/gemini-2.5-pro-preview-06-05
overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.0-flash-001
accepts_settings: ["thinking_tokens"]
- name: openrouter/google/gemini-2.5-pro
overeager: true
edit_format: diff-fenced
use_repo_map: true
weak_model_name: openrouter/google/gemini-2.5-flash
accepts_settings: ["thinking_tokens"]
#- name: openrouter/qwen/qwen3-235b-a22b
# system_prompt_prefix: "/no_think"
# use_temperature: 0.7
# extra_params:
# max_tokens: 24000
# top_p: 0.8
# top_k: 20
# min_p: 0.0
# temperature: 0.7
# extra_body:
# provider:
# order: ["Together"]
#- name: together_ai/Qwen/Qwen3-235B-A22B-fp8-tput
# system_prompt_prefix: "/no_think"
# use_temperature: 0.7
# reasoning_tag: think
# extra_params:
# max_tokens: 24000
# top_p: 0.8
# top_k: 20
# min_p: 0.0
# temperature: 0.7
- name: claude-sonnet-4-20250514
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: claude-sonnet-4-20250514
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: anthropic/claude-sonnet-4-20250514
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: anthropic/claude-sonnet-4-20250514
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: bedrock/anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock/anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: bedrock_converse/anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock_converse/anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: bedrock_converse/us.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock_converse/us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: vertex_ai/claude-sonnet-4@20250514
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
examples_as_sys_msg: false
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai/claude-sonnet-4@20250514
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: vertex_ai/claude-sonnet-4@20250514
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
examples_as_sys_msg: false
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai/claude-sonnet-4@20250514
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: openrouter/anthropic/claude-sonnet-4
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: openrouter/anthropic/claude-sonnet-4
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: bedrock_converse/eu.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/eu.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock_converse/eu.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: eu.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: eu.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: eu.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: us.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: claude-opus-4-20250514
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: claude-sonnet-4-20250514
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: anthropic/claude-opus-4-20250514
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: anthropic/claude-sonnet-4-20250514
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: bedrock_converse/anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: bedrock_converse/anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: bedrock_converse/us.anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: bedrock_converse/us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: bedrock_converse/eu.anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/eu.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: bedrock_converse/eu.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: eu.anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: eu.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: eu.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: us.anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: vertex_ai/claude-opus-4@20250514
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
examples_as_sys_msg: false
extra_params:
max_tokens: 32000
editor_model_name: vertex_ai/claude-sonnet-4@20250514
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: vertex_ai/claude-opus-4@20250514
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
examples_as_sys_msg: false
extra_params:
max_tokens: 32000
editor_model_name: vertex_ai/claude-sonnet-4@20250514
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]
- name: vertex_ai/gemini-2.5-flash-preview-05-20
edit_format: diff
use_repo_map: true
accepts_settings: ["reasoning_effort", "thinking_tokens"]
- name: openrouter/anthropic/claude-opus-4
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku
use_repo_map: true
examples_as_sys_msg: false
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: openrouter/anthropic/claude-sonnet-4
editor_edit_format: editor-diff
accepts_settings: ["thinking_tokens"]

View File

@@ -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
@@ -262,7 +272,7 @@ def slimdown_html(soup):
def main(url):
scraper = Scraper()
scraper = Scraper(playwright_available=has_playwright())
content = scraper.scrape(url)
print(content)

View File

@@ -1,14 +1,14 @@
import itertools
import os
import platform
import shlex
import subprocess
import sys
import tempfile
import time
from pathlib import Path
import oslex
from aider.dump import dump # noqa: F401
from aider.waiting import Spinner
IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".webp", ".pdf"}
@@ -211,6 +211,13 @@ def run_install(cmd):
print()
print("Installing:", printable_shell_command(cmd))
# First ensure pip is available
ensurepip_cmd = [sys.executable, "-m", "ensurepip", "--upgrade"]
try:
subprocess.run(ensurepip_cmd, capture_output=True, check=False)
except Exception:
pass # Continue even if ensurepip fails
try:
output = []
process = subprocess.Popen(
@@ -250,55 +257,6 @@ def run_install(cmd):
return False, output
class Spinner:
unicode_spinner = ["", "", "", "", "", "", "", "", "", ""]
ascii_spinner = ["|", "/", "-", "\\"]
def __init__(self, text):
self.text = text
self.start_time = time.time()
self.last_update = 0
self.visible = False
self.is_tty = sys.stdout.isatty()
self.tested = False
def test_charset(self):
if self.tested:
return
self.tested = True
# Try unicode first, fall back to ascii if needed
try:
# Test if we can print unicode characters
print(self.unicode_spinner[0], end="", flush=True)
print("\r", end="", flush=True)
self.spinner_chars = itertools.cycle(self.unicode_spinner)
except UnicodeEncodeError:
self.spinner_chars = itertools.cycle(self.ascii_spinner)
def step(self):
if not self.is_tty:
return
current_time = time.time()
if not self.visible and current_time - self.start_time >= 0.5:
self.visible = True
self._step()
elif self.visible and current_time - self.last_update >= 0.1:
self._step()
self.last_update = current_time
def _step(self):
if not self.visible:
return
self.test_charset()
print(f"\r{self.text} {next(self.spinner_chars)}\r{self.text} ", end="", flush=True)
def end(self):
if self.visible and self.is_tty:
print("\r" + " " * (len(self.text) + 3))
def find_common_root(abs_fnames):
try:
if len(abs_fnames) == 1:
@@ -384,19 +342,4 @@ 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)
def main():
spinner = Spinner("Running spinner...")
for _ in range(40): # 40 steps * 0.25 seconds = 10 seconds
time.sleep(0.25)
spinner.step()
spinner.end()
if __name__ == "__main__":
main()
return oslex.join(cmd_list)

221
aider/waiting.py Normal file
View File

@@ -0,0 +1,221 @@
#!/usr/bin/env python
"""
Thread-based, killable spinner utility.
Use it like:
from aider.waiting import WaitingSpinner
spinner = WaitingSpinner("Waiting for LLM")
spinner.start()
... # long task
spinner.stop()
"""
import sys
import threading
import time
from rich.console import Console
class Spinner:
"""
Minimal spinner that scans a single marker back and forth across a line.
The animation is pre-rendered into a list of frames. If the terminal
cannot display unicode the frames are converted to plain ASCII.
"""
last_frame_idx = 0 # Class variable to store the last frame index
def __init__(self, text: str, width: int = 7):
self.text = text
self.start_time = time.time()
self.last_update = 0.0
self.visible = False
self.is_tty = sys.stdout.isatty()
self.console = Console()
# Pre-render the animation frames using pure ASCII so they will
# always display, even on very limited terminals.
ascii_frames = [
"#= ", # C1 C2 space(8)
"=# ", # C2 C1 space(8)
" =# ", # space(1) C2 C1 space(7)
" =# ", # space(2) C2 C1 space(6)
" =# ", # space(3) C2 C1 space(5)
" =# ", # space(4) C2 C1 space(4)
" =# ", # space(5) C2 C1 space(3)
" =# ", # space(6) C2 C1 space(2)
" =# ", # space(7) C2 C1 space(1)
" =#", # space(8) C2 C1
" #=", # space(8) C1 C2
" #= ", # space(7) C1 C2 space(1)
" #= ", # space(6) C1 C2 space(2)
" #= ", # space(5) C1 C2 space(3)
" #= ", # space(4) C1 C2 space(4)
" #= ", # space(3) C1 C2 space(5)
" #= ", # space(2) C1 C2 space(6)
" #= ", # space(1) C1 C2 space(7)
]
self.unicode_palette = "░█"
xlate_from, xlate_to = ("=#", self.unicode_palette)
# If unicode is supported, swap the ASCII chars for nicer glyphs.
if self._supports_unicode():
translation_table = str.maketrans(xlate_from, xlate_to)
frames = [f.translate(translation_table) for f in ascii_frames]
self.scan_char = xlate_to[xlate_from.find("#")]
else:
frames = ascii_frames
self.scan_char = "#"
# Bounce the scanner back and forth.
self.frames = frames
self.frame_idx = Spinner.last_frame_idx # Initialize from class variable
self.width = len(frames[0]) - 2 # number of chars between the brackets
self.animation_len = len(frames[0])
self.last_display_len = 0 # Length of the last spinner line (frame + text)
def _supports_unicode(self) -> bool:
if not self.is_tty:
return False
try:
out = self.unicode_palette
out += "\b" * len(self.unicode_palette)
out += " " * len(self.unicode_palette)
out += "\b" * len(self.unicode_palette)
sys.stdout.write(out)
sys.stdout.flush()
return True
except UnicodeEncodeError:
return False
except Exception:
return False
def _next_frame(self) -> str:
frame = self.frames[self.frame_idx]
self.frame_idx = (self.frame_idx + 1) % len(self.frames)
Spinner.last_frame_idx = self.frame_idx # Update class variable
return frame
def step(self, text: str = None) -> None:
if text is not None:
self.text = text
if not self.is_tty:
return
now = time.time()
if not self.visible and now - self.start_time >= 0.5:
self.visible = True
self.last_update = 0.0
if self.is_tty:
self.console.show_cursor(False)
if not self.visible or now - self.last_update < 0.1:
return
self.last_update = now
frame_str = self._next_frame()
# Determine the maximum width for the spinner line
# Subtract 2 as requested, to leave a margin or prevent cursor wrapping issues
max_spinner_width = self.console.width - 2
if max_spinner_width < 0: # Handle extremely narrow terminals
max_spinner_width = 0
current_text_payload = f" {self.text}"
line_to_display = f"{frame_str}{current_text_payload}"
# Truncate the line if it's too long for the console width
if len(line_to_display) > max_spinner_width:
line_to_display = line_to_display[:max_spinner_width]
len_line_to_display = len(line_to_display)
# Calculate padding to clear any remnants from a longer previous line
padding_to_clear = " " * max(0, self.last_display_len - len_line_to_display)
# Write the spinner frame, text, and any necessary clearing spaces
sys.stdout.write(f"\r{line_to_display}{padding_to_clear}")
self.last_display_len = len_line_to_display
# Calculate number of backspaces to position cursor at the scanner character
scan_char_abs_pos = frame_str.find(self.scan_char)
# Total characters written to the line (frame + text + padding)
total_chars_written_on_line = len_line_to_display + len(padding_to_clear)
# num_backspaces will be non-positive if scan_char_abs_pos is beyond
# total_chars_written_on_line (e.g., if the scan char itself was truncated).
# (e.g., if the scan char itself was truncated).
# In such cases, (effectively) 0 backspaces are written,
# and the cursor stays at the end of the line.
num_backspaces = total_chars_written_on_line - scan_char_abs_pos
sys.stdout.write("\b" * num_backspaces)
sys.stdout.flush()
def end(self) -> None:
if self.visible and self.is_tty:
clear_len = self.last_display_len # Use the length of the last displayed content
sys.stdout.write("\r" + " " * clear_len + "\r")
sys.stdout.flush()
self.console.show_cursor(True)
self.visible = False
class WaitingSpinner:
"""Background spinner that can be started/stopped safely."""
def __init__(self, text: str = "Waiting for LLM", delay: float = 0.15):
self.spinner = Spinner(text)
self.delay = delay
self._stop_event = threading.Event()
self._thread = threading.Thread(target=self._spin, daemon=True)
def _spin(self):
while not self._stop_event.is_set():
self.spinner.step()
time.sleep(self.delay)
self.spinner.end()
def start(self):
"""Start the spinner in a background thread."""
if not self._thread.is_alive():
self._thread.start()
def stop(self):
"""Request the spinner to stop and wait briefly for the thread to exit."""
self._stop_event.set()
if self._thread.is_alive():
self._thread.join(timeout=self.delay)
self.spinner.end()
# Allow use as a context-manager
def __enter__(self):
self.start()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.stop()
def main():
spinner = Spinner("Running spinner...")
try:
for _ in range(100):
time.sleep(0.15)
spinner.step()
print("Success!")
except KeyboardInterrupt:
print("\nInterrupted by user.")
finally:
spinner.end()
if __name__ == "__main__":
main()

View File

@@ -24,7 +24,122 @@ cog.out(text)
]]]-->
### main branch
### Aider v0.85.4
- Added support for openai/gpt-5
- Fixed analytics to support the latest PostHog SDK event-capture API.
- Disabled temperature when using GPT-5 models for more deterministic outputs.
### Aider v0.85.3
- Bumped dependencies to pick up latest litellm==1.75.0.
### Aider v0.85.2
- Added support for Grok-4 via `xai/grok-4` and `openrouter/x-ai/grok-4` model names.
- Added support for `gemini/gemini-2.5-flash-lite-preview-06-17` model, by Tamir Zahavi-Brunner.
- `/clear` now prints “All chat history cleared.” so you know it worked, by Zexin Yuan.
- `/undo` output now shows only the first line of each commit message, making it easier to read.
- Fixed an issue where new settings for an existing model didn't replace the old ones, by Andrew Grigorev.
- Added support for `openrouter/moonshotai/kimi-k2` model, by Jack Harrington.
### Aider v0.85.1
- Display model announcements with no-arg `/model` command.
### Aider v0.85.0
- Support for Responses API models like o1-pro, o3-pro.
- Updated pricing for o3.
- Added support for new Gemini models including `gemini-2.5-pro`, `gemini-2.5-flash`, and `gemini-2.5-pro-preview-06-05` with thinking tokens support.
- Updated model aliases: `flash` now points to `gemini-2.5-flash` and `gemini` now points to `gemini-2.5-pro`.
- Added `--add-gitignore-files` flag to enable adding files listed in .gitignore to Aider's editing scope, by omarcinkonis.
- Added `--commit-language` option to specify the language for commit messages, by Kyosuke Takayama.
- Enhanced thinking tokens support: can now be disabled by setting to 0, and improved help text with examples.
- Added MATLAB language support for repository maps, by Matthew Tofano.
- Added support for OpenAI o3-pro model across multiple providers.
- Improved GitHub Copilot token handling with better validation and error messages, by Vincent Taverna and Sebastian Estrella.
- Fixed encoding issues in git diff output and LLM history logging.
- Enhanced commit message generation to use system prompt prefixes, by Luke Reeves.
- Improved inline code rendering in Rich markdown output, by Vamsi Talupula.
- Fixed Vertex AI model name prefixes in settings, by Wietse Venema.
- Improved `/read-only` command to resolve literal paths correctly, by Matteo Landi.
- Skip expensive file tracking operations when `--skip-sanity-check-repo` is enabled for better performance, by Makar Ivashko.
- Ensure pip is available before package installation.
- Auto-create parent directories for chat history files to prevent startup errors, by contributor.
- Fixed search block regex to accept optional closing tags when working with HTML content, by Mathis Beer.
- Co-authored-by attribution is now enabled by default for commit messages.
- Added Clojure language support for repository maps, by Garrett Hopper.
- Added custom PostHog analytics configuration options with `--analytics-posthog-host` and `--analytics-posthog-project-api-key` flags, by Vasil Markoukin.
- Optimized chat history summarization performance, by jayeshthk.
- Improved kebab-case identifier recognition in repository maps for better code analysis.
- Increased max tokens for Deepseek models to 65536 for better performance.
- Aider wrote 21% of the code in this release.
### Aider v0.84.0
- Added support for new Claude models including the Sonnet 4 and Opus 4 series (e.g., `claude-sonnet-4-20250514`,
`claude-opus-4-20250514`) across various providers. The default `sonnet` and `opus` aliases were updated to these newer
versions.
- Added support for the `vertex_ai/gemini-2.5-flash-preview-05-20` model.
- Fixed OpenRouter token cost calculation for improved accuracy.
- Updated default OpenRouter models during onboarding to `deepseek/deepseek-r1:free` for the free tier and
`anthropic/claude-sonnet-4` for paid tiers.
- Automatically refresh GitHub Copilot tokens when used as OpenAI API keys, by Lih Chen.
- Aider wrote 79% of the code in this release.
### Aider v0.83.2
- Bumped configargparse to 1.7.1 as 1.7 was pulled.
- Added shell tab completion for file path arguments (by saviour) and for `--edit-format`/`--editor-edit-format` options.
- Improved OpenRouter model metadata handling by introducing a local cache, increasing reliability and performance.
- The `/settings` command now displays detailed metadata for active main, editor, and weak models.
- Fixed an issue where files explicitly added via the command line were not correctly ignored if listed in `.gitignore`.
- Improved automatic commit messages by providing more context during their generation, by wangboxue.
### Aider v0.83.1
- Improved user language detection by correctly normalizing hyphenated language codes (e.g., `en-US` to `en`) and enhancing the validation of locale results.
- Prevented Aider from instructing the LLM to reply in 'C' or 'POSIX' when these are detected as the system locale.
- Displayed a spinner with the model name when generating commit messages.
### Aider v0.83.0
- Added support for `gemini-2.5-pro-preview-05-06` models.
- Added support for `qwen3-235b` models.
- Added repo-map support for OCaml and OCaml interface files, by Andrey Popp.
- Added a spinner animation while waiting for the LLM to start streaming its response.
- Updated the spinner animation to a Knight Rider style.
- 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.
- Commit message prompt specifies the user's language.
- 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`.
- 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.
- 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.
- Improved `/ask` mode to instruct the LLM to elide unchanging code in its responses.
- Ensured web scraping in the GUI also respects Playwright availability and the `--disable-playwright` flag.
- Improved display of filenames in the prompt header using rich Text formatting.
- Enabled `reasoning_effort` for Gemini 2.5 Flash models.
- Added a `--shell-completions` argument to generate shell completion scripts (e.g., for bash, zsh).
- Explicit `--attribute-author` or `--attribute-committer` flags now override the default behavior when `--attribute-co-authored-by` is used, allowing finer control over commit attribution, by Andrew Grigorev.
- Fixed an issue where read-only status of files might not be preserved correctly by some commands (e.g. `/drop` after adding a read-only file).
- The `aider-args` utility (or `python -m aider.args`) now defaults to printing a sample YAML configuration if no arguments are provided.
- Displayed token count progress and the name of the file or identifier being processed during repo map updates.
- Extended the waiting spinner to also show for non-streaming responses and further enhanced its animation with console width clipping, cursor hiding, and a more continuous appearance.
- Dropped support for Python 3.9.
- Aider wrote 55% of the code in this release.
### 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,9 +149,8 @@ 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.
### Aider v0.82.2
@@ -393,7 +507,7 @@ cog.out(text)
- [Aider works with LLM web chat UIs](https://aider.chat/docs/usage/copypaste.html).
- New `--copy-paste` mode.
- New `/copy-context` command.
- [Set API keys and other environment variables for all providers from command line or yaml conf file](https://aider.chat/docs/config/aider_conf.html#storing-llm-keys).
- [Set API keys and other environment variables for all providers from command line or YAML conf file](https://aider.chat/docs/config/aider_conf.html#storing-llm-keys).
- New `--api-key provider=key` setting.
- New `--set-env VAR=value` setting.
- Added bash and zsh support to `--watch-files`.
@@ -561,7 +675,7 @@ cog.out(text)
### Aider v0.59.1
- Check for obsolete `yes: true` in yaml config, show helpful error.
- Check for obsolete `yes: true` in YAML config, show helpful error.
- Model settings for openrouter/anthropic/claude-3.5-sonnet:beta
### Aider v0.59.0
@@ -571,7 +685,7 @@ cog.out(text)
- Still auto-completes the full paths of the repo files like `/add`.
- Now supports globs like `src/**/*.py`
- Renamed `--yes` to `--yes-always`.
- Now uses `AIDER_YES_ALWAYS` env var and `yes-always:` yaml key.
- Now uses `AIDER_YES_ALWAYS` env var and `yes-always:` YAML key.
- Existing YAML and .env files will need to be updated.
- Can still abbreviate to `--yes` on the command line.
- Config file now uses standard YAML list syntax with ` - list entries`, one per line.
@@ -778,7 +892,7 @@ cog.out(text)
- Use `--map-refresh <always|files|manual|auto>` to configure.
- Improved cost estimate logic for caching.
- Improved editing performance on Jupyter Notebook `.ipynb` files.
- Show which config yaml file is loaded with `--verbose`.
- Show which config YAML file is loaded with `--verbose`.
- Bumped dependency versions.
- Bugfix: properly load `.aider.models.metadata.json` data.
- Bugfix: Using `--msg /ask ...` caused an exception.

View File

@@ -32,7 +32,7 @@ aux_links:
"GitHub":
- "https://github.com/Aider-AI/aider"
"Discord":
- "https://discord.gg/Tv2uQnR88V"
- "https://discord.gg/Y7X7bhMQFV"
"Blog":
- "/blog/"
@@ -40,7 +40,7 @@ nav_external_links:
- title: "GitHub"
url: "https://github.com/Aider-AI/aider"
- title: "Discord"
url: "https://discord.gg/Tv2uQnR88V"
url: "https://discord.gg/Y7X7bhMQFV"
repository: Aider-AI/aider

View File

@@ -4500,3 +4500,351 @@
Paul Gauthier (aider): 1567
start_tag: v0.81.0
total_lines: 1706
- aider_percentage: 54.32
aider_total: 1409
end_date: '2025-05-09'
end_tag: v0.83.0
file_counts:
.github/workflows/check_pypi_version.yml:
Paul Gauthier (aider): 1
.github/workflows/pre-commit.yml:
MDW: 48
.github/workflows/ubuntu-tests.yml:
Paul Gauthier (aider): 1
.github/workflows/windows-tests.yml:
Paul Gauthier (aider): 1
.github/workflows/windows_check_pypi_version.yml:
Paul Gauthier (aider): 1
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Andrew Grigorev: 21
Andrew Grigorev (aider): 5
Paul Gauthier (aider): 38
aider/coders/__init__.py:
Paul Gauthier (aider): 2
aider/coders/base_coder.py:
Andrew Grigorev (aider): 2
Paul Gauthier: 60
Paul Gauthier (aider): 104
aider/coders/editblock_coder.py:
Paul Gauthier: 10
Paul Gauthier (aider): 7
zjy1412: 2
aider/coders/editblock_fenced_coder.py:
MDW: 1
aider/coders/help_coder.py:
MDW: 1
aider/coders/patch_coder.py:
Paul Gauthier (aider): 38
aider/coders/shell.py:
Paul Gauthier: 37
aider/coders/udiff_coder.py:
Paul Gauthier: 2
Paul Gauthier (aider): 9
aider/coders/udiff_simple.py:
Paul Gauthier (aider): 14
aider/commands.py:
Andrew Grigorev: 10
Paul Gauthier: 7
Paul Gauthier (aider): 1
aider/gui.py:
Jon Keys: 2
aider/io.py:
Kay Gosho: 1
Paul Gauthier (aider): 5
aider/linter.py:
Paul Gauthier: 1
Titusz Pan: 1
aider/main.py:
Paul Gauthier (aider): 9
aider/mdstream.py:
Paul Gauthier (aider): 11
aider/models.py:
Paul Gauthier: 4
Paul Gauthier (aider): 66
Stefan Hladnik: 4
Stefan Hladnik (aider): 41
aider/queries/tree-sitter-language-pack/ocaml_interface-tags.scm:
Andrey Popp: 98
aider/queries/tree-sitter-languages/ocaml_interface-tags.scm:
Andrey Popp: 98
aider/repo.py:
Andrew Grigorev: 115
Andrew Grigorev (aider): 21
Paul Gauthier: 6
Paul Gauthier (aider): 33
aider/repomap.py:
Paul Gauthier: 5
Paul Gauthier (aider): 6
aider/resources/model-settings.yml:
Paul Gauthier: 183
Paul Gauthier (aider): 175
cantalupo555: 1
aider/scrape.py:
Jon Keys: 12
aider/utils.py:
Paul Gauthier: 13
Paul Gauthier (aider): 131
Titusz Pan: 1
aider/waiting.py:
Paul Gauthier: 1
Paul Gauthier (aider): 54
aider/watch.py:
Paul Gauthier: 6
Paul Gauthier (aider): 7
aider/website/_includes/leaderboard_table.js:
Paul Gauthier: 2
Paul Gauthier (aider): 18
aider/website/docs/leaderboards/index.md:
Paul Gauthier: 1
Paul Gauthier (aider): 2
aider/website/index.html:
Paul Gauthier: 13
benchmark/benchmark.py:
Paul Gauthier: 3
Paul Gauthier (aider): 42
benchmark/docker.sh:
Paul Gauthier: 2
benchmark/refactor_tools.py:
MDW: 1
scripts/30k-image.py:
MDW: 1
scripts/clean_metadata.py:
Paul Gauthier (aider): 258
scripts/update-history.py:
Paul Gauthier: 2
Paul Gauthier (aider): 7
tests/basic/test_coder.py:
Paul Gauthier (aider): 3
tests/basic/test_commands.py:
Paul Gauthier: 2
Paul Gauthier (aider): 90
tests/basic/test_editblock.py:
Paul Gauthier: 10
zjy1412: 52
tests/basic/test_io.py:
Paul Gauthier (aider): 132
tests/basic/test_linter.py:
Paul Gauthier: 22
Titusz Pan: 10
tests/basic/test_repo.py:
Andrew Grigorev: 75
Andrew Grigorev (aider): 65
Paul Gauthier: 79
Paul Gauthier (aider): 6
tests/basic/test_repomap.py:
Andrey Popp: 7
tests/basic/test_watch.py:
MDW: 1
tests/fixtures/languages/ocaml_interface/test.mli:
Andrey Popp: 14
tests/scrape/test_playwright_disable.py:
Andrew Grigorev: 111
Paul Gauthier: 25
Paul Gauthier (aider): 3
grand_total:
Andrew Grigorev: 332
Andrew Grigorev (aider): 93
Andrey Popp: 217
Jon Keys: 14
Kay Gosho: 1
MDW: 53
Paul Gauthier: 497
Paul Gauthier (aider): 1275
Stefan Hladnik: 4
Stefan Hladnik (aider): 41
Titusz Pan: 12
cantalupo555: 1
zjy1412: 54
start_tag: v0.82.0
total_lines: 2594
- aider_percentage: 78.92
aider_total: 655
end_date: '2025-05-30'
end_tag: v0.84.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Paul Gauthier (aider): 27
saviour: 2
aider/args_formatter.py:
Paul Gauthier: 1
aider/coders/base_coder.py:
Paul Gauthier: 4
Paul Gauthier (aider): 10
aider/commands.py:
Paul Gauthier (aider): 23
wangboxue: 1
aider/models.py:
Lih Chen: 15
Paul Gauthier: 16
Paul Gauthier (aider): 12
aider/onboarding.py:
Paul Gauthier: 2
aider/openrouter.py:
Paul Gauthier (aider): 120
aider/repo.py:
Paul Gauthier: 1
Paul Gauthier (aider): 10
aider/repomap.py:
Paul Gauthier (aider): 1
aider/resources/model-settings.yml:
Paul Gauthier: 71
Paul Gauthier (aider): 193
Trung Dinh: 11
aider/utils.py:
Paul Gauthier (aider): 1
aider/waiting.py:
Paul Gauthier: 2
Paul Gauthier (aider): 6
aider/website/docs/leaderboards/index.md:
Paul Gauthier: 1
aider/website/index.html:
Paul Gauthier: 43
scripts/update-history.py:
Paul Gauthier: 2
tests/basic/test_coder.py:
Paul Gauthier: 2
Paul Gauthier (aider): 144
tests/basic/test_main.py:
Paul Gauthier (aider): 28
tests/basic/test_models.py:
Paul Gauthier (aider): 2
tests/basic/test_onboarding.py:
Paul Gauthier (aider): 5
tests/basic/test_openrouter.py:
Paul Gauthier (aider): 73
grand_total:
Lih Chen: 15
Paul Gauthier: 146
Paul Gauthier (aider): 655
Trung Dinh: 11
saviour: 2
wangboxue: 1
start_tag: v0.83.0
total_lines: 830
- aider_percentage: 20.82
aider_total: 127
end_date: '2025-06-27'
end_tag: v0.85.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/analytics.py:
Paul Gauthier: 5
Vasil Markoukin (aider): 6
aider/args.py:
Kyosuke Takayama: 6
Paul Gauthier: 7
Vasil Markoukin (aider): 9
omarcinkonis: 6
aider/coders/base_coder.py:
Kyosuke Takayama: 3
omarcinkonis: 3
aider/coders/editblock_coder.py:
Mathis Beer (aider): 1
aider/coders/search_replace.py:
Emmanuel Ferdman: 1
aider/commands.py:
Ali Ayas (claude-sonnet-4-20250514): 6
Matteo Landi: 16
Paul Gauthier: 4
omarcinkonis: 5
aider/history.py:
jayeshthk: 18
aider/io.py:
Paul Gauthier: 1
Paul Gauthier (aider): 14
Vamsi Talupula: 5
aider/main.py:
Kyosuke Takayama: 1
Makar Ivashko: 1
Paul Gauthier: 3
Vasil Markoukin (aider): 5
omarcinkonis: 1
aider/models.py:
Ali Ayas (claude-sonnet-4-20250514): 11
Nimesh Ghelani: 3
Paul Gauthier: 1
Sebastian Estrella: 11
Vincent Taverna: 32
aider/queries/tree-sitter-language-pack/clojure-tags.scm:
Garrett Hopper: 7
aider/queries/tree-sitter-language-pack/matlab-tags.scm:
Matthew Tofano: 4
aider/queries/tree-sitter-languages/matlab-tags.scm:
Matthew Tofano: 4
aider/repo.py:
Kyosuke Takayama: 3
Luke Reeves: 13
Paul Gauthier: 2
muravvv: 12
aider/repomap.py:
Garrett Hopper: 2
aider/resources/model-settings.yml:
Andrew Grigorev: 7
Leon Mergen: 20
Nimesh Ghelani: 15
Paul Gauthier: 2
Paul Gauthier (aider): 20
Trung Dinh: 8
Wietse Venema: 9
therealmarv: 14
aider/utils.py:
Paul Gauthier (aider): 7
aider/website/docs/leaderboards/index.md:
Paul Gauthier: 1
aider/website/index.html:
Paul Gauthier: 8
Paul Gauthier (aider): 1
benchmark/benchmark.py:
Paul Gauthier: 1
tests/basic/test_commands.py:
Matteo Landi: 22
tests/basic/test_history.py:
Paul Gauthier: 15
tests/basic/test_main.py:
Kyosuke Takayama: 10
Paul Gauthier: 3
Paul Gauthier (aider): 64
omarcinkonis: 41
tests/basic/test_repo.py:
Luke Reeves: 31
Paul Gauthier: 2
muravvv: 22
tests/basic/test_repomap.py:
Matthew Tofano: 3
Paul Gauthier: 3
tests/fixtures/languages/clojure/test.clj:
Paul Gauthier: 6
tests/fixtures/languages/matlab/test.m:
Matthew Tofano: 42
grand_total:
Ali Ayas (claude-sonnet-4-20250514): 17
Andrew Grigorev: 7
Emmanuel Ferdman: 1
Garrett Hopper: 9
Kyosuke Takayama: 23
Leon Mergen: 20
Luke Reeves: 44
Makar Ivashko: 1
Mathis Beer (aider): 1
Matteo Landi: 38
Matthew Tofano: 53
Nimesh Ghelani: 18
Paul Gauthier: 65
Paul Gauthier (aider): 106
Sebastian Estrella: 11
Trung Dinh: 8
Vamsi Talupula: 5
Vasil Markoukin (aider): 20
Vincent Taverna: 32
Wietse Venema: 9
jayeshthk: 18
muravvv: 34
omarcinkonis: 56
therealmarv: 14
start_tag: v0.84.0
total_lines: 610

View File

@@ -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
@@ -1093,32 +1093,6 @@
seconds_per_case: 12.0
total_cost: 0.4281
- dirname: 2025-04-16-21-20-55--o3-high-diff-temp0-exsys
test_cases: 225
model: o3 (high)
edit_format: diff
commit_hash: 24805ff-dirty
pass_rate_1: 36.9
pass_rate_2: 79.6
pass_num_1: 83
pass_num_2: 179
percent_cases_well_formed: 95.1
error_outputs: 11
num_malformed_responses: 11
num_with_malformed_responses: 11
user_asks: 110
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
total_tests: 225
command: aider --model o3
date: 2025-04-16
versions: 0.82.1.dev
seconds_per_case: 113.8
total_cost: 111.0325
- dirname: 2025-04-16-22-01-58--o4-mini-high-diff-exsys
test_cases: 225
model: o4-mini (high)
@@ -1145,34 +1119,6 @@
seconds_per_case: 176.5
total_cost: 19.6399
- dirname: 2025-04-17-01-20-35--o3-mini-high-diff-arch
test_cases: 225
model: o3 (high) + gpt-4.1
edit_format: architect
commit_hash: 80909e1-dirty
editor_model: gpt-4.1
editor_edit_format: editor-diff
pass_rate_1: 36.0
pass_rate_2: 82.7
pass_num_1: 81
pass_num_2: 186
percent_cases_well_formed: 100.0
error_outputs: 9
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 166
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
total_tests: 225
command: aider --model o3 --architect
date: 2025-04-17
versions: 0.82.2.dev
seconds_per_case: 110.0
total_cost: 69.2921
- dirname: 2025-04-19-14-43-04--o4-mini-patch
test_cases: 225
model: openhands-lm-32b-v0.1
@@ -1223,4 +1169,517 @@
date: 2025-04-20
versions: 0.82.3.dev
seconds_per_case: 50.1
total_cost: 1.8451
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-05-06
date: 2025-05-07
versions: 0.82.4.dev
seconds_per_case: 165.3
total_cost: 37.4104
- dirname: 2025-05-08-03-20-24--qwen3-32b-default
test_cases: 225
model: 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-09-17-02-02--qwen3-235b-a22b.unthink_16k_diff
test_cases: 225
model: Qwen3 235B A22B diff, no think, Alibaba API
edit_format: diff
commit_hash: 91d7fbd-dirty
pass_rate_1: 28.9
pass_rate_2: 59.6
pass_num_1: 65
pass_num_2: 134
percent_cases_well_formed: 92.9
error_outputs: 22
num_malformed_responses: 22
num_with_malformed_responses: 16
user_asks: 111
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2816192
completion_tokens: 342062
test_timeouts: 1
total_tests: 225
command: aider --model openai/qwen3-235b-a22b
date: 2025-05-09
versions: 0.82.4.dev
seconds_per_case: 45.4
total_cost: 0.0000
- dirname: 2025-05-24-21-17-54--sonnet4-diff-exuser
test_cases: 225
model: claude-sonnet-4-20250514 (no thinking)
edit_format: diff
commit_hash: ef3f8bb-dirty
pass_rate_1: 20.4
pass_rate_2: 56.4
pass_num_1: 46
pass_num_2: 127
percent_cases_well_formed: 98.2
error_outputs: 6
num_malformed_responses: 4
num_with_malformed_responses: 4
user_asks: 129
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
prompt_tokens: 3460663
completion_tokens: 433373
test_timeouts: 7
total_tests: 225
command: aider --model claude-sonnet-4-20250514
date: 2025-05-24
versions: 0.83.3.dev
seconds_per_case: 29.8
total_cost: 15.8155
- dirname: 2025-05-24-22-10-36--sonnet4-diff-exuser-think32k
test_cases: 225
model: claude-sonnet-4-20250514 (32k thinking)
edit_format: diff
commit_hash: e3cb907
thinking_tokens: 32000
pass_rate_1: 25.8
pass_rate_2: 61.3
pass_num_1: 58
pass_num_2: 138
percent_cases_well_formed: 97.3
error_outputs: 10
num_malformed_responses: 10
num_with_malformed_responses: 6
user_asks: 111
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2863068
completion_tokens: 1271074
test_timeouts: 6
total_tests: 225
command: aider --model claude-sonnet-4-20250514
date: 2025-05-24
versions: 0.83.3.dev
seconds_per_case: 79.9
total_cost: 26.5755
- dirname: 2025-05-25-19-57-20--opus4-diff-exuser
test_cases: 225
model: claude-opus-4-20250514 (no think)
edit_format: diff
commit_hash: 9ef3211
pass_rate_1: 32.9
pass_rate_2: 70.7
pass_num_1: 74
pass_num_2: 159
percent_cases_well_formed: 98.7
error_outputs: 3
num_malformed_responses: 3
num_with_malformed_responses: 3
user_asks: 105
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2671437
completion_tokens: 380717
test_timeouts: 3
total_tests: 225
command: aider --model claude-opus-4-20250514
date: 2025-05-25
versions: 0.83.3.dev
seconds_per_case: 42.5
total_cost: 68.6253
- dirname: 2025-05-25-20-40-51--opus4-diff-exuser
test_cases: 225
model: claude-opus-4-20250514 (32k thinking)
edit_format: diff
commit_hash: 9ef3211
thinking_tokens: 32000
pass_rate_1: 37.3
pass_rate_2: 72.0
pass_num_1: 84
pass_num_2: 162
percent_cases_well_formed: 97.3
error_outputs: 10
num_malformed_responses: 6
num_with_malformed_responses: 6
user_asks: 97
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2567514
completion_tokens: 363142
test_timeouts: 4
total_tests: 225
command: aider --model claude-opus-4-20250514
date: 2025-05-25
versions: 0.83.3.dev
seconds_per_case: 44.1
total_cost: 65.7484
- dirname: 2025-05-26-15-56-31--flash25-05-20-24k-think # dirname is misleading
test_cases: 225
model: gemini-2.5-flash-preview-05-20 (no think)
edit_format: diff
commit_hash: 214b811-dirty
thinking_tokens: 0 # <-- no thinking
pass_rate_1: 20.9
pass_rate_2: 44.0
pass_num_1: 47
pass_num_2: 99
percent_cases_well_formed: 93.8
error_outputs: 16
num_malformed_responses: 16
num_with_malformed_responses: 14
user_asks: 79
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 5512458
completion_tokens: 514145
test_timeouts: 4
total_tests: 225
command: aider --model gemini/gemini-2.5-flash-preview-05-20
date: 2025-05-26
versions: 0.83.3.dev
seconds_per_case: 12.2
total_cost: 1.1354
- dirname: 2025-05-25-22-58-44--flash25-05-20-24k-think
test_cases: 225
model: gemini-2.5-flash-preview-05-20 (24k think)
edit_format: diff
commit_hash: a8568c3-dirty
thinking_tokens: 24576
pass_rate_1: 26.2
pass_rate_2: 55.1
pass_num_1: 59
pass_num_2: 124
percent_cases_well_formed: 95.6
error_outputs: 15
num_malformed_responses: 15
num_with_malformed_responses: 10
user_asks: 101
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 3666792
completion_tokens: 2703162
test_timeouts: 4
total_tests: 225
command: aider --model gemini/gemini-2.5-flash-preview-05-20
date: 2025-05-25
versions: 0.83.3.dev
seconds_per_case: 53.9
total_cost: 8.5625
- dirname: 2025-06-06-18-38-56--gemini0605-diff-fenced
test_cases: 225
model: gemini-2.5-pro-preview-06-05 (default think)
edit_format: diff-fenced
commit_hash: 4c161f9-dirty
pass_rate_1: 44.9
pass_rate_2: 79.1
pass_num_1: 101
pass_num_2: 178
percent_cases_well_formed: 100.0
error_outputs: 4
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 105
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 4
prompt_tokens: 2751296
completion_tokens: 4142197
test_timeouts: 1
total_tests: 225
command: aider --model gemini/gemini-2.5-pro-preview-06-05
date: 2025-06-06
versions: 0.84.1.dev
seconds_per_case: 175.2
total_cost: 45.5961
- dirname: 2025-06-06-16-36-21--gemini0605-32k-think-diff-fenced
test_cases: 225
model: gemini-2.5-pro-preview-06-05 (32k think)
edit_format: diff-fenced
commit_hash: f827f22
thinking_tokens: 32768
pass_rate_1: 46.2
pass_rate_2: 83.1
pass_num_1: 104
pass_num_2: 187
percent_cases_well_formed: 99.6
error_outputs: 1
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 112
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2719961
completion_tokens: 4648227
test_timeouts: 0
total_tests: 225
command: aider --model gemini/gemini-2.5-pro-preview-06-05 --thinking-tokens 32k
date: 2025-06-06
versions: 0.84.1.dev
seconds_per_case: 200.3
total_cost: 49.8822
- dirname: 2025-06-06-16-47-07--r1-diff
test_cases: 224
model: DeepSeek R1 (0528)
edit_format: diff
commit_hash: 4c161f9-dirty
pass_rate_1: 34.4
pass_rate_2: 71.4
pass_num_1: 77
pass_num_2: 160
percent_cases_well_formed: 94.6
error_outputs: 28
num_malformed_responses: 15
num_with_malformed_responses: 12
user_asks: 105
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2644169
completion_tokens: 1842168
test_timeouts: 2
total_tests: 225
command: aider --model deepseek/deepseek-reasoner
date: 2025-06-06
versions: 0.84.1.dev
seconds_per_case: 716.6
total_cost: 4.8016
- dirname: 2025-06-25-21-04-24--o3-price-reduction-high
test_cases: 225
model: o3 (high)
edit_format: diff
commit_hash: c48fea6
reasoning_effort: high
pass_rate_1: 40.0
pass_rate_2: 81.3
pass_num_1: 90
pass_num_2: 183
percent_cases_well_formed: 94.7
error_outputs: 25
num_malformed_responses: 23
num_with_malformed_responses: 12
user_asks: 116
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
prompt_tokens: 3148932
completion_tokens: 2047615
test_timeouts: 2
total_tests: 225
command: aider --model o3 --reasoning-effort high
date: 2025-06-25
versions: 0.84.1.dev
seconds_per_case: 197.3
total_cost: 21.2259
- dirname: 2025-06-25-20-30-16--o3-price-reduction
test_cases: 225
model: o3
edit_format: diff
commit_hash: c48fea6
pass_rate_1: 40.9
pass_rate_2: 76.9
pass_num_1: 92
pass_num_2: 173
percent_cases_well_formed: 93.8
error_outputs: 22
num_malformed_responses: 22
num_with_malformed_responses: 14
user_asks: 108
lazy_comments: 2
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2893189
completion_tokens: 1154767
test_timeouts: 1
total_tests: 225
command: aider --model o3
date: 2025-06-25
versions: 0.84.1.dev
seconds_per_case: 101.7
total_cost: 13.7517
- dirname: 2025-06-27-23-53-57--o3-mini-high-diff-arch
test_cases: 224
model: o3 (high) + gpt-4.1
edit_format: architect
commit_hash: 4f4f00f-dirty
editor_model: gpt-4.1
editor_edit_format: editor-diff
reasoning_effort: high
pass_rate_1: 34.8
pass_rate_2: 78.2
pass_num_1: 78
pass_num_2: 176
percent_cases_well_formed: 100.0
error_outputs: 18
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 172
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
prompt_tokens: 1306877
completion_tokens: 1327154
test_timeouts: 1
total_tests: 225
command: aider --model o3
date: 2025-06-27
versions: 0.85.1.dev
seconds_per_case: 121.8
total_cost: 17.5518
- dirname: 2025-06-28-00-38-18--o3-pro-high
test_cases: 225
model: o3-pro (high)
edit_format: diff
commit_hash: 5318380
reasoning_effort: high
pass_rate_1: 43.6
pass_rate_2: 84.9
pass_num_1: 98
pass_num_2: 191
percent_cases_well_formed: 97.8
error_outputs: 20
num_malformed_responses: 8
num_with_malformed_responses: 5
user_asks: 100
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2372636
completion_tokens: 1235902
test_timeouts: 1
total_tests: 225
command: aider --model o3-pro
date: 2025-06-28
versions: 0.85.1.dev
seconds_per_case: 449.0
total_cost: 146.3249
- dirname: 2025-07-11-19-37-40--xai-or-grok4-high
test_cases: 225
model: grok-4 (high)
edit_format: diff
commit_hash: f7870b6-dirty
reasoning_effort: high
pass_rate_1: 40.9
pass_rate_2: 79.6
pass_num_1: 92
pass_num_2: 179
percent_cases_well_formed: 97.3
error_outputs: 11
num_malformed_responses: 8
num_with_malformed_responses: 6
user_asks: 133
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2815347
completion_tokens: 3411480
test_timeouts: 0
total_tests: 225
command: aider --model openrouter/x-ai/grok-4
date: 2025-07-11
versions: 0.85.2.dev
seconds_per_case: 403.2
total_cost: 59.6182
- dirname: 2025-07-17-17-41-54--kimi-k2-diff-or-pricing
test_cases: 225
model: Kimi K2
edit_format: diff
commit_hash: 915ebff-dirty
pass_rate_1: 20.4
pass_rate_2: 59.1
pass_num_1: 46
pass_num_2: 133
percent_cases_well_formed: 92.9
error_outputs: 19
num_malformed_responses: 19
num_with_malformed_responses: 16
user_asks: 61
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2355141
completion_tokens: 363846
test_timeouts: 4
total_tests: 225
command: aider --model openrouter/moonshotai/kimi-k2
date: 2025-07-17
versions: 0.85.3.dev
seconds_per_case: 67.6
total_cost: 1.2357

View File

@@ -0,0 +1,272 @@
- dirname: 2025-05-08-03-20-24--qwen3-32b-default
test_cases: 225
model: Qwen3 32B diff on OpenRouter, all providers, default settings (thinking)
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: Qwen3 235B A22B diff on OpenRouter, all providers, default settings (thinking)
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
- dirname: 2025-05-08-17-39-14--qwen3-235b-or-together-only
test_cases: 225
model: Qwen3 235B A22B diff on OpenRouter only TogetherAI, recommended /no_think settings
edit_format: diff
commit_hash: 328584e
pass_rate_1: 28.0
pass_rate_2: 54.7
pass_num_1: 63
pass_num_2: 123
percent_cases_well_formed: 90.7
error_outputs: 39
num_malformed_responses: 32
num_with_malformed_responses: 21
user_asks: 106
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2816606
completion_tokens: 362346
test_timeouts: 2
total_tests: 225
command: aider --model openrouter/qwen/qwen3-235b-a22b
date: 2025-05-08
versions: 0.82.4.dev
seconds_per_case: 77.2
total_cost: 0.6399
- dirname: 2025-04-30-04-49-37--Qwen3-235B-A22B-whole-nothink
test_cases: 225
model: Qwen3-235B-A22B whole with VLLM, bfloat16, recommended /no_think settings
edit_format: whole
commit_hash: 0c383df-dirty
pass_rate_1: 28.0
pass_rate_2: 65.3
pass_num_1: 63
pass_num_2: 147
percent_cases_well_formed: 100.0
error_outputs: 3
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 166
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 3
test_timeouts: 0
total_tests: 225
command: aider --model openai/Qwen3-235B-A22B
date: 2025-04-30
versions: 0.81.4.dev
seconds_per_case: 166.0
total_cost: 0.0000
- dirname: 2025-04-30-04-49-50--Qwen3-235B-A22B-diff-nothink
test_cases: 225
model: Qwen3-235B-A22B diff with VLLM, bfloat16, recommended /no_think settings
edit_format: diff
commit_hash: 0c383df-dirty
pass_rate_1: 29.8
pass_rate_2: 61.3
pass_num_1: 67
pass_num_2: 138
percent_cases_well_formed: 94.7
error_outputs: 25
num_malformed_responses: 25
num_with_malformed_responses: 12
user_asks: 97
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
total_tests: 225
command: aider --model openai/Qwen3-235B-A22B
date: 2025-04-30
versions: 0.81.4.dev
seconds_per_case: 158.2
total_cost: 0.0000
- dirname: 2025-04-30-04-08-41--Qwen3-32B-whole-nothink
test_cases: 225
model: Qwen3-32B whole with VLLM, bfloat16, recommended /no_think settings
edit_format: whole
commit_hash: 0c383df-dirty
pass_rate_1: 20.4
pass_rate_2: 45.8
pass_num_1: 46
pass_num_2: 103
percent_cases_well_formed: 100.0
error_outputs: 3
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 94
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 3
test_timeouts: 5
total_tests: 225
command: aider --model openai/Qwen3-32B
date: 2025-04-30
versions: 0.81.4.dev
seconds_per_case: 48.1
total_cost: 0.0000
- dirname: 2025-04-30-04-08-51--Qwen3-32B-diff-nothink
test_cases: 225
model: Qwen3-32B diff with VLLM, bfloat16, recommended /no_think settings
edit_format: diff
commit_hash: 0c383df-dirty
pass_rate_1: 20.4
pass_rate_2: 41.3
pass_num_1: 46
pass_num_2: 93
percent_cases_well_formed: 94.2
error_outputs: 17
num_malformed_responses: 14
num_with_malformed_responses: 13
user_asks: 83
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 3
test_timeouts: 4
total_tests: 225
command: aider --model openai/Qwen3-32B
date: 2025-04-30
versions: 0.81.4.dev
seconds_per_case: 59.4
total_cost: 0.0000
- dirname: 2025-05-07-03-15-59--Qwen3-235B-A22B-Q5_K_M-whole-nothink
test_cases: 225
model: Qwen3-235B-A22B whole with llama.cpp, Q5_K_M (unsloth), recommended /no_think settings
edit_format: whole
commit_hash: 8159cbf
pass_rate_1: 27.1
pass_rate_2: 59.1
pass_num_1: 61
pass_num_2: 133
percent_cases_well_formed: 100.0
error_outputs: 1
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 169
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
total_tests: 225
command: aider --model openai/Qwen3-235B-A22B-Q5_K_M
date: 2025-05-07
versions: 0.82.4.dev
seconds_per_case: 635.2
total_cost: 0.0000
- dirname: 2025-05-09-17-02-02--qwen3-235b-a22b.unthink_16k_diff
test_cases: 225
model: Qwen3 235B A22B diff, no think, via official Alibaba API
edit_format: diff
commit_hash: 91d7fbd-dirty
pass_rate_1: 28.9
pass_rate_2: 59.6
pass_num_1: 65
pass_num_2: 134
percent_cases_well_formed: 92.9
error_outputs: 22
num_malformed_responses: 22
num_with_malformed_responses: 16
user_asks: 111
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2816192
completion_tokens: 342062
test_timeouts: 1
total_tests: 225
command: aider --model openai/qwen3-235b-a22b
date: 2025-05-09
versions: 0.82.4.dev
seconds_per_case: 45.4
total_cost: 0.0000
- dirname: 2025-05-09-23-01-22--qwen3-235b-a22b.unthink_16k_whole
test_cases: 225
model: Qwen3 235B A22B whole, no think, via official Alibaba API
edit_format: whole
commit_hash: 425fb6d
pass_rate_1: 26.7
pass_rate_2: 61.8
pass_num_1: 60
pass_num_2: 139
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 175
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2768173
completion_tokens: 384000
test_timeouts: 1
total_tests: 225
command: aider --model openai/qwen3-235b-a22b
date: 2025-05-09
versions: 0.82.4.dev
seconds_per_case: 50.8
total_cost: 0.0000

View File

@@ -2,7 +2,7 @@ If you need more help, please check our
[GitHub issues](https://github.com/Aider-AI/aider/issues)
and file a new issue if your problem isn't discussed.
Or drop into our
[Discord](https://discord.gg/Tv2uQnR88V)
[Discord](https://discord.gg/Y7X7bhMQFV)
to chat with us.
When reporting problems, it is very helpful if you can provide:

View File

@@ -1,7 +1,7 @@
document.addEventListener('DOMContentLoaded', function() {
let currentMode = 'view'; // 'view', 'select', 'detail'
let selectedRows = new Set(); // Store indices of selected rows
const MAX_DISPLAY_COST_CAP = 75; // Define the constant here
const MAX_DISPLAY_COST_CAP = 200; // Define the constant here
const allMainRows = document.querySelectorAll('tr[id^="main-row-"]');
const allDetailsRows = document.querySelectorAll('tr[id^="details-"]');
@@ -188,10 +188,15 @@ document.addEventListener('DOMContentLoaded', function() {
// Update the leaderboard title based on mode and selection
if (leaderboardTitle) {
if (currentMode === 'view' && selectedRows.size > 0) {
leaderboardTitle.textContent = filteredTitle;
// Check if a custom title is provided globally
if (typeof LEADERBOARD_CUSTOM_TITLE !== 'undefined' && LEADERBOARD_CUSTOM_TITLE) {
leaderboardTitle.textContent = LEADERBOARD_CUSTOM_TITLE;
} else {
leaderboardTitle.textContent = defaultTitle;
if (currentMode === 'view' && selectedRows.size > 0) {
leaderboardTitle.textContent = filteredTitle;
} else {
leaderboardTitle.textContent = defaultTitle;
}
}
}

View File

@@ -3,5 +3,5 @@
Aider is on
<a href="https://github.com/Aider-AI/aider">GitHub</a>
and
<a href="https://discord.gg/Tv2uQnR88V">Discord</a>.
<a href="https://discord.gg/Y7X7bhMQFV">Discord</a>.
</footer>

View File

@@ -15,12 +15,12 @@ nav_exclude: true
I recently wanted to draw a graph showing how LLM code editing skill has been
changing over time as new models have been released by OpenAI, Anthropic and others.
I have all the
[data in a yaml file](https://github.com/Aider-AI/aider/blob/main/website/_data/edit_leaderboard.yml) that is used to render
[data in a YAML file](https://github.com/Aider-AI/aider/blob/main/website/_data/edit_leaderboard.yml) that is used to render
[aider's LLM leaderboards](https://aider.chat/docs/leaderboards/).
Below is the aider chat transcript, which shows:
- I launch aider with the yaml file, a file with other plots I've done recently (so GPT can crib the style) and an empty file called `over_time.py`.
- I launch aider with the YAML file, a file with other plots I've done recently (so GPT can crib the style) and an empty file called `over_time.py`.
- Then I ask GPT to draw the scatterplot I want.
- I run the resulting script and share the error output with GPT so it can fix a small bug.
- I ask it to color the points for GPT-4 and GPT-3.5 family models differently, to better see trends within those model families.
@@ -28,7 +28,7 @@ Below is the aider chat transcript, which shows:
- I work through a series of other small style changes, like changing fonts and the graph border.
In the end I have the graph, but I also have the python code in my repo.
So I can update this graph easily whenever I add new entries to the yaml data file.
So I can update this graph easily whenever I add new entries to the YAML data file.
## Aider chat transcript

View File

@@ -0,0 +1,114 @@
---
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: false
nav_exclude: true
---
{% if page.date %}
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
{% endif %}
# 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.
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.
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.
## Resolution
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.
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.
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 $37.
## Investigation detail
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.
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.
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:
- 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.
## 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`
- 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](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](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](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).
- 2025-04-12 15:06:39 UTC (Apr 12 08:06:39 2025 -0700)
- 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.
- This fix was released in litellm v1.67.1.
- 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 dependency change shipped on May 5, 2025 in aider v0.82.3.

View File

@@ -0,0 +1,365 @@
---
layout: post
title: Qwen3 benchmark results
excerpt: "Benchmark results for Qwen3 models using the Aider polyglot coding benchmark."
highlight_image: /assets/2025-05-08-qwen3.jpg
date: 2025-05-08
---
# Qwen3 results on the aider polyglot benchmark
As [previously discussed when Qwen2.5 was released](/2024/11/21/quantization.html),
details matter when working with open source models for AI coding.
Proprietary models are served by their creators or trusted providers with stable inference settings.
Open source models are wonderful because anyone can serve them,
but API providers can use very different inference settings, quantizations, etc.
Below are collection of aider polyglot benchmark results for the new Qwen3 models.
Results are presented using both "diff" and "whole"
[edit formats](https://aider.chat/docs/more/edit-formats.html),
with various models settings, against various API providers.
See details on the
[model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings)
used after the results table.
{: .note }
This article is being updated as new results become available.
Also, some results were submitted by aider users and have not been verified.
<h2 id="leaderboard-title">Qwen3 results on the aider polyglot benchmark</h2>
<div id="controls-container" style="display: flex; align-items: center; width: 100%; max-width: 800px; margin: 10px auto; gap: 10px; box-sizing: border-box; padding: 0 5px; position: relative;">
<input type="text" id="editSearchInput" placeholder="Search..." style="flex-grow: 1; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
<div id="view-mode-toggle" style="display: inline-flex; border: 1px solid #ccc; border-radius: 4px;">
<button id="mode-view-btn" class="mode-button active" data-mode="view" style="padding: 8px 8px; border: none; border-radius: 3px 0 0 3px; cursor: pointer; font-size: 14px; line-height: 1.5; min-width: 50px;">View</button>
<button id="mode-select-btn" class="mode-button" data-mode="select" style="padding: 8px 8px; border: none; background-color: #f8f9fa; border-radius: 0; cursor: pointer; border-left: 1px solid #ccc; font-size: 14px; line-height: 1.5; min-width: 50px;">Select</button>
<button id="mode-detail-btn" class="mode-button" data-mode="detail" style="padding: 8px 8px; border: none; background-color: #f8f9fa; border-radius: 0 3px 3px 0; cursor: pointer; border-left: 1px solid #ccc; font-size: 14px; line-height: 1.5; min-width: 50px;">Detail</button>
</div>
<button id="close-controls-btn" style="width: 18px; height: 18px; padding: 0; border: 1px solid #ddd; border-radius: 50%; background-color: transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 12px; margin-left: 4px; color: #999;">×</button>
</div>
<table style="width: 100%; max-width: 800px; margin: auto; border-collapse: collapse; box-shadow: 0 2px 4px rgba(0,0,0,0.1); font-size: 14px;">
<thead style="background-color: #f2f2f2;">
<tr>
<th style="padding: 8px; width: 40px; text-align: center; vertical-align: middle;">
<input type="checkbox" id="select-all-checkbox" style="display: none; cursor: pointer; vertical-align: middle;">
</th> <!-- Header checkbox added here -->
<th style="padding: 8px; text-align: left;">Model</th>
<th style="padding: 8px; text-align: center; width: 25%">Percent correct</th>
<th style="padding: 8px; text-align: center; width: 25%">Cost</th>
<th style="padding: 8px; text-align: left;" class="col-command">Command</th>
<th style="padding: 8px; text-align: center; width: 10%" class="col-conform">Correct edit format</th>
<th style="padding: 8px; text-align: left; width: 10%" class="col-edit-format">Edit Format</th>
</tr>
</thead>
<tbody>
{% assign max_cost = 0 %}
{% for row in site.data.qwen3_leaderboard %}
{% if row.total_cost > max_cost %}
{% assign max_cost = row.total_cost %}
{% endif %}
{% endfor %}
{% if max_cost == 0 %}{% assign max_cost = 1 %}{% endif %}
{% assign edit_sorted = site.data.qwen3_leaderboard | sort: 'pass_rate_2' | reverse %}
{% for row in edit_sorted %} {% comment %} Add loop index for unique IDs {% endcomment %}
{% assign row_index = forloop.index0 %}
<tr id="main-row-{{ row_index }}">
<td style="padding: 8px; text-align: center; vertical-align: middle;">
<button class="toggle-details" data-target="details-{{ row_index }}" style="background: none; border: none; cursor: pointer; font-size: 16px; padding: 0; vertical-align: middle;">▶</button>
<input type="checkbox" class="row-selector" data-row-index="{{ row_index }}" style="display: none; cursor: pointer; vertical-align: middle;">
</td>
<td style="padding: 8px;"><span>{{ row.model }}</span></td>
<td class="bar-cell">
<div class="bar-viz" style="width: {{ row.pass_rate_2 }}%; background-color: rgba(40, 167, 69, 0.3); border-right: 1px solid rgba(40, 167, 69, 0.5);"></div>
<span>{{ row.pass_rate_2 }}%</span>
</td>
<td class="bar-cell cost-bar-cell">
{% if row.total_cost > 0 %}
<div class="bar-viz cost-bar" data-cost="{{ row.total_cost }}" data-max-cost="{{ max_cost }}" style="width: 0%; background-color: rgba(13, 110, 253, 0.3); border-right: 1px solid rgba(13, 110, 253, 0.5);"></div>
{% endif %}
{% assign rounded_cost = row.total_cost | times: 1.0 | round: 2 %}
<span>{% if row.total_cost == 0 or rounded_cost == 0.00 %}{% else %}${{ rounded_cost }}{% endif %}</span>
</td>
<td style="padding: 8px;" class="col-command"><span><code>{{ row.command }}</code></span></td>
<td style="padding: 8px; text-align: center;" class="col-conform"><span>{{ row.percent_cases_well_formed }}%</span></td>
<td style="padding: 8px;" class="col-edit-format"><span>{{ row.edit_format }}</span></td>
</tr>
<tr class="details-row" id="details-{{ row_index }}" style="display: none; background-color: #f9f9f9;">
<td colspan="7" style="padding: 15px; border-bottom: 1px solid #ddd;">
<ul style="margin: 0; padding-left: 20px; list-style: none; border-bottom: 1px solid #ddd;">
{% for pair in row %}
{% if pair[1] != "" and pair[1] != nil %}
<li><strong>
{% if pair[0] == 'percent_cases_well_formed' %}
Percent cases well formed
{% else %}
{{ pair[0] | replace: '_', ' ' | capitalize }}
{% endif %}
:</strong>
{% if pair[0] == 'command' %}<code>{{ pair[1] }}</code>{% else %}{{ pair[1] }}{% endif %}
</li>
{% endif %}
{% endfor %}
</ul>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<style>
#leaderboard-title {
margin-bottom: 20px; /* Add space below the title */
}
tr.selected {
color: #0056b3;
}
table {
table-layout: fixed;
}
thead {
border-top: 1px solid #ddd; /* Add top border to header */
}
td, th {
border: none; /* Remove internal cell borders */
word-wrap: break-word;
overflow-wrap: break-word;
vertical-align: middle; /* Ensure consistent vertical alignment */
}
tbody tr {
height: 50px; /* Set a minimum height for all data rows */
}
td.col-command { /* Command column */
font-size: 12px; /* Keep font size adjustment for command column if desired, or remove */
}
/* Hide new columns first on smaller screens */
@media screen and (max-width: 991px) {
th.col-conform, td.col-conform,
th.col-edit-format, td.col-edit-format {
display: none;
}
/* Increase width of Percent correct and Cost columns when others are hidden */
th:nth-child(3), td:nth-child(3), /* Percent correct */
th:nth-child(4), td:nth-child(4) { /* Cost */
width: 33% !important; /* Override inline style */
}
}
/* Hide command column on even smaller screens */
@media screen and (max-width: 767px) {
th.col-command, td.col-command { /* Command column */
display: none;
}
}
/* --- Control Styles --- */
#controls-container {
margin-bottom: 20px; /* Add some space below controls */
}
#editSearchInput, #view-mode-select {
padding: 8px 12px; /* Consistent padding */
border: 1px solid #ccc; /* Slightly softer border */
border-radius: 4px;
font-size: 14px; /* Match table font size */
height: 38px; /* Match height */
box-sizing: border-box; /* Include padding/border in height */
}
.bar-cell {
position: relative; /* Positioning context for the bar */
padding: 8px;
/* text-align: center; Removed */
overflow: hidden; /* Prevent bar from overflowing cell boundaries if needed */
}
.cost-bar-cell {
background-image: none; /* Remove default gradient for cost cells */
}
.percent-tick, .cost-tick {
position: absolute;
top: 50%;
transform: translateY(10px);
height: 8px; /* Short tick */
width: 1px;
background-color: rgba(170, 170, 170, 0.5);
z-index: 2; /* Above the bar but below the text */
}
.bar-viz {
position: absolute;
left: 0;
top: 50%; /* Position at the middle of the cell */
transform: translateY(-50%); /* Center the bar vertically */
z-index: 1; /* Above background, below ticks and text */
height: 36px;
border-radius: 0 2px 2px 0; /* Slightly rounded end corners */
/* Width and colors are set inline via style attribute */
}
/* Add a tooltip class for showing cost information on hover */
.cost-bar-cell:hover .bar-viz[style*="background-image"] {
animation: stripe-animation 2s linear infinite;
}
@keyframes stripe-animation {
0% { background-position: 0 0; }
100% { background-position: 20px 0; }
}
.bar-cell span {
position: absolute; /* Position relative to the cell */
left: 5px; /* Position slightly inside the left edge */
top: 50%; /* Center vertically */
transform: translateY(-50%); /* Adjust vertical centering */
z-index: 3; /* Ensure text is above everything else */
background-color: rgba(255, 255, 255, 0.7); /* Semi-transparent white background */
padding: 0 4px; /* Add padding around the text */
border-radius: 3px; /* Rounded corners for the text background */
font-size: 14px; /* Adjust font size for the numbers */
}
.toggle-details {
color: #888; /* Make toggle symbol more subtle */
transition: color 0.2s; /* Smooth transition on hover */
}
/* Style for selected rows */
tr.row-selected > td {
background-color: #e7f3ff; /* Example light blue highlight */
}
/* Ensure checkbox is vertically aligned if needed */
.row-selector {
vertical-align: middle;
}
/* Hide rows not matching the filter */
tr.hidden-by-mode {
display: none !important; /* Use important to override other display styles if necessary */
}
tr.hidden-by-search {
display: none !important;
}
/* --- Mode Toggle Button Styles --- */
#view-mode-toggle {
height: 38px; /* Match input height */
box-sizing: border-box;
flex-shrink: 0; /* Prevent toggle from shrinking on small screens */
}
.mode-button {
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
white-space: nowrap; /* Prevent text wrapping */
}
.mode-button:not(.active) {
background-color: #f8f9fa; /* Light grey background */
color: #495057; /* Dark grey text */
}
.mode-button:not(.active):hover {
background-color: #e2e6ea; /* Slightly darker grey on hover */
}
/* Style for highlighted rows in view mode */
tr.view-highlighted > td {
background-color: #fffef5; /* Very light yellow/cream */
/* Border moved to specific cell below */
}
/* Apply border and adjust padding ONLY for the first *visible* cell (Model name) in view mode */
tr.view-highlighted > td:nth-child(2) {
border-left: 4px solid #ffc107; /* Warning yellow border */
/* Original padding is 8px. Subtract border width. */
padding-left: 4px;
}
</style>
<script>
const LEADERBOARD_CUSTOM_TITLE = "Qwen3 results on the aider polyglot benchmark";
{% include leaderboard_table.js %}
</script>
## No think, via official Alibaba API
These results were obtained running against `https://dashscope.aliyuncs.com/compatible-mode/v1`
with no thinking.
```bash
export OPENAI_API_BASE=https://dashscope.aliyuncs.com/compatible-mode/v1
export OPENAI_API_KEY=<key>
```
```yaml
- name: openai/qwen3-235b-a22b
use_temperature: 0.7
streaming: false
extra_params:
stream: false
max_tokens: 16384
top_p: 0.8
top_k: 20
temperature: 0.7
enable_thinking: false
extra_body:
enable_thinking: false
```
## OpenRouter only TogetherAI, recommended /no_think settings
These results were obtained with the
[recommended](https://huggingface.co/Qwen/Qwen3-235B-A22B#best-practices)
non-thinking model settings in `.aider.model.settings.yml`:
```yaml
- name: openrouter/qwen/qwen3-235b-a22b
system_prompt_prefix: "/no_think"
use_temperature: 0.7
extra_params:
max_tokens: 24000
top_p: 0.8
top_k: 20
min_p: 0.0
temperature: 0.7
extra_body:
provider:
order: ["Together"]
```
And then running aider:
```bash
aider --model openrouter/qwen/qwen3-235b-a22b
```
## OpenRouter, all providers, default settings (thinking)
These results were obtained by simply running aider as shown below, without any model specific settings.
This should have enabled thinking, assuming upstream API providers honor that convention for Qwen3.
```bash
aider --model openrouter/qwen/qwen3-xxx
```
## VLLM, bfloat16, recommended /no_think
These [benchmarks results were obtained by GitHub user AlongWY](https://github.com/Aider-AI/aider/pull/3908)
with the
[recommended](https://huggingface.co/Qwen/Qwen3-235B-A22B#best-practices)
non-thinking model settings in `.aider.model.settings.yml`:
```yaml
- name: openai/<model-name>
system_prompt_prefix: "/no_think"
use_temperature: 0.7
extra_params:
max_tokens: 24000
top_p: 0.8
top_k: 20
min_p: 0.0
temperature: 0.7
```
And then running aider:
```bash
aider --model openai/<model-name> --openai-api-base <url>
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
# Place in your home dir, or at the root of your git repo.
##########################################################
# Note: You can only put OpenAI and Anthropic API keys in the yaml
# Note: You can only put OpenAI and Anthropic API keys in the YAML
# config file. Keys for all APIs can be stored in a .env file
# https://aider.chat/docs/config/dotenv.html
@@ -83,7 +83,7 @@
## Set the reasoning_effort API parameter (default: not set)
#reasoning-effort: xxx
## Set the thinking token budget for models that support it (default: not set)
## Set the thinking token budget for models that support it. Use 0 to disable. (default: not set)
#thinking-tokens: xxx
## Verify the SSL cert when connecting to models (default: True)
@@ -212,6 +212,9 @@
## Enable/disable adding .aider* to .gitignore (default: True)
#gitignore: true
## Enable/disable the addition of files listed in .gitignore to Aider's editing scope.
#add-gitignore-files: false
## Specify the aider ignore file (default: .aiderignore in git root)
#aiderignore: .aiderignore
@@ -224,11 +227,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 +239,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: True). If True, this takes precedence over default --attribute-author and --attribute-committer behavior unless they are explicitly set to True.
#attribute-co-authored-by: true
## Enable/disable git pre-commit hooks with --no-verify (default: False)
#git-commit-verify: false
@@ -292,6 +298,12 @@
## Permanently disable analytics
#analytics-disable: false
## Send analytics to custom PostHog instance
#analytics-posthog-host: xxx
## Send analytics to custom PostHog project
#analytics-posthog-project-api-key: xxx
############
# Upgrading:
@@ -358,6 +370,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:
@@ -380,6 +395,9 @@
## Specify the language to use in the chat (default: None, uses system settings)
#chat-language: xxx
## Specify the language to use in the commit message (default: None, user language)
#commit-language: xxx
## Always say yes to every confirmation
#yes-always: false
@@ -422,6 +440,9 @@
## Specify which editor to use for the /editor command
#editor: xxx
## Print shell completion script for the specified SHELL and exit. Supported shells: bash, tcsh, zsh. Example: aider --shell-completions bash
#shell-completions: xxx
############################
# Deprecated model settings:

View File

@@ -72,7 +72,7 @@
## Set the reasoning_effort API parameter (default: not set)
#AIDER_REASONING_EFFORT=
## Set the thinking token budget for models that support it (default: not set)
## Set the thinking token budget for models that support it. Use 0 to disable. (default: not set)
#AIDER_THINKING_TOKENS=
## Verify the SSL cert when connecting to models (default: True)
@@ -201,6 +201,9 @@
## Enable/disable adding .aider* to .gitignore (default: True)
#AIDER_GITIGNORE=true
## Enable/disable the addition of files listed in .gitignore to Aider's editing scope.
#AIDER_ADD_GITIGNORE_FILES=false
## Specify the aider ignore file (default: .aiderignore in git root)
#AIDER_AIDERIGNORE=.aiderignore
@@ -213,11 +216,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 +228,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: True). 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=true
## Enable/disable git pre-commit hooks with --no-verify (default: False)
#AIDER_GIT_COMMIT_VERIFY=false
@@ -276,6 +282,12 @@
## Permanently disable analytics
#AIDER_ANALYTICS_DISABLE=false
## Send analytics to custom PostHog instance
#AIDER_ANALYTICS_POSTHOG_HOST=
## Send analytics to custom PostHog project
#AIDER_ANALYTICS_POSTHOG_PROJECT_API_KEY=
############
# Upgrading:
@@ -339,6 +351,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=
@@ -351,6 +366,9 @@
## Specify the language to use in the chat (default: None, uses system settings)
#AIDER_CHAT_LANGUAGE=
## Specify the language to use in the commit message (default: None, user language)
#AIDER_COMMIT_LANGUAGE=
## Always say yes to every confirmation
#AIDER_YES_ALWAYS=
@@ -390,6 +408,9 @@
## Specify which editor to use for the /editor command
#AIDER_EDITOR=
## Print shell completion script for the specified SHELL and exit. Supported shells: bash, tcsh, zsh. Example: aider --shell-completions bash
#AIDER_SHELL_COMPLETIONS=
############################
# Deprecated model settings:

View File

@@ -81,7 +81,7 @@ You can override or add settings for any model by creating a `.aider.model.setti
If the files above exist, they will be loaded in that order.
Files loaded last will take priority.
The yaml file should be a list of dictionary objects for each model.
The YAML file should be a list of dictionary objects for each model.
### Passing extra params to litellm.completion
@@ -158,6 +158,34 @@ cog.out("```\n")
system_prompt_prefix: null
accepts_settings: null
- name: anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: anthropic/claude-3-5-haiku-20241022
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
@@ -246,6 +274,34 @@ cog.out("```\n")
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
cache_control: true
- name: anthropic/claude-opus-4-20250514
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: anthropic/claude-sonnet-4-20250514
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: anthropic/claude-sonnet-4-20250514
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: anthropic/claude-sonnet-4-20250514
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: azure/gpt-4.1
edit_format: diff
weak_model_name: azure/gpt-4.1-mini
@@ -309,6 +365,18 @@ cog.out("```\n")
accepts_settings:
- reasoning_effort
- name: azure/o3-pro
edit_format: diff
weak_model_name: azure/gpt-4.1-mini
use_repo_map: true
examples_as_sys_msg: true
streaming: false
editor_model_name: azure/gpt-4.1
editor_edit_format: editor-diff
system_prompt_prefix: 'Formatting re-enabled. '
accepts_settings:
- reasoning_effort
- name: azure/o4-mini
edit_format: diff
weak_model_name: azure/gpt-4.1-mini
@@ -407,6 +475,20 @@ cog.out("```\n")
accepts_settings:
- thinking_tokens
- name: bedrock/anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock/anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: bedrock/us.anthropic.claude-3-7-sonnet-20250219-v1:0
edit_format: diff
weak_model_name: bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0
@@ -423,6 +505,20 @@ cog.out("```\n")
accepts_settings:
- thinking_tokens
- name: bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: bedrock_converse/anthropic.claude-3-7-sonnet-20250219-v1:0
edit_format: diff
weak_model_name: bedrock_converse/anthropic.claude-3-5-haiku-20241022-v1:0
@@ -439,6 +535,62 @@ cog.out("```\n")
accepts_settings:
- thinking_tokens
- name: bedrock_converse/anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: bedrock_converse/anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: bedrock_converse/anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock_converse/anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: bedrock_converse/eu.anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/eu.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: bedrock_converse/eu.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: bedrock_converse/eu.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/eu.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock_converse/eu.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: bedrock_converse/us.anthropic.claude-3-7-sonnet-20250219-v1:0
edit_format: diff
weak_model_name: bedrock_converse/us.anthropic.claude-3-5-haiku-20241022-v1:0
@@ -455,6 +607,34 @@ cog.out("```\n")
accepts_settings:
- thinking_tokens
- name: bedrock_converse/us.anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: bedrock_converse/us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: bedrock_converse/us.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: bedrock_converse/us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock_converse/us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: claude-3-5-haiku-20241022
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
@@ -538,6 +718,34 @@ cog.out("```\n")
- name: claude-3-sonnet-20240229
weak_model_name: claude-3-5-haiku-20241022
- name: claude-opus-4-20250514
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: claude-sonnet-4-20250514
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: claude-sonnet-4-20250514
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: claude-sonnet-4-20250514
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: cohere_chat/command-a-03-2025
examples_as_sys_msg: true
@@ -594,12 +802,40 @@ cog.out("```\n")
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
max_tokens: 64000
caches_by_default: true
use_temperature: false
editor_model_name: deepseek/deepseek-chat
editor_edit_format: editor-diff
- name: eu.anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: eu.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: eu.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: eu.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: eu.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: eu.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: fireworks_ai/accounts/fireworks/models/deepseek-r1
edit_format: diff
weak_model_name: fireworks_ai/accounts/fireworks/models/deepseek-v3
@@ -644,12 +880,11 @@ cog.out("```\n")
edit_format: diff
use_repo_map: true
accepts_settings:
- reasoning_effort
- thinking_tokens
- name: gemini/gemini-1.5-flash-002
- name: gemini/gemini-1.5-flash-exp-0827
- name: gemini/gemini-1.5-pro
edit_format: diff-fenced
use_repo_map: true
@@ -658,10 +893,6 @@ cog.out("```\n")
edit_format: diff
use_repo_map: true
- name: gemini/gemini-1.5-pro-exp-0827
edit_format: diff-fenced
use_repo_map: true
- name: gemini/gemini-1.5-pro-latest
edit_format: diff-fenced
use_repo_map: true
@@ -674,10 +905,36 @@ cog.out("```\n")
edit_format: diff
use_repo_map: true
- name: gemini/gemini-2.5-flash
edit_format: diff-fenced
use_repo_map: true
overeager: true
use_temperature: false
accepts_settings:
- thinking_tokens
- name: gemini/gemini-2.5-flash-lite-preview-06-17
edit_format: diff-fenced
use_repo_map: true
overeager: true
use_temperature: false
accepts_settings:
- thinking_tokens
- name: gemini/gemini-2.5-flash-preview-04-17
edit_format: diff
use_repo_map: true
accepts_settings:
- reasoning_effort
- thinking_tokens
- name: gemini/gemini-2.5-pro
edit_format: diff-fenced
weak_model_name: gemini/gemini-2.5-flash
use_repo_map: true
overeager: true
use_temperature: false
accepts_settings:
- thinking_tokens
- name: gemini/gemini-2.5-pro-exp-03-25
@@ -692,13 +949,19 @@ cog.out("```\n")
use_repo_map: true
overeager: true
- name: gemini/gemini-exp-1114
edit_format: diff
- name: gemini/gemini-2.5-pro-preview-05-06
edit_format: diff-fenced
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
use_repo_map: true
overeager: true
- name: gemini/gemini-exp-1121
edit_format: diff
- name: gemini/gemini-2.5-pro-preview-06-05
edit_format: diff-fenced
weak_model_name: gemini/gemini-2.5-flash-preview-04-17
use_repo_map: true
overeager: true
accepts_settings:
- thinking_tokens
- name: gemini/gemini-exp-1206
edit_format: diff
@@ -902,6 +1165,18 @@ cog.out("```\n")
accepts_settings:
- reasoning_effort
- name: o3-pro
edit_format: diff
weak_model_name: gpt-4.1-mini
use_repo_map: true
examples_as_sys_msg: true
streaming: false
editor_model_name: gpt-4.1
editor_edit_format: editor-diff
system_prompt_prefix: 'Formatting re-enabled. '
accepts_settings:
- reasoning_effort
- name: o4-mini
edit_format: diff
weak_model_name: gpt-4.1-mini
@@ -1018,6 +1293,18 @@ cog.out("```\n")
accepts_settings:
- reasoning_effort
- name: openai/o3-pro
edit_format: diff
weak_model_name: openai/gpt-4.1-mini
use_repo_map: true
examples_as_sys_msg: true
streaming: false
editor_model_name: openai/gpt-4.1
editor_edit_format: editor-diff
system_prompt_prefix: 'Formatting re-enabled. '
accepts_settings:
- reasoning_effort
- name: openai/o4-mini
edit_format: diff
weak_model_name: openai/gpt-4.1-mini
@@ -1137,6 +1424,34 @@ cog.out("```\n")
accepts_settings:
- thinking_tokens
- name: openrouter/anthropic/claude-opus-4
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: openrouter/anthropic/claude-sonnet-4
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: openrouter/anthropic/claude-sonnet-4
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: openrouter/anthropic/claude-sonnet-4
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: openrouter/cohere/command-a-03-2025
examples_as_sys_msg: true
@@ -1152,7 +1467,7 @@ cog.out("```\n")
reminder: sys
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
max_tokens: 65536
caches_by_default: true
- name: openrouter/deepseek/deepseek-chat-v3-0324:free
@@ -1216,12 +1531,40 @@ cog.out("```\n")
max_tokens: 8192
caches_by_default: true
- name: openrouter/google/gemini-2.5-pro-exp-03-25:free
- name: openrouter/google/gemini-2.5-pro
edit_format: diff-fenced
weak_model_name: openrouter/google/gemini-2.5-flash
use_repo_map: true
overeager: true
accepts_settings:
- thinking_tokens
- name: openrouter/google/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
weak_model_name: openrouter/google/gemini-2.0-flash-exp:free
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
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/gemini-2.5-pro-preview-06-05
edit_format: diff-fenced
weak_model_name: openrouter/google/gemini-2.0-flash-001
use_repo_map: true
overeager: true
accepts_settings:
- thinking_tokens
- name: openrouter/google/gemma-3-27b-it
use_system_prompt: false
@@ -1233,6 +1576,13 @@ cog.out("```\n")
weak_model_name: openrouter/meta-llama/llama-3-70b-instruct
examples_as_sys_msg: true
- name: openrouter/moonshotai/kimi-k2
edit_format: diff
use_repo_map: true
examples_as_sys_msg: true
extra_params:
temperature: 0.6
- name: openrouter/openai/gpt-4.1
edit_format: diff
weak_model_name: openrouter/openai/gpt-4.1-mini
@@ -1319,6 +1669,18 @@ cog.out("```\n")
accepts_settings:
- reasoning_effort
- name: openrouter/openai/o3-pro
edit_format: diff
weak_model_name: openrouter/openai/gpt-4.1-mini
use_repo_map: true
examples_as_sys_msg: true
streaming: false
editor_model_name: openrouter/openai/gpt-4.1
editor_edit_format: editor-diff
system_prompt_prefix: 'Formatting re-enabled. '
accepts_settings:
- reasoning_effort
- name: openrouter/openai/o4-mini
edit_format: diff
weak_model_name: openrouter/openai/gpt-4.1-mini
@@ -1414,22 +1776,37 @@ cog.out("```\n")
accepts_settings:
- reasoning_effort
- name: vertex_ai-anthropic_models/vertex_ai/claude-3-7-sonnet@20250219
- name: openrouter/x-ai/grok-4
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
overeager: true
examples_as_sys_msg: true
accepts_settings:
- reasoning_effort
- name: us.anthropic.claude-opus-4-20250514-v1:0
edit_format: diff
weak_model_name: us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai-anthropic_models/vertex_ai/claude-3-7-sonnet@20250219
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 32000
cache_control: true
editor_model_name: us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
- name: us.anthropic.claude-sonnet-4-20250514-v1:0
edit_format: diff
weak_model_name: us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: us.anthropic.claude-sonnet-4-20250514-v1:0
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
@@ -1473,6 +1850,19 @@ cog.out("```\n")
accepts_settings:
- thinking_tokens
- name: vertex_ai/claude-3-7-sonnet@20250219
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
overeager: true
examples_as_sys_msg: true
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai/claude-3-7-sonnet@20250219
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: vertex_ai/claude-3-opus@20240229
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
@@ -1481,23 +1871,109 @@ cog.out("```\n")
- name: vertex_ai/claude-3-sonnet@20240229
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
- name: vertex_ai/gemini-2.5-pro-exp-03-25
- name: vertex_ai/claude-opus-4@20250514
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
extra_params:
max_tokens: 32000
editor_model_name: vertex_ai/claude-sonnet-4@20250514
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: vertex_ai/claude-opus-4@20250514
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
extra_params:
max_tokens: 32000
editor_model_name: vertex_ai/claude-sonnet-4@20250514
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: vertex_ai/claude-sonnet-4@20250514
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai/claude-sonnet-4@20250514
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: vertex_ai/claude-sonnet-4@20250514
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai/claude-sonnet-4@20250514
editor_edit_format: editor-diff
accepts_settings:
- thinking_tokens
- name: vertex_ai/gemini-2.5-flash
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
accepts_settings:
- thinking_tokens
- name: vertex_ai/gemini-2.5-flash-preview-04-17
edit_format: diff
use_repo_map: true
accepts_settings:
- reasoning_effort
- thinking_tokens
- name: vertex_ai/gemini-2.5-flash-preview-05-20
edit_format: diff
use_repo_map: true
accepts_settings:
- reasoning_effort
- thinking_tokens
- name: vertex_ai/gemini-2.5-pro
edit_format: diff-fenced
weak_model_name: vertex_ai/gemini-2.5-flash
use_repo_map: true
overeager: true
editor_model_name: vertex_ai/gemini-2.5-flash
accepts_settings:
- thinking_tokens
- name: vertex_ai/gemini-2.5-pro-exp-03-25
edit_format: diff-fenced
weak_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
use_repo_map: true
overeager: true
editor_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
- name: vertex_ai/gemini-2.5-pro-preview-03-25
edit_format: diff-fenced
weak_model_name: vertex_ai-language-models/gemini-2.5-flash-preview-04-17
weak_model_name: vertex_ai/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
editor_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
- name: vertex_ai/gemini-pro-experimental
- name: vertex_ai/gemini-2.5-pro-preview-05-06
edit_format: diff-fenced
weak_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
use_repo_map: true
overeager: true
editor_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
- name: vertex_ai/gemini-2.5-pro-preview-06-05
edit_format: diff-fenced
weak_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
use_repo_map: true
overeager: true
editor_model_name: vertex_ai/gemini-2.5-flash-preview-04-17
accepts_settings:
- thinking_tokens
- name: xai/grok-3-beta
edit_format: diff
@@ -1516,6 +1992,12 @@ cog.out("```\n")
use_repo_map: true
accepts_settings:
- reasoning_effort
- name: xai/grok-4
edit_format: diff
use_repo_map: true
accepts_settings:
- reasoning_effort
```
<!--[[[end]]]-->

View File

@@ -1,7 +1,7 @@
---
parent: Configuration
nav_order: 15
description: How to configure aider with a yaml config file.
description: How to configure aider with a YAML config file.
---
# YAML config file
@@ -58,7 +58,7 @@ cog.outl("```")
# Place in your home dir, or at the root of your git repo.
##########################################################
# Note: You can only put OpenAI and Anthropic API keys in the yaml
# Note: You can only put OpenAI and Anthropic API keys in the YAML
# config file. Keys for all APIs can be stored in a .env file
# https://aider.chat/docs/config/dotenv.html
@@ -137,7 +137,7 @@ cog.outl("```")
## Set the reasoning_effort API parameter (default: not set)
#reasoning-effort: xxx
## Set the thinking token budget for models that support it (default: not set)
## Set the thinking token budget for models that support it. Use 0 to disable. (default: not set)
#thinking-tokens: xxx
## Verify the SSL cert when connecting to models (default: True)
@@ -266,6 +266,9 @@ cog.outl("```")
## Enable/disable adding .aider* to .gitignore (default: True)
#gitignore: true
## Enable/disable the addition of files listed in .gitignore to Aider's editing scope.
#add-gitignore-files: false
## Specify the aider ignore file (default: .aiderignore in git root)
#aiderignore: .aiderignore
@@ -278,11 +281,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 +293,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: True). If True, this takes precedence over default --attribute-author and --attribute-committer behavior unless they are explicitly set to True.
#attribute-co-authored-by: true
## Enable/disable git pre-commit hooks with --no-verify (default: False)
#git-commit-verify: false
@@ -346,6 +352,12 @@ cog.outl("```")
## Permanently disable analytics
#analytics-disable: false
## Send analytics to custom PostHog instance
#analytics-posthog-host: xxx
## Send analytics to custom PostHog project
#analytics-posthog-project-api-key: xxx
############
# Upgrading:
@@ -412,6 +424,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:
@@ -434,6 +449,9 @@ cog.outl("```")
## Specify the language to use in the chat (default: None, uses system settings)
#chat-language: xxx
## Specify the language to use in the commit message (default: None, user language)
#commit-language: xxx
## Always say yes to every confirmation
#yes-always: false
@@ -476,6 +494,9 @@ cog.outl("```")
## Specify which editor to use for the /editor command
#editor: xxx
## Print shell completion script for the specified SHELL and exit. Supported shells: bash, tcsh, zsh. Example: aider --shell-completions bash
#shell-completions: xxx
############################
# Deprecated model settings:

View File

@@ -40,9 +40,9 @@ OPENAI_API_KEY=<key>
ANTHROPIC_API_KEY=<key>
```
#### Yaml config file
#### YAML config file
You can also set those API keys via special entries in the
[yaml config file](/docs/config/aider_conf.html), like this:
[YAML config file](/docs/config/aider_conf.html), like this:
```yaml
openai-api-key: <key>
@@ -74,7 +74,7 @@ OPENROUTER_API_KEY=bar
DEEPSEEK_API_KEY=baz
```
#### Yaml config file
#### YAML config file
You can also set API keys in the

View File

@@ -112,7 +112,7 @@ cog.outl("```")
## Set the reasoning_effort API parameter (default: not set)
#AIDER_REASONING_EFFORT=
## Set the thinking token budget for models that support it (default: not set)
## Set the thinking token budget for models that support it. Use 0 to disable. (default: not set)
#AIDER_THINKING_TOKENS=
## Verify the SSL cert when connecting to models (default: True)
@@ -241,6 +241,9 @@ cog.outl("```")
## Enable/disable adding .aider* to .gitignore (default: True)
#AIDER_GITIGNORE=true
## Enable/disable the addition of files listed in .gitignore to Aider's editing scope.
#AIDER_ADD_GITIGNORE_FILES=false
## Specify the aider ignore file (default: .aiderignore in git root)
#AIDER_AIDERIGNORE=.aiderignore
@@ -253,11 +256,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 +268,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: True). 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=true
## Enable/disable git pre-commit hooks with --no-verify (default: False)
#AIDER_GIT_COMMIT_VERIFY=false
@@ -316,6 +322,12 @@ cog.outl("```")
## Permanently disable analytics
#AIDER_ANALYTICS_DISABLE=false
## Send analytics to custom PostHog instance
#AIDER_ANALYTICS_POSTHOG_HOST=
## Send analytics to custom PostHog project
#AIDER_ANALYTICS_POSTHOG_PROJECT_API_KEY=
############
# Upgrading:
@@ -379,6 +391,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=
@@ -391,6 +406,9 @@ cog.outl("```")
## Specify the language to use in the chat (default: None, uses system settings)
#AIDER_CHAT_LANGUAGE=
## Specify the language to use in the commit message (default: None, user language)
#AIDER_COMMIT_LANGUAGE=
## Always say yes to every confirmation
#AIDER_YES_ALWAYS=
@@ -430,6 +448,9 @@ cog.outl("```")
## Specify which editor to use for the /editor command
#AIDER_EDITOR=
## Print shell completion script for the specified SHELL and exit. Supported shells: bash, tcsh, zsh. Example: aider --shell-completions bash
#AIDER_SHELL_COMPLETIONS=
############################
# Deprecated model settings:

View File

@@ -12,7 +12,7 @@ Aider allows you to configure your preferred text editor for use with the `/edit
You can specify the text editor with the `--editor` switch or using
`editor:` in aider's
[yaml config file](https://aider.chat/docs/config/aider_conf.html).
[YAML config file](https://aider.chat/docs/config/aider_conf.html).
## Environment variables

View File

@@ -79,17 +79,17 @@ for alias, model in sorted(MODEL_ALIASES.items()):
- `4-turbo`: gpt-4-1106-preview
- `4o`: gpt-4o
- `deepseek`: deepseek/deepseek-chat
- `flash`: gemini/gemini-2.5-flash-preview-04-17
- `gemini`: gemini/gemini-2.5-pro-preview-03-25
- `gemini-2.5-pro`: gemini/gemini-2.5-pro-exp-03-25
- `flash`: gemini/gemini-2.5-flash
- `gemini`: gemini/gemini-2.5-pro
- `gemini-2.5-pro`: gemini/gemini-2.5-pro
- `gemini-exp`: gemini/gemini-2.5-pro-exp-03-25
- `grok3`: xai/grok-3-beta
- `haiku`: claude-3-5-haiku-20241022
- `optimus`: openrouter/openrouter/optimus-alpha
- `opus`: claude-3-opus-20240229
- `opus`: claude-opus-4-20250514
- `quasar`: openrouter/openrouter/quasar-alpha
- `r1`: deepseek/deepseek-reasoner
- `sonnet`: anthropic/claude-3-7-sonnet-20250219
- `sonnet`: anthropic/claude-sonnet-4-20250514
<!--[[[end]]]-->
## Priority

View File

@@ -49,13 +49,16 @@ usage: aider [-h] [--model] [--openai-api-key] [--anthropic-api-key]
[--completion-menu-current-color]
[--completion-menu-current-bg-color] [--code-theme]
[--show-diffs] [--git | --no-git]
[--gitignore | --no-gitignore] [--aiderignore]
[--subtree-only] [--auto-commits | --no-auto-commits]
[--gitignore | --no-gitignore]
[--add-gitignore-files | --no-add-gitignore-files]
[--aiderignore] [--subtree-only]
[--auto-commits | --no-auto-commits]
[--dirty-commits | --no-dirty-commits]
[--attribute-author | --no-attribute-author]
[--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]
@@ -63,7 +66,9 @@ usage: aider [-h] [--model] [--openai-api-key] [--anthropic-api-key]
[--lint-cmd] [--auto-lint | --no-auto-lint]
[--test-cmd] [--auto-test | --no-auto-test] [--test]
[--analytics | --no-analytics] [--analytics-log]
[--analytics-disable] [--just-check-update]
[--analytics-disable] [--analytics-posthog-host]
[--analytics-posthog-project-api-key]
[--just-check-update]
[--check-update | --no-check-update]
[--show-release-notes | --no-show-release-notes]
[--install-main-branch] [--upgrade] [--version]
@@ -72,17 +77,19 @@ 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] [--commit-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]
[--notifications | --no-notifications]
[--notifications-command]
[--detect-urls | --no-detect-urls] [--editor] [--opus]
[--sonnet] [--haiku] [--4] [--4o] [--mini] [--4-turbo]
[--35turbo] [--deepseek] [--o1-mini] [--o1-preview]
[--detect-urls | --no-detect-urls] [--editor]
[--shell-completions] [--opus] [--sonnet] [--haiku]
[--4] [--4o] [--mini] [--4-turbo] [--35turbo]
[--deepseek] [--o1-mini] [--o1-preview]
```
@@ -168,7 +175,7 @@ Set the reasoning_effort API parameter (default: not set)
Environment variable: `AIDER_REASONING_EFFORT`
### `--thinking-tokens VALUE`
Set the thinking token budget for models that support it (default: not set)
Set the thinking token budget for models that support it. Use 0 to disable. (default: not set)
Environment variable: `AIDER_THINKING_TOKENS`
### `--verify-ssl`
@@ -385,6 +392,14 @@ Aliases:
- `--gitignore`
- `--no-gitignore`
### `--add-gitignore-files`
Enable/disable the addition of files listed in .gitignore to Aider's editing scope.
Default: False
Environment variable: `AIDER_ADD_GITIGNORE_FILES`
Aliases:
- `--add-gitignore-files`
- `--no-add-gitignore-files`
### `--aiderignore AIDERIGNORE`
Specify the aider ignore file (default: .aiderignore in git root)
Default: .aiderignore
@@ -412,16 +427,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 +456,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: True). If True, this takes precedence over default --attribute-author and --attribute-committer behavior unless they are explicitly set to True.
Default: True
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
@@ -537,6 +558,14 @@ Permanently disable analytics
Default: False
Environment variable: `AIDER_ANALYTICS_DISABLE`
### `--analytics-posthog-host ANALYTICS_POSTHOG_HOST`
Send analytics to custom PostHog instance
Environment variable: `AIDER_ANALYTICS_POSTHOG_HOST`
### `--analytics-posthog-project-api-key ANALYTICS_POSTHOG_PROJECT_API_KEY`
Send analytics to custom PostHog project
Environment variable: `AIDER_ANALYTICS_POSTHOG_PROJECT_API_KEY`
## Upgrading:
### `--just-check-update`
@@ -652,6 +681,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`
@@ -669,6 +703,10 @@ Environment variable: `AIDER_VIM`
Specify the language to use in the chat (default: None, uses system settings)
Environment variable: `AIDER_CHAT_LANGUAGE`
### `--commit-language COMMIT_LANGUAGE`
Specify the language to use in the commit message (default: None, user language)
Environment variable: `AIDER_COMMIT_LANGUAGE`
### `--yes-always`
Always say yes to every confirmation
Environment variable: `AIDER_YES_ALWAYS`
@@ -754,6 +792,10 @@ Aliases:
Specify which editor to use for the /editor command
Environment variable: `AIDER_EDITOR`
### `--shell-completions SHELL`
Print shell completion script for the specified SHELL and exit. Supported shells: bash, tcsh, zsh. Example: aider --shell-completions bash
Environment variable: `AIDER_SHELL_COMPLETIONS`
## Deprecated model settings:
### `--opus`

View File

@@ -25,7 +25,7 @@ aider --model r1
```
Inside the aider chat, you can use `/thinking-tokens 4k` or `/reasoning-effort low` to change
the amount of reasoning.
the amount of reasoning. Use `/thinking-tokens 0` to disable thinking tokens.
The rest of this document describes more advanced details which are mainly needed
if you're configuring aider to work with a lesser known reasoning model or one served
@@ -47,6 +47,7 @@ You can use the `--thinking-tokens` switch to request
the model use a certain number of thinking tokens.
This switch is useful for Sonnet 3.7.
You can specify the token budget like "1024", "1k", "8k" or "0.01M".
Use "0" to disable thinking tokens.
### Model compatibility and settings

View File

@@ -264,15 +264,15 @@ tr:hover { background-color: #f5f5f5; }
</style>
<table>
<tr><th>Model Name</th><th class='right'>Total Tokens</th><th class='right'>Percent</th></tr>
<tr><td>gemini/gemini-2.5-pro-exp-03-25</td><td class='right'>1,826,168</td><td class='right'>83.3%</td></tr>
<tr><td>o3</td><td class='right'>239,619</td><td class='right'>10.9%</td></tr>
<tr><td>openrouter/anthropic/claude-3.7-sonnet</td><td class='right'>56,318</td><td class='right'>2.6%</td></tr>
<tr><td>gemini/gemini-2.5-flash-preview-04-17</td><td class='right'>18,645</td><td class='right'>0.9%</td></tr>
<tr><td>gemini/gemini-2.5-pro-preview-03-25</td><td class='right'>16,524</td><td class='right'>0.8%</td></tr>
<tr><td>o4-mini</td><td class='right'>16,499</td><td class='right'>0.8%</td></tr>
<tr><td>xai/grok-3-fast-beta</td><td class='right'>10,288</td><td class='right'>0.5%</td></tr>
<tr><td>None</td><td class='right'>8,001</td><td class='right'>0.4%</td></tr>
<tr><td>gemini/REDACTED</td><td class='right'>606</td><td class='right'>0.0%</td></tr>
<tr><td>gemini/gemini-2.5-pro</td><td class='right'>382,599</td><td class='right'>50.5%</td></tr>
<tr><td>anthropic/claude-sonnet-4-20250514</td><td class='right'>293,741</td><td class='right'>38.8%</td></tr>
<tr><td>openrouter/moonshotai/kimi-k2</td><td class='right'>32,483</td><td class='right'>4.3%</td></tr>
<tr><td>o3</td><td class='right'>22,003</td><td class='right'>2.9%</td></tr>
<tr><td>o3-pro</td><td class='right'>12,707</td><td class='right'>1.7%</td></tr>
<tr><td>xai/grok-4</td><td class='right'>9,573</td><td class='right'>1.3%</td></tr>
<tr><td>openrouter/REDACTED</td><td class='right'>2,342</td><td class='right'>0.3%</td></tr>
<tr><td>openai/REDACTED</td><td class='right'>1,970</td><td class='right'>0.3%</td></tr>
<tr><td>claude-opus-4-20250514</td><td class='right'>502</td><td class='right'>0.1%</td></tr>
</table>
{: .note :}
@@ -376,6 +376,10 @@ Aider is
under an
[Apache 2.0 license](https://github.com/Aider-AI/aider/blob/main/LICENSE.txt).
## Can I Script Aider?
Yes. You can script aider via the command line or python. See more from here: [Scripting aider](https://aider.chat/docs/scripting.html)
<div style="height:80vh"></div>

View File

@@ -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.

View File

@@ -28,12 +28,6 @@ These one-liners will install aider, along with python 3.12 if needed.
They are based on the
[uv installers](https://docs.astral.sh/uv/getting-started/installation/).
#### Windows
```powershell
powershell -ExecutionPolicy ByPass -c "irm https://aider.chat/install.ps1 | iex"
```
#### Mac & Linux
Use curl to download the script and execute it with sh:
@@ -48,6 +42,12 @@ If your system doesn't have curl, you can use wget:
wget -qO- https://aider.chat/install.sh | sh
```
#### Windows
```powershell
powershell -ExecutionPolicy ByPass -c "irm https://aider.chat/install.ps1 | iex"
```
## Install with uv
@@ -55,7 +55,7 @@ You can install aider with uv:
```bash
python -m pip install uv # If you need to install uv
uv tool install --force --python python3.12 aider-chat@latest
uv tool install --force --python python3.12 --with pip aider-chat@latest
```
This will install uv using your existing python version 3.8-3.13,

View File

@@ -77,10 +77,10 @@ cog.out(get_supported_languages_md())
| capnp | .capnp | | ✓ |
| chatito | .chatito | ✓ | ✓ |
| clarity | .clar | | ✓ |
| clojure | .clj | | ✓ |
| clojure | .cljc | | ✓ |
| clojure | .cljs | | ✓ |
| clojure | .edn | | ✓ |
| clojure | .clj | | ✓ |
| clojure | .cljc | | ✓ |
| clojure | .cljs | | ✓ |
| clojure | .edn | | ✓ |
| cmake | .cmake | | ✓ |
| cmake | CMakeLists.txt | | ✓ |
| commonlisp | .cl | ✓ | ✓ |
@@ -172,14 +172,16 @@ cog.out(get_supported_languages_md())
| make | Makefile | | ✓ |
| markdown | .markdown | | ✓ |
| markdown | .md | | ✓ |
| matlab | .m | | ✓ |
| matlab | .mat | | ✓ |
| matlab | .m | | ✓ |
| matlab | .mat | | ✓ |
| mermaid | .mermaid | | ✓ |
| meson | meson.build | | ✓ |
| ninja | .ninja | | ✓ |
| nix | .nix | | ✓ |
| nqc | .nqc | | ✓ |
| objc | .mm | | ✓ |
| ocaml | .ml | ✓ | ✓ |
| ocaml_interface | .mli | ✓ | ✓ |
| odin | .odin | | ✓ |
| org | .org | | ✓ |
| pascal | .pas | | ✓ |

View File

@@ -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.
August 07, 2025.
<!--[[[end]]]-->
</p>

View File

@@ -9,8 +9,7 @@ nav_order: 800
All pricing information is the cost to run the benchmark at the time it was
run.
Providers change their pricing, and every benchmark run ends up with a slightly
different cost.
Providers change their pricing and sometimes introduce entirely novel pricing structures.
Pricing is provided on a *best efforts* basis, and may not always be current
or fully accurate.

View File

@@ -0,0 +1,111 @@
---
parent: Connecting to LLMs
nav_order: 510
---
# GitHub Copilot
Aider can connect to GitHub Copilots LLMs because Copilot exposes a standard **OpenAI-style**
endpoint at:
```
https://api.githubcopilot.com
```
First, install aider:
{% include install.md %}
---
## Configure your environment
```bash
# macOS/Linux
export OPENAI_API_BASE=https://api.githubcopilot.com
export OPENAI_API_KEY=<oauth_token>
# Windows (PowerShell)
setx OPENAI_API_BASE https://api.githubcopilot.com
setx OPENAI_API_KEY <oauth_token>
# …restart the shell after setx commands
```
---
### Where do I get the token?
The easiest path is to sign in to Copilot from any JetBrains IDE (PyCharm, GoLand, etc).
After you authenticate a file appears:
```
~/.config/github-copilot/apps.json
```
On Windows the config can be found in:
```
~\AppData\Local\github-copilot\apps.json
```
Copy the `oauth_token` value that string is your `OPENAI_API_KEY`.
*Note:* tokens created by the Neovim **copilot.lua** plugin (old `hosts.json`) sometimes lack the
needed scopes. If you see “access to this endpoint is forbidden”, regenerate the token with a
JetBrains IDE.
---
## Discover available models
Copilot hosts many models (OpenAI, Anthropic, Google, etc).
List the models your subscription allows with:
```bash
curl -s https://api.githubcopilot.com/models \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-H "Copilot-Integration-Id: vscode-chat" | jq -r '.data[].id'
```
Each returned ID can be used with aider by **prefixing it with `openai/`**:
```bash
aider --model openai/gpt-4o
# or
aider --model openai/claude-3.7-sonnet-thought
```
---
## Quick start
```bash
# change into your project
cd /to/your/project
# talk to Copilot
aider --model openai/gpt-4o
```
---
## Optional config file (`~/.aider.conf.yml`)
```yaml
openai-api-base: https://api.githubcopilot.com
openai-api-key: "<oauth_token>"
model: openai/gpt-4o
weak-model: openai/gpt-4o-mini
show-model-warnings: false
```
---
## FAQ
* Calls made through aider are billed through your Copilot subscription
(aider will still print *estimated* costs).
* The Copilot docs explicitly allow third-party “agents” that hit this API aider is playing by
the rules.
* Aider talks directly to the REST endpoint—no web-UI scraping or browser automation.

View File

@@ -72,15 +72,19 @@ cog.out(''.join(lines))
- DATABRICKS_API_KEY
- DEEPINFRA_API_KEY
- DEEPSEEK_API_KEY
- FEATHERLESS_AI_API_KEY
- FIREWORKS_AI_API_KEY
- FIREWORKS_API_KEY
- FIREWORKSAI_API_KEY
- GEMINI_API_KEY
- GROQ_API_KEY
- HUGGINGFACE_API_KEY
- INFINITY_API_KEY
- MARITALK_API_KEY
- MISTRAL_API_KEY
- NEBIUS_API_KEY
- NLP_CLOUD_API_KEY
- NOVITA_API_KEY
- NVIDIA_NIM_API_KEY
- OLLAMA_API_KEY
- OPENAI_API_KEY

View File

@@ -40,7 +40,7 @@ cd /to/your/project
aider --model vertex_ai/claude-3-5-sonnet@20240620
```
Or you can use the [yaml config](/docs/config/aider_conf.html) to set the model to any of the
Or you can use the [YAML config](/docs/config/aider_conf.html) to set the model to any of the
models supported by Vertex AI.
Example `.aider.conf.yml` file:

View File

@@ -52,10 +52,9 @@ will confirm you wish to opt-in to analytics.
- `--no-analytics` will turn off analytics for the current session.
- By default, if you don't provide `--analytics` or `--no-analytics`,
aider will enable analytics for a random subset of users.
Such randomly selected users will be asked if they wish to opt-in to analytics.
This will never happen if you have permanently disabled analytics
with `--analytics-disable`.
Randomly selected users will be asked if they wish to opt-in to analytics.
## Opting in
@@ -106,6 +105,12 @@ If you want to just log analytics without reporting them, you can do:
aider --analytics-log filename.jsonl --no-analytics
```
### Sending analytics to custom PostHog project or installation
Aider uses PostHog for analytics collection. You can configure aider to send analytics to your own PostHog project or a custom PostHog installation using these parameters:
- `--analytics-posthog-project-api-key KEY` - Set a custom PostHog project API key
- `--analytics-posthog-host HOST` - Set a custom PostHog host (default is app.posthog.com)
## Reporting issues

View File

@@ -58,6 +58,12 @@ cog.out(model_list)
- anthropic.claude-3-5-haiku-20241022-v1:0
- anthropic.claude-3-5-sonnet-20241022-v2:0
- anthropic.claude-3-7-sonnet-20250219-v1:0
- anthropic.claude-opus-4-1-20250805-v1:0
- anthropic.claude-opus-4-20250514-v1:0
- anthropic.claude-sonnet-4-20250514-v1:0
- apac.anthropic.claude-3-5-sonnet-20241022-v2:0
- apac.anthropic.claude-sonnet-4-20250514-v1:0
- azure_ai/mistral-medium-2505
- claude-3-5-haiku-20241022
- claude-3-5-haiku-latest
- claude-3-5-sonnet-20240620
@@ -68,24 +74,42 @@ cog.out(model_list)
- claude-3-haiku-20240307
- claude-3-opus-20240229
- claude-3-opus-latest
- claude-3-sonnet-20240229
- claude-4-opus-20250514
- claude-4-sonnet-20250514
- claude-opus-4-1-20250805
- claude-opus-4-20250514
- claude-sonnet-4-20250514
- codestral/codestral-2405
- codestral/codestral-latest
- databricks/databricks-claude-3-7-sonnet
- deepseek/deepseek-chat
- deepseek/deepseek-coder
- deepseek/deepseek-r1
- deepseek/deepseek-reasoner
- deepseek/deepseek-v3
- eu.anthropic.claude-3-5-haiku-20241022-v1:0
- eu.anthropic.claude-3-5-sonnet-20241022-v2:0
- eu.anthropic.claude-3-7-sonnet-20250219-v1:0
- eu.anthropic.claude-opus-4-1-20250805-v1:0
- eu.anthropic.claude-opus-4-20250514-v1:0
- eu.anthropic.claude-sonnet-4-20250514-v1:0
- mistral/codestral-2405
- mistral/codestral-latest
- mistral/codestral-mamba-latest
- mistral/devstral-medium-2507
- mistral/devstral-small-2505
- mistral/devstral-small-2507
- mistral/magistral-medium-2506
- mistral/magistral-medium-latest
- mistral/magistral-small-2506
- mistral/magistral-small-latest
- mistral/mistral-large-2402
- mistral/mistral-large-2407
- mistral/mistral-large-2411
- mistral/mistral-large-latest
- mistral/mistral-medium
- mistral/mistral-medium-2312
- mistral/mistral-medium-2505
- mistral/mistral-medium-latest
- mistral/mistral-small
- mistral/mistral-small-latest
@@ -101,10 +125,15 @@ cog.out(model_list)
- mistral/pixtral-large-latest
- openrouter/anthropic/claude-3.5-sonnet
- openrouter/anthropic/claude-3.7-sonnet
- openrouter/anthropic/claude-sonnet-4
- openrouter/deepseek/deepseek-r1
- openrouter/deepseek/deepseek-r1-0528
- us.anthropic.claude-3-5-haiku-20241022-v1:0
- us.anthropic.claude-3-5-sonnet-20241022-v2:0
- us.anthropic.claude-3-7-sonnet-20250219-v1:0
- us.anthropic.claude-opus-4-1-20250805-v1:0
- us.anthropic.claude-opus-4-20250514-v1:0
- us.anthropic.claude-sonnet-4-20250514-v1:0
- vertex_ai/claude-3-5-haiku
- vertex_ai/claude-3-5-haiku@20241022
- vertex_ai/claude-3-5-sonnet
@@ -118,6 +147,12 @@ cog.out(model_list)
- vertex_ai/claude-3-opus@20240229
- vertex_ai/claude-3-sonnet
- vertex_ai/claude-3-sonnet@20240229
- vertex_ai/claude-opus-4
- vertex_ai/claude-opus-4-1
- vertex_ai/claude-opus-4-1@20250805
- vertex_ai/claude-opus-4@20250514
- vertex_ai/claude-sonnet-4
- vertex_ai/claude-sonnet-4@20250514
<!--[[[end]]]-->

View File

@@ -88,7 +88,7 @@ for all the supported arguments.
It can also be helpful to set the equivalent of `--yes` by doing this:
```
```python
from aider.io import InputOutput
io = InputOutput(yes=True)
# ...

View File

@@ -57,7 +57,7 @@ cog.out(get_help_md())
| **/save** | Save commands to a file that can reconstruct the current chat session's files |
| **/settings** | Print out the current settings |
| **/test** | Run a shell command and add the output to the chat on non-zero exit code |
| **/think-tokens** | Set the thinking token budget (supports formats like 8096, 8k, 10.5k, 0.5M) |
| **/think-tokens** | Set the thinking token budget, eg: 8096, 8k, 10.5k, 0.5M, or 0 to disable. |
| **/tokens** | Report on the number of tokens used by the current chat context |
| **/undo** | Undo the last git commit if it was done by aider |
| **/voice** | Record and transcribe voice input |

View File

@@ -27,7 +27,7 @@ layout: none
<a href="#features">Features</a>
<a href="#getting-started">Getting Started</a>
<a href="/docs/">Documentation</a>
<a href="https://discord.gg/Tv2uQnR88V">Discord</a>
<a href="https://discord.gg/Y7X7bhMQFV">Discord</a>
<a href="https://github.com/Aider-AI/aider">GitHub</a>
</div>
</nav>
@@ -69,11 +69,11 @@ cog.out(text)
]]]-->
<a href="https://github.com/Aider-AI/aider" class="github-badge badge-stars" title="Total number of GitHub stars the Aider project has received">
<span class="badge-label">⭐ GitHub Stars</span>
<span class="badge-value">32K</span>
<span class="badge-value">36K</span>
</a>
<a href="https://pypi.org/project/aider-chat/" class="github-badge badge-installs" title="Total number of installations via pip from PyPI">
<span class="badge-label">📦 Installs</span>
<span class="badge-value">2.1M</span>
<span class="badge-value">3.0M</span>
</a>
<div class="github-badge badge-tokens" title="Number of tokens processed weekly by Aider users">
<span class="badge-label">📈 Tokens/week</span>
@@ -85,7 +85,7 @@ cog.out(text)
</a>
<a href="/HISTORY.html" class="github-badge badge-coded" title="Percentage of the new code in Aider's last release written by Aider itself">
<span class="badge-label">🔄 Singularity</span>
<span class="badge-value">92%</span>
<span class="badge-value">21%</span>
</a>
<!--[[[end]]]-->
</div>
@@ -269,173 +269,183 @@ cog.out(text)
<script>
const testimonials = [
{
text: "My life has changed... There's finally an AI coding tool that's good enough to keep up with me... Aider... It's going to rock your world.",
author: "Eric S. Raymond",
text: "My life has changed... Aider... It's going to rock your world.",
author: "Eric S. Raymond on X",
link: "https://x.com/esrtweet/status/1910809356381413593"
},
{
text: "The best free open source AI coding assistant.",
author: "IndyDevDan",
author: "IndyDevDan on YouTube",
link: "https://youtu.be/YALpX8oOn78"
},
{
text: "The best AI coding assistant so far.",
author: "Matthew Berman",
author: "Matthew Berman on YouTube",
link: "https://www.youtube.com/watch?v=df8afeb1FY8"
},
{
text: "Aider ... has easily quadrupled my coding productivity.",
author: "SOLAR_FIELDS",
author: "SOLAR_FIELDS on Hacker News",
link: "https://news.ycombinator.com/item?id=36212100"
},
{
text: "It's a cool workflow... Aider's ergonomics are perfect for me.",
author: "qup",
author: "qup on Hacker News",
link: "https://news.ycombinator.com/item?id=38185326"
},
{
text: "It's really like having your senior developer live right in your Git repo - truly amazing!",
author: "rappster",
author: "rappster on GitHub",
link: "https://github.com/Aider-AI/aider/issues/124"
},
{
text: "What an amazing tool. It's incredible.",
author: "valyagolev",
author: "valyagolev on GitHub",
link: "https://github.com/Aider-AI/aider/issues/6#issue-1722897858"
},
{
text: "Aider is such an astounding thing!",
author: "cgrothaus",
author: "cgrothaus on GitHub",
link: "https://github.com/Aider-AI/aider/issues/82#issuecomment-1631876700"
},
{
text: "It was WAY faster than I would be getting off the ground and making the first few working versions.",
author: "Daniel Feldman",
author: "Daniel Feldman on X",
link: "https://twitter.com/d_feldman/status/1662295077387923456"
},
{
text: "THANK YOU for Aider! It really feels like a glimpse into the future of coding.",
author: "derwiki",
author: "derwiki on Hacker News",
link: "https://news.ycombinator.com/item?id=38205643"
},
{
text: "It's just amazing. It is freeing me to do things I felt were out my comfort zone before.",
author: "Dougie",
author: "Dougie on Discord",
link: "https://discord.com/channels/1131200896827654144/1174002618058678323/1174084556257775656"
},
{
text: "This project is stellar.",
author: "funkytaco",
author: "funkytaco on GitHub",
link: "https://github.com/Aider-AI/aider/issues/112#issuecomment-1637429008"
},
{
text: "Amazing project, definitely the best AI coding assistant I've used.",
author: "joshuavial",
author: "joshuavial on GitHub",
link: "https://github.com/Aider-AI/aider/issues/84"
},
{
text: "I absolutely love using Aider ... It makes software development feel so much lighter as an experience.",
author: "principalideal0",
author: "principalideal0 on Discord",
link: "https://discord.com/channels/1131200896827654144/1133421607499595858/1229689636012691468"
},
{
text: "I have been recovering from multiple shoulder surgeries ... and have used aider extensively. It has allowed me to continue productivity.",
author: "codeninja",
text: "I have been recovering from ... surgeries ... aider ... has allowed me to continue productivity.",
author: "codeninja on Reddit",
link: "https://www.reddit.com/r/OpenAI/s/nmNwkHy1zG"
},
{
text: "I am an aider addict. I'm getting so much more work done, but in less time.",
author: "dandandan",
author: "dandandan on Discord",
link: "https://discord.com/channels/1131200896827654144/1131200896827654149/1135913253483069470"
},
{
text: "After wasting $100 on tokens trying to find something better, I'm back to Aider. It blows everything else out of the water hands down, there's no competition whatsoever.",
author: "SystemSculpt",
text: "Aider... blows everything else out of the water hands down, there's no competition whatsoever.",
author: "SystemSculpt on Discord",
link: "https://discord.com/channels/1131200896827654144/1131200896827654149/1178736602797846548"
},
{
text: "Aider is amazing, coupled with Sonnet 3.5 it's quite mind blowing.",
author: "Josh Dingus",
author: "Josh Dingus on Discord",
link: "https://discord.com/channels/1131200896827654144/1133060684540813372/1262374225298198548"
},
{
text: "Hands down, this is the best AI coding assistant tool so far.",
author: "IndyDevDan",
author: "IndyDevDan on YouTube",
link: "https://www.youtube.com/watch?v=MPYFPvxfGZs"
},
{
text: "[Aider] changed my daily coding workflows. It's mind-blowing how a single Python application can change your life.",
author: "maledorak",
text: "[Aider] changed my daily coding workflows. It's mind-blowing how ...(it)... can change your life.",
author: "maledorak on Discord",
link: "https://discord.com/channels/1131200896827654144/1131200896827654149/1258453375620747264"
},
{
text: "Best agent for actual dev work in existing codebases.",
author: "Nick Dobos",
author: "Nick Dobos on X",
link: "https://twitter.com/NickADobos/status/1690408967963652097?s=20"
},
{
text: "One of my favorite pieces of software. Blazing trails on new paradigms!",
author: "Chris Wall",
author: "Chris Wall on X",
link: "https://x.com/chris65536/status/1905053299251798432"
},
{
text: "Aider has been revolutionary for me and my work.",
author: "Starry Hope",
author: "Starry Hope on X",
link: "https://x.com/starryhopeblog/status/1904985812137132056"
},
{
text: "Try aider! One of the best ways to vibe code.",
author: "Chris Wall",
author: "Chris Wall on X",
link: "https://x.com/Chris65536/status/1905053418961391929"
},
{
text: "Freaking love Aider.",
author: "hztar on Hacker News",
link: "https://news.ycombinator.com/item?id=44035015"
},
{
text: "Aider is hands down the best. And it's free and opensource.",
author: "AriyaSavakaLurker",
author: "AriyaSavakaLurker on Reddit",
link: "https://www.reddit.com/r/ChatGPTCoding/comments/1ik16y6/whats_your_take_on_aider/mbip39n/"
},
{
text: "Aider is also my best friend.",
author: "jzn21",
author: "jzn21 on Reddit",
link: "https://www.reddit.com/r/ChatGPTCoding/comments/1heuvuo/aider_vs_cline_vs_windsurf_vs_cursor/m27dcnb/"
},
{
text: "Try Aider, it's worth it.",
author: "jorgejhms",
author: "jorgejhms on Reddit",
link: "https://www.reddit.com/r/ChatGPTCoding/comments/1heuvuo/aider_vs_cline_vs_windsurf_vs_cursor/m27cp99/"
},
{
text: "I like aider :)",
author: "Chenwei Cui",
author: "Chenwei Cui on X",
link: "https://x.com/ccui42/status/1904965344999145698"
},
{
text: "Aider is the precision tool of LLM code gen... Minimal, thoughtful and capable of surgical changes to your codebase all while keeping the developer in control.",
author: "Reilly Sweetland",
text: "Aider is the precision tool of LLM code gen... Minimal, thoughtful and capable of surgical changes ... while keeping the developer in control.",
author: "Reilly Sweetland on X",
link: "https://x.com/rsweetland/status/1904963807237259586"
},
{
text: "Cannot believe aider vibe coded a 650 LOC feature across service and cli today in 1 shot.",
author: "autopoietist",
author: "autopoietist on Discord",
link: "https://discord.com/channels/1131200896827654144/1131200896827654149/1355675042259796101"
},
{
text: "Oh no the secret is out! Yes, Aider is the best coding tool around. I highly, highly recommend it to anyone.",
author: "Joshua D Vander Hook",
author: "Joshua D Vander Hook on X",
link: "https://x.com/jodavaho/status/1911154899057795218"
},
{
text: "thanks to aider, i have started and finished three personal projects within the last two days",
author: "joseph stalzyn",
author: "joseph stalzyn on X",
link: "https://x.com/anitaheeder/status/1908338609645904160"
},
{
text: "Been using aider as my daily driver for over a year ... I absolutely love the tool, like beyond words.",
author: "koleok",
author: "koleok on Discord",
link: "https://discord.com/channels/1131200896827654144/1273248471394291754/1356727448372252783"
},
{
text: "Aider ... is the tool to benchmark against.",
author: "BeetleB on Hacker News",
link: "https://news.ycombinator.com/item?id=43930201"
},
{
text: "aider is really cool",
author: "kache (@yacineMTB)",
author: "kache on X",
link: "https://x.com/yacineMTB/status/1911224442430124387"
}
];
@@ -636,7 +646,8 @@ const testimonials = [
<ul class="info-list">
<li><a href="/docs/leaderboards/">LLM Leaderboards</a></li>
<li><a href="https://github.com/Aider-AI/aider">GitHub Repository</a></li>
<li><a href="https://discord.gg/Tv2uQnR88V">Discord Community</a></li>
<li><a href="https://discord.gg/Y7X7bhMQFV">Discord Community</a></li>
<li><a href="https://aider.chat/HISTORY.html">Release notes</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
</div>
@@ -649,7 +660,7 @@ const testimonials = [
<div class="footer-links">
<a href="/docs/install.html">Documentation</a>
<a href="https://github.com/Aider-AI/aider">GitHub</a>
<a href="https://discord.gg/Tv2uQnR88V">Discord</a>
<a href="https://discord.gg/Y7X7bhMQFV">Discord</a>
<a href="/blog/">Blog</a>
</div>
</div>

View File

@@ -425,7 +425,7 @@ function Invoke-Installer($artifacts, $platforms) {
Write-Information ""
Write-Information "Installing aider-chat..."
& "$dest_dir\uv.exe" tool install --force --python python3.12 aider-chat@latest
& "$dest_dir\uv.exe" tool install --force --python python3.12 --with pip aider-chat@latest
if (-not $NoModifyPath) {
Add-Ci-Path $dest_dir

View File

@@ -1178,7 +1178,7 @@ install() {
say "Installing aider..."
say ""
# Install aider-chat using the newly installed uv
ensure "${_install_dir}/uv" tool install --force --python python3.12 aider-chat@latest
ensure "${_install_dir}/uv" tool install --force --python python3.12 --with pip aider-chat@latest
# Avoid modifying the users PATH if they are managing their PATH manually
case :$PATH:

View File

@@ -184,7 +184,7 @@ def main(
False, "--clean", "-c", help="Discard the existing testdir and make a clean copy"
),
cont: bool = typer.Option(False, "--cont", help="Continue the (single) matching testdir"),
make_new: bool = typer.Option(False, "--new", "-n", help="Make a new dated testdir"),
make_new: bool = typer.Option(False, "--new", help="Make a new dated testdir"),
no_unit_tests: bool = typer.Option(False, "--no-unit-tests", help="Do not run unit tests"),
no_aider: bool = typer.Option(False, "--no-aider", help="Do not run aider"),
verbose: bool = typer.Option(False, "--verbose", "-v", help="Verbose output"),
@@ -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}")
@@ -777,7 +784,7 @@ def run_test_real(
instructions += prompts.instructions_addendum.format(file_list=file_list)
io = InputOutput(
pretty=True,
pretty=False,
yes=True,
chat_history_file=history_fname,
)
@@ -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.total_tokens_sent,
completion_tokens=coder.total_tokens_received,
thinking_tokens=thinking_tokens,
chat_hashes=list(
zip(

View File

@@ -132,7 +132,7 @@ def find_non_self_methods(path):
with open(filename, "r") as file:
try:
node = ast.parse(file.read(), filename=filename)
except:
except: # noqa: E722
pass
checker = SelfUsageChecker()
checker.visit(node)

View File

@@ -12,11 +12,10 @@ classifiers = [
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python",
"Topic :: Software Development",
]
requires-python = ">=3.9,<3.13"
requires-python = ">=3.10,<3.13"
dynamic = ["dependencies", "optional-dependencies", "version"]
[project.urls]
@@ -48,5 +47,5 @@ build-backend = "setuptools.build_meta"
write_to = "aider/_version.py"
[tool.codespell]
skip = "*.svg,Gemfile.lock"
skip = "*.svg,Gemfile.lock,tests/fixtures/*,aider/website/assets/*"
write-changes = true

View File

@@ -4,11 +4,11 @@ aiohappyeyeballs==2.6.1
# via
# -c requirements/common-constraints.txt
# aiohttp
aiohttp==3.11.18
aiohttp==3.12.15
# via
# -c requirements/common-constraints.txt
# litellm
aiosignal==1.3.2
aiosignal==1.4.0
# via
# -c requirements/common-constraints.txt
# aiohttp
@@ -16,7 +16,7 @@ annotated-types==0.7.0
# via
# -c requirements/common-constraints.txt
# pydantic
anyio==4.9.0
anyio==4.10.0
# via
# -c requirements/common-constraints.txt
# httpx
@@ -41,7 +41,7 @@ cachetools==5.5.2
# via
# -c requirements/common-constraints.txt
# google-auth
certifi==2025.4.26
certifi==2025.8.3
# via
# -c requirements/common-constraints.txt
# httpcore
@@ -56,11 +56,11 @@ charset-normalizer==3.4.2
# via
# -c requirements/common-constraints.txt
# requests
click==8.1.8
click==8.2.1
# via
# -c requirements/common-constraints.txt
# litellm
configargparse==1.7
configargparse==1.7.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -81,16 +81,16 @@ filelock==3.18.0
# via
# -c requirements/common-constraints.txt
# huggingface-hub
flake8==7.2.0
flake8==7.3.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
frozenlist==1.6.0
frozenlist==1.7.0
# via
# -c requirements/common-constraints.txt
# aiohttp
# aiosignal
fsspec==2025.3.2
fsspec==2025.7.0
# via
# -c requirements/common-constraints.txt
# huggingface-hub
@@ -98,7 +98,7 @@ gitdb==4.0.12
# via
# -c requirements/common-constraints.txt
# gitpython
gitpython==3.1.44
gitpython==3.1.45
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -106,17 +106,17 @@ google-ai-generativelanguage==0.6.15
# via
# -c requirements/common-constraints.txt
# google-generativeai
google-api-core[grpc]==2.24.2
google-api-core[grpc]==2.25.1
# via
# -c requirements/common-constraints.txt
# google-ai-generativelanguage
# google-api-python-client
# google-generativeai
google-api-python-client==2.169.0
google-api-python-client==2.178.0
# via
# -c requirements/common-constraints.txt
# google-generativeai
google-auth==2.40.0
google-auth==2.40.3
# via
# -c requirements/common-constraints.txt
# google-ai-generativelanguage
@@ -137,16 +137,16 @@ 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
grpcio==1.71.0
grpcio==1.74.0
# via
# -c requirements/common-constraints.txt
# google-api-core
# grpcio-status
grpcio-status==1.71.0
grpcio-status==1.71.2
# via
# -c requirements/common-constraints.txt
# google-api-core
@@ -154,6 +154,10 @@ h11==0.16.0
# via
# -c requirements/common-constraints.txt
# httpcore
hf-xet==1.1.7
# 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.34.3
# via
# -c requirements/common-constraints.txt
# tokenizers
@@ -192,7 +196,7 @@ jinja2==3.1.6
# via
# -c requirements/common-constraints.txt
# litellm
jiter==0.9.0
jiter==0.10.0
# via
# -c requirements/common-constraints.txt
# openai
@@ -200,7 +204,7 @@ json5==0.12.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
jsonschema==4.23.0
jsonschema==4.25.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -209,7 +213,7 @@ jsonschema-specifications==2025.4.1
# via
# -c requirements/common-constraints.txt
# jsonschema
litellm==1.68.0
litellm==1.75.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -233,12 +237,16 @@ mixpanel==4.10.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
multidict==6.4.3
mslex==1.3.0
# via
# -c requirements/common-constraints.txt
# oslex
multidict==6.6.3
# via
# -c requirements/common-constraints.txt
# aiohttp
# yarl
networkx==3.2.1
networkx==3.4.2
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -247,11 +255,15 @@ numpy==1.26.4
# -c requirements/common-constraints.txt
# scipy
# soundfile
openai==1.75.0
openai==1.99.1
# via
# -c requirements/common-constraints.txt
# litellm
packaging==24.2
oslex==0.1.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
packaging==25.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -265,15 +277,11 @@ pexpect==4.9.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
pillow==11.2.1
pillow==11.3.0
# 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
posthog==6.4.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -281,7 +289,7 @@ prompt-toolkit==3.0.51
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
propcache==0.3.1
propcache==0.3.2
# via
# -c requirements/common-constraints.txt
# aiohttp
@@ -291,7 +299,7 @@ proto-plus==1.26.1
# -c requirements/common-constraints.txt
# google-ai-generativelanguage
# google-api-core
protobuf==5.29.4
protobuf==5.29.5
# via
# -c requirements/common-constraints.txt
# google-ai-generativelanguage
@@ -317,7 +325,7 @@ pyasn1-modules==0.4.2
# via
# -c requirements/common-constraints.txt
# google-auth
pycodestyle==2.13.0
pycodestyle==2.14.0
# via
# -c requirements/common-constraints.txt
# flake8
@@ -325,7 +333,7 @@ pycparser==2.22
# via
# -c requirements/common-constraints.txt
# cffi
pydantic==2.11.4
pydantic==2.11.7
# via
# -c requirements/common-constraints.txt
# google-generativeai
@@ -339,11 +347,11 @@ pydub==0.25.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
pyflakes==3.3.2
pyflakes==3.4.0
# via
# -c requirements/common-constraints.txt
# flake8
pygments==2.19.1
pygments==2.19.2
# via
# -c requirements/common-constraints.txt
# rich
@@ -363,7 +371,7 @@ python-dateutil==2.9.0.post0
# via
# -c requirements/common-constraints.txt
# posthog
python-dotenv==1.1.0
python-dotenv==1.1.1
# via
# -c requirements/common-constraints.txt
# litellm
@@ -377,11 +385,11 @@ referencing==0.36.2
# -c requirements/common-constraints.txt
# jsonschema
# jsonschema-specifications
regex==2024.11.6
regex==2025.7.34
# via
# -c requirements/common-constraints.txt
# tiktoken
requests==2.32.3
requests==2.32.4
# via
# -c requirements/common-constraints.txt
# google-api-core
@@ -389,11 +397,11 @@ requests==2.32.3
# mixpanel
# posthog
# tiktoken
rich==14.0.0
rich==14.1.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
rpds-py==0.24.0
rpds-py==0.27.0
# via
# -c requirements/common-constraints.txt
# jsonschema
@@ -402,7 +410,11 @@ rsa==4.9.1
# via
# -c requirements/common-constraints.txt
# google-auth
scipy==1.13.1
scipy==1.15.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
shtab==1.7.2
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -425,7 +437,7 @@ socksio==1.0.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
sounddevice==0.5.1
sounddevice==0.5.2
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -437,11 +449,11 @@ soupsieve==2.7
# via
# -c requirements/common-constraints.txt
# beautifulsoup4
tiktoken==0.9.0
tiktoken==0.10.0
# via
# -c requirements/common-constraints.txt
# litellm
tokenizers==0.21.1
tokenizers==0.21.4
# via
# -c requirements/common-constraints.txt
# litellm
@@ -462,40 +474,42 @@ 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.9.0
# via
# -c requirements/common-constraints.txt
# grep-ast
tree-sitter-yaml==0.7.0
tree-sitter-yaml==0.7.1
# via
# -c requirements/common-constraints.txt
# tree-sitter-language-pack
typing-extensions==4.13.2
typing-extensions==4.14.1
# via
# -c requirements/common-constraints.txt
# aiosignal
# anyio
# beautifulsoup4
# google-generativeai
# huggingface-hub
# openai
# posthog
# pydantic
# pydantic-core
# referencing
# typing-inspection
typing-inspection==0.4.0
typing-inspection==0.4.1
# via
# -c requirements/common-constraints.txt
# pydantic
uritemplate==4.1.1
uritemplate==4.2.0
# via
# -c requirements/common-constraints.txt
# google-api-python-client
urllib3==2.4.0
urllib3==2.5.0
# via
# -c requirements/common-constraints.txt
# mixpanel
# requests
watchfiles==1.0.5
watchfiles==1.1.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -503,11 +517,11 @@ wcwidth==0.2.13
# via
# -c requirements/common-constraints.txt
# prompt-toolkit
yarl==1.20.0
yarl==1.20.1
# via
# -c requirements/common-constraints.txt
# aiohttp
zipp==3.21.0
zipp==3.23.0
# via
# -c requirements/common-constraints.txt
# importlib-metadata

View File

@@ -2,18 +2,20 @@
# uv pip compile --no-strip-extras --output-file=requirements/common-constraints.txt requirements/requirements.in requirements/requirements-browser.in requirements/requirements-dev.in requirements/requirements-help.in requirements/requirements-playwright.in
aiohappyeyeballs==2.6.1
# via aiohttp
aiohttp==3.11.18
aiohttp==3.12.15
# via
# huggingface-hub
# litellm
# llama-index-core
aiosignal==1.3.2
aiosignal==1.4.0
# via aiohttp
aiosqlite==0.21.0
# via llama-index-core
altair==5.5.0
# via streamlit
annotated-types==0.7.0
# via pydantic
anyio==4.9.0
anyio==4.10.0
# via
# httpx
# openai
@@ -27,19 +29,19 @@ backoff==2.2.1
# via
# -r requirements/requirements.in
# posthog
banks==2.1.2
banks==2.2.0
# via llama-index-core
beautifulsoup4==4.13.4
# via -r requirements/requirements.in
blinker==1.9.0
# via streamlit
build==1.2.2.post1
build==1.3.0
# via pip-tools
cachetools==5.5.2
# via
# google-auth
# streamlit
certifi==2025.4.26
certifi==2025.8.3
# via
# httpcore
# httpx
@@ -52,7 +54,7 @@ cfgv==3.4.0
# via pre-commit
charset-normalizer==3.4.2
# via requests
click==8.1.8
click==8.2.1
# via
# litellm
# nltk
@@ -61,13 +63,13 @@ click==8.1.8
# typer
codespell==2.4.1
# via -r requirements/requirements-dev.in
cogapp==3.4.1
cogapp==3.5.1
# via -r requirements/requirements-dev.in
colorama==0.4.6
# via griffe
configargparse==1.7
configargparse==1.7.1
# via -r requirements/requirements.in
contourpy==1.3.2
contourpy==1.3.3
# via matplotlib
cycler==0.12.1
# via matplotlib
@@ -77,6 +79,7 @@ deprecated==1.2.18
# via
# banks
# llama-index-core
# llama-index-instrumentation
diff-match-patch==20241021
# via -r requirements/requirements.in
dill==0.4.0
@@ -87,7 +90,7 @@ dirtyjson==1.0.8
# via llama-index-core
diskcache==5.6.3
# via -r requirements/requirements.in
distlib==0.3.9
distlib==0.4.0
# via virtualenv
distro==1.9.0
# via
@@ -101,37 +104,37 @@ filelock==3.18.0
# virtualenv
filetype==1.2.0
# via llama-index-core
flake8==7.2.0
flake8==7.3.0
# via -r requirements/requirements.in
fonttools==4.57.0
fonttools==4.59.0
# via matplotlib
frozenlist==1.6.0
frozenlist==1.7.0
# via
# aiohttp
# aiosignal
fsspec==2025.3.2
fsspec==2025.7.0
# via
# huggingface-hub
# llama-index-core
# torch
gitdb==4.0.12
# via gitpython
gitpython==3.1.44
gitpython==3.1.45
# via
# -r requirements/requirements.in
# streamlit
google-ai-generativelanguage==0.6.15
# via google-generativeai
google-api-core[grpc]==2.24.2
google-api-core[grpc]==2.25.1
# via
# google-ai-generativelanguage
# google-api-python-client
# google-cloud-bigquery
# google-cloud-core
# google-generativeai
google-api-python-client==2.169.0
google-api-python-client==2.178.0
# via google-generativeai
google-auth==2.40.0
google-auth==2.40.3
# via
# google-ai-generativelanguage
# google-api-core
@@ -142,7 +145,7 @@ google-auth==2.40.0
# google-generativeai
google-auth-httplib2==0.2.0
# via google-api-python-client
google-cloud-bigquery==3.31.0
google-cloud-bigquery==3.35.1
# via -r requirements/requirements-dev.in
google-cloud-core==2.4.3
# via google-cloud-bigquery
@@ -156,22 +159,24 @@ googleapis-common-protos==1.70.0
# via
# google-api-core
# grpcio-status
greenlet==3.2.1
greenlet==3.2.3
# via
# playwright
# sqlalchemy
grep-ast==0.8.1
grep-ast==0.9.0
# via -r requirements/requirements.in
griffe==1.7.3
griffe==1.10.0
# via banks
grpcio==1.71.0
grpcio==1.74.0
# via
# google-api-core
# grpcio-status
grpcio-status==1.71.0
grpcio-status==1.71.2
# via google-api-core
h11==0.16.0
# via httpcore
hf-xet==1.1.7
# via huggingface-hub
httpcore==1.0.9
# via httpx
httplib2==0.22.0
@@ -183,13 +188,13 @@ httpx==0.28.1
# litellm
# llama-index-core
# openai
huggingface-hub[inference]==0.30.2
huggingface-hub[inference]==0.34.3
# via
# llama-index-embeddings-huggingface
# sentence-transformers
# tokenizers
# transformers
identify==2.6.10
identify==2.6.12
# via pre-commit
idna==3.10
# via
@@ -214,15 +219,15 @@ jinja2==3.1.6
# litellm
# pydeck
# torch
jiter==0.9.0
jiter==0.10.0
# via openai
joblib==1.5.0
joblib==1.5.1
# via
# nltk
# scikit-learn
json5==0.12.0
# via -r requirements/requirements.in
jsonschema==4.23.0
jsonschema==4.25.0
# via
# -r requirements/requirements.in
# altair
@@ -231,14 +236,16 @@ jsonschema-specifications==2025.4.1
# via jsonschema
kiwisolver==1.4.8
# via matplotlib
litellm==1.68.0
litellm==1.75.0
# via -r requirements/requirements.in
llama-index-core==0.12.26
# via
# -r requirements/requirements-help.in
# llama-index-embeddings-huggingface
llama-index-embeddings-huggingface==0.5.3
llama-index-core==0.13.0
# via llama-index-embeddings-huggingface
llama-index-embeddings-huggingface==0.6.0
# via -r requirements/requirements-help.in
llama-index-instrumentation==0.4.0
# via llama-index-workflows
llama-index-workflows==1.3.0
# via llama-index-core
lox==0.13.0
# via -r requirements/requirements-dev.in
markdown-it-py==3.0.0
@@ -247,7 +254,7 @@ markupsafe==3.0.2
# via jinja2
marshmallow==3.26.1
# via dataclasses-json
matplotlib==3.10.1
matplotlib==3.10.5
# via -r requirements/requirements-dev.in
mccabe==0.7.0
# via flake8
@@ -257,7 +264,9 @@ mixpanel==4.10.1
# via -r requirements/requirements.in
mpmath==1.3.0
# via sympy
multidict==6.4.3
mslex==1.3.0
# via oslex
multidict==6.6.3
# via
# aiohttp
# yarl
@@ -265,11 +274,11 @@ multiprocess==0.70.18
# via pathos
mypy-extensions==1.1.0
# via typing-inspect
narwhals==1.38.0
narwhals==2.0.1
# via altair
nest-asyncio==1.6.0
# via llama-index-core
networkx==3.2.1
networkx==3.4.2
# via
# -r requirements/requirements.in
# llama-index-core
@@ -291,9 +300,11 @@ numpy==1.26.4
# soundfile
# streamlit
# transformers
openai==1.75.0
openai==1.99.1
# via litellm
packaging==24.2
oslex==0.1.3
# via -r requirements/requirements.in
packaging==25.0
# via
# -r requirements/requirements.in
# altair
@@ -305,7 +316,7 @@ packaging==24.2
# pytest
# streamlit
# transformers
pandas==2.2.3
pandas==2.3.1
# via
# -r requirements/requirements-dev.in
# streamlit
@@ -317,28 +328,27 @@ pathspec==0.12.1
# grep-ast
pexpect==4.9.0
# via -r requirements/requirements.in
pillow==11.2.1
pillow==11.3.0
# via
# -r requirements/requirements.in
# llama-index-core
# matplotlib
# sentence-transformers
# streamlit
pip==25.1.1
# via
# -r requirements/requirements.in
# pip-tools
pip-tools==7.4.1
pip==25.2
# via pip-tools
pip-tools==7.5.0
# via -r requirements/requirements-dev.in
platformdirs==4.3.7
platformdirs==4.3.8
# via
# banks
# llama-index-core
# virtualenv
playwright==1.52.0
playwright==1.54.0
# via -r requirements/requirements-playwright.in
pluggy==1.5.0
pluggy==1.6.0
# via pytest
posthog==4.0.1
posthog==6.4.1
# via -r requirements/requirements.in
pox==0.3.6
# via pathos
@@ -348,7 +358,7 @@ pre-commit==4.2.0
# via -r requirements/requirements-dev.in
prompt-toolkit==3.0.51
# via -r requirements/requirements.in
propcache==0.3.1
propcache==0.3.2
# via
# aiohttp
# yarl
@@ -356,7 +366,7 @@ proto-plus==1.26.1
# via
# google-ai-generativelanguage
# google-api-core
protobuf==5.29.4
protobuf==5.29.5
# via
# google-ai-generativelanguage
# google-api-core
@@ -369,7 +379,7 @@ psutil==7.0.0
# via -r requirements/requirements.in
ptyprocess==0.7.0
# via pexpect
pyarrow==20.0.0
pyarrow==21.0.0
# via streamlit
pyasn1==0.6.1
# via
@@ -377,16 +387,18 @@ pyasn1==0.6.1
# rsa
pyasn1-modules==0.4.2
# via google-auth
pycodestyle==2.13.0
pycodestyle==2.14.0
# via flake8
pycparser==2.22
# via cffi
pydantic==2.11.4
pydantic==2.11.7
# via
# banks
# google-generativeai
# litellm
# llama-index-core
# llama-index-instrumentation
# llama-index-workflows
# openai
pydantic-core==2.33.2
# via pydantic
@@ -396,10 +408,12 @@ pydub==0.25.1
# via -r requirements/requirements.in
pyee==13.0.0
# via playwright
pyflakes==3.3.2
pyflakes==3.4.0
# via flake8
pygments==2.19.1
# via rich
pygments==2.19.2
# via
# pytest
# rich
pypandoc==1.15
# via -r requirements/requirements.in
pyparsing==3.2.3
@@ -412,7 +426,7 @@ pyproject-hooks==1.2.0
# via
# build
# pip-tools
pytest==8.3.5
pytest==8.4.1
# via
# -r requirements/requirements-dev.in
# pytest-env
@@ -424,7 +438,7 @@ python-dateutil==2.9.0.post0
# matplotlib
# pandas
# posthog
python-dotenv==1.1.0
python-dotenv==1.1.1
# via litellm
pytz==2025.2
# via pandas
@@ -439,12 +453,12 @@ referencing==0.36.2
# via
# jsonschema
# jsonschema-specifications
regex==2024.11.6
regex==2025.7.34
# via
# nltk
# tiktoken
# transformers
requests==2.32.3
requests==2.32.4
# via
# google-api-core
# google-cloud-bigquery
@@ -455,33 +469,38 @@ requests==2.32.3
# streamlit
# tiktoken
# transformers
rich==14.0.0
rich==14.1.0
# via
# -r requirements/requirements.in
# typer
rpds-py==0.24.0
rpds-py==0.27.0
# via
# jsonschema
# referencing
rsa==4.9.1
# via google-auth
safetensors==0.5.3
safetensors==0.6.1
# via transformers
scikit-learn==1.6.1
scikit-learn==1.7.1
# via sentence-transformers
scipy==1.13.1
scipy==1.15.3
# via
# -r requirements/requirements.in
# scikit-learn
# sentence-transformers
semver==3.0.4
# via -r requirements/requirements-dev.in
sentence-transformers==4.1.0
sentence-transformers==5.1.0
# via llama-index-embeddings-huggingface
setuptools==80.3.1
# via pip-tools
setuptools==80.9.0
# via
# llama-index-core
# pip-tools
# torch
shellingham==1.5.4
# via typer
shtab==1.7.2
# via -r requirements/requirements.in
six==1.17.0
# via
# mixpanel
@@ -495,15 +514,15 @@ sniffio==1.3.1
# openai
socksio==1.0.0
# via -r requirements/requirements.in
sounddevice==0.5.1
sounddevice==0.5.2
# via -r requirements/requirements.in
soundfile==0.13.1
# via -r requirements/requirements.in
soupsieve==2.7
# via beautifulsoup4
sqlalchemy[asyncio]==2.0.40
sqlalchemy[asyncio]==2.0.42
# via llama-index-core
streamlit==1.45.0
streamlit==1.48.0
# via -r requirements/requirements-browser.in
sympy==1.14.0
# via torch
@@ -513,21 +532,19 @@ tenacity==9.1.2
# streamlit
threadpoolctl==3.6.0
# via scikit-learn
tiktoken==0.9.0
tiktoken==0.10.0
# via
# litellm
# llama-index-core
tokenizers==0.21.1
tokenizers==0.21.4
# via
# litellm
# transformers
toml==0.10.2
# via streamlit
torch==2.2.2
# via
# -r requirements/requirements-help.in
# sentence-transformers
tornado==6.4.2
torch==2.8.0
# via sentence-transformers
tornado==6.5.1
# via streamlit
tqdm==4.67.1
# via
@@ -538,29 +555,33 @@ tqdm==4.67.1
# openai
# sentence-transformers
# transformers
transformers==4.51.3
transformers==4.55.0
# via sentence-transformers
tree-sitter==0.24.0
tree-sitter==0.25.1
# via tree-sitter-language-pack
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.9.0
# via grep-ast
tree-sitter-yaml==0.7.0
tree-sitter-yaml==0.7.1
# via tree-sitter-language-pack
typer==0.15.3
typer==0.16.0
# via -r requirements/requirements-dev.in
typing-extensions==4.13.2
typing-extensions==4.14.1
# via
# aiosignal
# aiosqlite
# altair
# anyio
# beautifulsoup4
# google-generativeai
# huggingface-hub
# llama-index-core
# llama-index-workflows
# openai
# posthog
# pydantic
# pydantic-core
# pyee
@@ -576,21 +597,21 @@ typing-inspect==0.9.0
# via
# dataclasses-json
# llama-index-core
typing-inspection==0.4.0
typing-inspection==0.4.1
# via pydantic
tzdata==2025.2
# via pandas
uritemplate==4.1.1
uritemplate==4.2.0
# via google-api-python-client
urllib3==2.4.0
urllib3==2.5.0
# via
# mixpanel
# requests
uv==0.7.2
uv==0.8.5
# via -r requirements/requirements-dev.in
virtualenv==20.31.1
virtualenv==20.33.1
# via pre-commit
watchfiles==1.0.5
watchfiles==1.1.0
# via -r requirements/requirements.in
wcwidth==0.2.13
# via prompt-toolkit
@@ -600,7 +621,7 @@ wrapt==1.17.2
# via
# deprecated
# llama-index-core
yarl==1.20.0
yarl==1.20.1
# via aiohttp
zipp==3.21.0
zipp==3.23.0
# via importlib-metadata

View File

@@ -17,7 +17,7 @@ cachetools==5.5.2
# via
# -c requirements/common-constraints.txt
# streamlit
certifi==2025.4.26
certifi==2025.8.3
# via
# -c requirements/common-constraints.txt
# requests
@@ -25,7 +25,7 @@ charset-normalizer==3.4.2
# via
# -c requirements/common-constraints.txt
# requests
click==8.1.8
click==8.2.1
# via
# -c requirements/common-constraints.txt
# streamlit
@@ -33,7 +33,7 @@ gitdb==4.0.12
# via
# -c requirements/common-constraints.txt
# gitpython
gitpython==3.1.44
gitpython==3.1.45
# via
# -c requirements/common-constraints.txt
# streamlit
@@ -46,7 +46,7 @@ jinja2==3.1.6
# -c requirements/common-constraints.txt
# altair
# pydeck
jsonschema==4.23.0
jsonschema==4.25.0
# via
# -c requirements/common-constraints.txt
# altair
@@ -58,7 +58,7 @@ markupsafe==3.0.2
# via
# -c requirements/common-constraints.txt
# jinja2
narwhals==1.38.0
narwhals==2.0.1
# via
# -c requirements/common-constraints.txt
# altair
@@ -68,24 +68,24 @@ numpy==1.26.4
# pandas
# pydeck
# streamlit
packaging==24.2
packaging==25.0
# via
# -c requirements/common-constraints.txt
# altair
# streamlit
pandas==2.2.3
pandas==2.3.1
# via
# -c requirements/common-constraints.txt
# streamlit
pillow==11.2.1
pillow==11.3.0
# via
# -c requirements/common-constraints.txt
# streamlit
protobuf==5.29.4
protobuf==5.29.5
# via
# -c requirements/common-constraints.txt
# streamlit
pyarrow==20.0.0
pyarrow==21.0.0
# via
# -c requirements/common-constraints.txt
# streamlit
@@ -106,11 +106,11 @@ referencing==0.36.2
# -c requirements/common-constraints.txt
# jsonschema
# jsonschema-specifications
requests==2.32.3
requests==2.32.4
# via
# -c requirements/common-constraints.txt
# streamlit
rpds-py==0.24.0
rpds-py==0.27.0
# via
# -c requirements/common-constraints.txt
# jsonschema
@@ -123,7 +123,7 @@ smmap==5.0.2
# via
# -c requirements/common-constraints.txt
# gitdb
streamlit==1.45.0
streamlit==1.48.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-browser.in
@@ -135,11 +135,11 @@ toml==0.10.2
# via
# -c requirements/common-constraints.txt
# streamlit
tornado==6.4.2
tornado==6.5.1
# via
# -c requirements/common-constraints.txt
# streamlit
typing-extensions==4.13.2
typing-extensions==4.14.1
# via
# -c requirements/common-constraints.txt
# altair
@@ -149,7 +149,7 @@ tzdata==2025.2
# via
# -c requirements/common-constraints.txt
# pandas
urllib3==2.4.0
urllib3==2.5.0
# via
# -c requirements/common-constraints.txt
# requests

View File

@@ -1,6 +1,6 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --no-strip-extras --constraint=requirements/common-constraints.txt --output-file=requirements/requirements-dev.txt requirements/requirements-dev.in
build==1.2.2.post1
build==1.3.0
# via
# -c requirements/common-constraints.txt
# pip-tools
@@ -8,7 +8,7 @@ cachetools==5.5.2
# via
# -c requirements/common-constraints.txt
# google-auth
certifi==2025.4.26
certifi==2025.8.3
# via
# -c requirements/common-constraints.txt
# requests
@@ -20,7 +20,7 @@ charset-normalizer==3.4.2
# via
# -c requirements/common-constraints.txt
# requests
click==8.1.8
click==8.2.1
# via
# -c requirements/common-constraints.txt
# pip-tools
@@ -29,11 +29,11 @@ codespell==2.4.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
cogapp==3.4.1
cogapp==3.5.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
contourpy==1.3.2
contourpy==1.3.3
# via
# -c requirements/common-constraints.txt
# matplotlib
@@ -46,7 +46,7 @@ dill==0.4.0
# -c requirements/common-constraints.txt
# multiprocess
# pathos
distlib==0.3.9
distlib==0.4.0
# via
# -c requirements/common-constraints.txt
# virtualenv
@@ -54,22 +54,22 @@ filelock==3.18.0
# via
# -c requirements/common-constraints.txt
# virtualenv
fonttools==4.57.0
fonttools==4.59.0
# via
# -c requirements/common-constraints.txt
# matplotlib
google-api-core[grpc]==2.24.2
google-api-core[grpc]==2.25.1
# via
# -c requirements/common-constraints.txt
# google-cloud-bigquery
# google-cloud-core
google-auth==2.40.0
google-auth==2.40.3
# via
# -c requirements/common-constraints.txt
# google-api-core
# google-cloud-bigquery
# google-cloud-core
google-cloud-bigquery==3.31.0
google-cloud-bigquery==3.35.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
@@ -90,16 +90,16 @@ googleapis-common-protos==1.70.0
# -c requirements/common-constraints.txt
# google-api-core
# grpcio-status
grpcio==1.71.0
grpcio==1.74.0
# via
# -c requirements/common-constraints.txt
# google-api-core
# grpcio-status
grpcio-status==1.71.0
grpcio-status==1.71.2
# via
# -c requirements/common-constraints.txt
# google-api-core
identify==2.6.10
identify==2.6.12
# via
# -c requirements/common-constraints.txt
# pre-commit
@@ -127,7 +127,7 @@ markdown-it-py==3.0.0
# via
# -c requirements/common-constraints.txt
# rich
matplotlib==3.10.1
matplotlib==3.10.5
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
@@ -149,14 +149,14 @@ numpy==1.26.4
# contourpy
# matplotlib
# pandas
packaging==24.2
packaging==25.0
# via
# -c requirements/common-constraints.txt
# build
# google-cloud-bigquery
# matplotlib
# pytest
pandas==2.2.3
pandas==2.3.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
@@ -164,23 +164,23 @@ pathos==0.3.4
# via
# -c requirements/common-constraints.txt
# lox
pillow==11.2.1
pillow==11.3.0
# via
# -c requirements/common-constraints.txt
# matplotlib
pip==25.1.1
pip==25.2
# via
# -c requirements/common-constraints.txt
# pip-tools
pip-tools==7.4.1
pip-tools==7.5.0
# 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
pluggy==1.5.0
pluggy==1.6.0
# via
# -c requirements/common-constraints.txt
# pytest
@@ -200,7 +200,7 @@ proto-plus==1.26.1
# via
# -c requirements/common-constraints.txt
# google-api-core
protobuf==5.29.4
protobuf==5.29.5
# via
# -c requirements/common-constraints.txt
# google-api-core
@@ -216,9 +216,10 @@ pyasn1-modules==0.4.2
# via
# -c requirements/common-constraints.txt
# google-auth
pygments==2.19.1
pygments==2.19.2
# via
# -c requirements/common-constraints.txt
# pytest
# rich
pyparsing==3.2.3
# via
@@ -229,7 +230,7 @@ pyproject-hooks==1.2.0
# -c requirements/common-constraints.txt
# build
# pip-tools
pytest==8.3.5
pytest==8.4.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
@@ -252,12 +253,12 @@ pyyaml==6.0.2
# via
# -c requirements/common-constraints.txt
# pre-commit
requests==2.32.3
requests==2.32.4
# via
# -c requirements/common-constraints.txt
# google-api-core
# google-cloud-bigquery
rich==14.0.0
rich==14.1.0
# via
# -c requirements/common-constraints.txt
# typer
@@ -269,7 +270,7 @@ semver==3.0.4
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
setuptools==80.3.1
setuptools==80.9.0
# via
# -c requirements/common-constraints.txt
# pip-tools
@@ -281,11 +282,11 @@ six==1.17.0
# via
# -c requirements/common-constraints.txt
# python-dateutil
typer==0.15.3
typer==0.16.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
typing-extensions==4.13.2
typing-extensions==4.14.1
# via
# -c requirements/common-constraints.txt
# typer
@@ -293,15 +294,15 @@ tzdata==2025.2
# via
# -c requirements/common-constraints.txt
# pandas
urllib3==2.4.0
urllib3==2.5.0
# via
# -c requirements/common-constraints.txt
# requests
uv==0.7.2
uv==0.8.5
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
virtualenv==20.31.1
virtualenv==20.33.1
# via
# -c requirements/common-constraints.txt
# pre-commit

View File

@@ -5,7 +5,7 @@ numpy<2
# Mac x86 only supports 2.2.2
# https://discuss.pytorch.org/t/why-no-macosx-x86-64-build-after-torch-2-2-2-cp39-none-macosx-10-9-x86-64-whl/204546/2
torch==2.2.2
# torch==2.2.2
# Later versions break test_help in GitHub Actions on Windows and Ubuntu
llama-index-core==0.12.26
# llama-index-core==0.12.26

View File

@@ -4,20 +4,24 @@ aiohappyeyeballs==2.6.1
# via
# -c requirements/common-constraints.txt
# aiohttp
aiohttp==3.11.18
aiohttp==3.12.15
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# llama-index-core
aiosignal==1.3.2
aiosignal==1.4.0
# via
# -c requirements/common-constraints.txt
# aiohttp
aiosqlite==0.21.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
annotated-types==0.7.0
# via
# -c requirements/common-constraints.txt
# pydantic
anyio==4.9.0
anyio==4.10.0
# via
# -c requirements/common-constraints.txt
# httpx
@@ -25,11 +29,11 @@ attrs==25.3.0
# via
# -c requirements/common-constraints.txt
# aiohttp
banks==2.1.2
banks==2.2.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
certifi==2025.4.26
certifi==2025.8.3
# via
# -c requirements/common-constraints.txt
# httpcore
@@ -39,7 +43,7 @@ charset-normalizer==3.4.2
# via
# -c requirements/common-constraints.txt
# requests
click==8.1.8
click==8.2.1
# via
# -c requirements/common-constraints.txt
# nltk
@@ -56,6 +60,7 @@ deprecated==1.2.18
# -c requirements/common-constraints.txt
# banks
# llama-index-core
# llama-index-instrumentation
dirtyjson==1.0.8
# via
# -c requirements/common-constraints.txt
@@ -70,22 +75,22 @@ filetype==1.2.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
frozenlist==1.6.0
frozenlist==1.7.0
# via
# -c requirements/common-constraints.txt
# aiohttp
# aiosignal
fsspec==2025.3.2
fsspec==2025.7.0
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# llama-index-core
# torch
greenlet==3.2.1
greenlet==3.2.3
# via
# -c requirements/common-constraints.txt
# sqlalchemy
griffe==1.7.3
griffe==1.10.0
# via
# -c requirements/common-constraints.txt
# banks
@@ -93,6 +98,10 @@ h11==0.16.0
# via
# -c requirements/common-constraints.txt
# httpcore
hf-xet==1.1.7
# via
# -c requirements/common-constraints.txt
# huggingface-hub
httpcore==1.0.9
# via
# -c requirements/common-constraints.txt
@@ -101,7 +110,7 @@ httpx==0.28.1
# via
# -c requirements/common-constraints.txt
# llama-index-core
huggingface-hub[inference]==0.30.2
huggingface-hub[inference]==0.34.3
# via
# -c requirements/common-constraints.txt
# llama-index-embeddings-huggingface
@@ -120,20 +129,27 @@ jinja2==3.1.6
# -c requirements/common-constraints.txt
# banks
# torch
joblib==1.5.0
joblib==1.5.1
# via
# -c requirements/common-constraints.txt
# nltk
# scikit-learn
llama-index-core==0.12.26
llama-index-core==0.13.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-help.in
# llama-index-embeddings-huggingface
llama-index-embeddings-huggingface==0.5.3
llama-index-embeddings-huggingface==0.6.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-help.in
llama-index-instrumentation==0.4.0
# via
# -c requirements/common-constraints.txt
# llama-index-workflows
llama-index-workflows==1.3.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
markupsafe==3.0.2
# via
# -c requirements/common-constraints.txt
@@ -146,7 +162,7 @@ mpmath==1.3.0
# via
# -c requirements/common-constraints.txt
# sympy
multidict==6.4.3
multidict==6.6.3
# via
# -c requirements/common-constraints.txt
# aiohttp
@@ -159,7 +175,7 @@ nest-asyncio==1.6.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
networkx==3.2.1
networkx==3.4.2
# via
# -c requirements/common-constraints.txt
# llama-index-core
@@ -176,31 +192,34 @@ numpy==1.26.4
# scikit-learn
# scipy
# transformers
packaging==24.2
packaging==25.0
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# marshmallow
# transformers
pillow==11.2.1
pillow==11.3.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
# sentence-transformers
platformdirs==4.3.7
# via
# -c requirements/common-constraints.txt
# banks
propcache==0.3.1
# via
# -c requirements/common-constraints.txt
# aiohttp
# yarl
pydantic==2.11.4
platformdirs==4.3.8
# via
# -c requirements/common-constraints.txt
# banks
# llama-index-core
propcache==0.3.2
# via
# -c requirements/common-constraints.txt
# aiohttp
# yarl
pydantic==2.11.7
# via
# -c requirements/common-constraints.txt
# banks
# llama-index-core
# llama-index-instrumentation
# llama-index-workflows
pydantic-core==2.33.2
# via
# -c requirements/common-constraints.txt
@@ -211,41 +230,46 @@ pyyaml==6.0.2
# huggingface-hub
# llama-index-core
# transformers
regex==2024.11.6
regex==2025.7.34
# via
# -c requirements/common-constraints.txt
# nltk
# tiktoken
# transformers
requests==2.32.3
requests==2.32.4
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# llama-index-core
# tiktoken
# transformers
safetensors==0.5.3
safetensors==0.6.1
# via
# -c requirements/common-constraints.txt
# transformers
scikit-learn==1.6.1
scikit-learn==1.7.1
# via
# -c requirements/common-constraints.txt
# sentence-transformers
scipy==1.13.1
scipy==1.15.3
# via
# -c requirements/common-constraints.txt
# scikit-learn
# sentence-transformers
sentence-transformers==4.1.0
sentence-transformers==5.1.0
# via
# -c requirements/common-constraints.txt
# llama-index-embeddings-huggingface
setuptools==80.9.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
# torch
sniffio==1.3.1
# via
# -c requirements/common-constraints.txt
# anyio
sqlalchemy[asyncio]==2.0.40
sqlalchemy[asyncio]==2.0.42
# via
# -c requirements/common-constraints.txt
# llama-index-core
@@ -261,18 +285,17 @@ threadpoolctl==3.6.0
# via
# -c requirements/common-constraints.txt
# scikit-learn
tiktoken==0.9.0
tiktoken==0.10.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
tokenizers==0.21.1
tokenizers==0.21.4
# via
# -c requirements/common-constraints.txt
# transformers
torch==2.2.2
torch==2.8.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-help.in
# sentence-transformers
tqdm==4.67.1
# via
@@ -282,16 +305,19 @@ tqdm==4.67.1
# nltk
# sentence-transformers
# transformers
transformers==4.51.3
transformers==4.55.0
# via
# -c requirements/common-constraints.txt
# sentence-transformers
typing-extensions==4.13.2
typing-extensions==4.14.1
# via
# -c requirements/common-constraints.txt
# aiosignal
# aiosqlite
# anyio
# huggingface-hub
# llama-index-core
# llama-index-workflows
# pydantic
# pydantic-core
# sentence-transformers
@@ -304,11 +330,11 @@ typing-inspect==0.9.0
# -c requirements/common-constraints.txt
# dataclasses-json
# llama-index-core
typing-inspection==0.4.0
typing-inspection==0.4.1
# via
# -c requirements/common-constraints.txt
# pydantic
urllib3==2.4.0
urllib3==2.5.0
# via
# -c requirements/common-constraints.txt
# requests
@@ -317,7 +343,7 @@ wrapt==1.17.2
# -c requirements/common-constraints.txt
# deprecated
# llama-index-core
yarl==1.20.0
yarl==1.20.1
# via
# -c requirements/common-constraints.txt
# aiohttp

View File

@@ -1,10 +1,10 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --no-strip-extras --constraint=requirements/common-constraints.txt --output-file=requirements/requirements-playwright.txt requirements/requirements-playwright.in
greenlet==3.2.1
greenlet==3.2.3
# via
# -c requirements/common-constraints.txt
# playwright
playwright==1.52.0
playwright==1.54.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-playwright.in
@@ -12,7 +12,7 @@ pyee==13.0.0
# via
# -c requirements/common-constraints.txt
# playwright
typing-extensions==4.13.2
typing-extensions==4.14.1
# via
# -c requirements/common-constraints.txt
# pyee

View File

@@ -26,22 +26,25 @@ json5
psutil
watchfiles
socksio
pip
pillow
shtab
oslex
google-generativeai
# The proper dependency is networkx[default], but this brings
# in matplotlib and a bunch of other deps
# https://github.com/networkx/networkx/blob/d7132daa8588f653eacac7a5bae1ee85a183fa43/pyproject.toml#L57
# We really only need networkx itself and scipy for the repomap.
# Pin below v3.3 to retain python 3.9 compatibility.
networkx<3.3
#
# >3.5 seems to not be available for py3.10
networkx<3.5
# This is the one networkx dependency that we need.
# Including it here explicitly because we
# didn't specify networkx[default] above.
# Pin below 1.14 to retain python 3.9 compatibility.
scipy<1.14
#
# 1.16 onwards only supports python3.11+
scipy<1.16
# GitHub Release action failing on "KeyError: 'home-page'"
# https://github.com/pypa/twine/blob/6fbf880ee60915cf1666348c4bdd78a10415f2ac/twine/__init__.py#L40

View File

@@ -1,4 +1,5 @@
#!/usr/bin/env python
# flake8: noqa: E501
"""
Generate a celebratory SVG image for Aider reaching 30,000 GitHub stars.
This creates a shareable social media graphic with confetti animation.
@@ -7,7 +8,6 @@ This creates a shareable social media graphic with confetti animation.
import argparse
import base64
import math
import os
import random
from pathlib import Path

View File

@@ -5,7 +5,7 @@ FROM bretfisher/jekyll-serve
WORKDIR /site
# Copy the current directory contents into the container at /srv/jekyll
COPY website /site
COPY aider/website /site
RUN apt-get update && apt-get install libcurl4

View File

@@ -3,7 +3,6 @@
Download Material Design Icons SVGs used in the README and save to local assets.
"""
import os
from pathlib import Path
import requests

View File

@@ -1,15 +1,17 @@
history_prompt = """
Update the history doc with changes shown in the diffs.
Describe actual user-facing changes, not every single commit that was made implementing them.
Update the history markdown doc with changes shown in the diffs.
Succinctly describe actual user-facing changes, not every single commit or detail that was made implementing them.
Only add new items not already listed.
Only add new items not already listed in the history markdown.
Do NOT edit or update existing history entries.
Do NOT add duplicate entries for changes that have existing history entries.
Do NOT add additional entries for small tweaks to features which are already listed in the existing history.
Pay attention to see if changes are later modified or superseded.
Pay attention to see if changes are later modified or superseded in the commit logs.
The history doc should only reflect the *final* version of changes which have evolved within a version's commit history.
If the history doc already describes the final behavior, don't document the changes that led us there.
Bullet each item at the start of the line with `-`.
End each bullet with a period.
If the change was made by someone other than Paul Gauthier note it at the end of the bullet point as ", by XXX."
@@ -19,6 +21,6 @@ Changes in the .x-dev version should be listed under a "### main branch" heading
Start a new "### main branch" section at the top of the file if needed.
Also, add this as the last bullet under the "### main branch" section:
Also, add this as the last bullet under the "### main branch" section, replacing an existing version if present:
{aider_line}
""" # noqa

View File

@@ -1,7 +1,5 @@
#!/usr/bin/env python3
import json
import os
import re
import sys
import pyte

View File

@@ -3,6 +3,7 @@
import os
import re
import subprocess
import sys
import tempfile
from history_prompts import history_prompt
@@ -52,26 +53,11 @@ def run_git_diff():
return result.stdout
def run_plain_git_log():
latest_ver = get_latest_version_from_history()
cmd = [
"git",
"log",
f"v{latest_ver}..HEAD",
"--",
"aider/",
":!aider/website/",
":!scripts/",
":!HISTORY.md",
]
result = subprocess.run(cmd, capture_output=True, text=True)
return result.stdout
def main():
aider_args = sys.argv[1:]
# Get the git log and diff output
log_content = run_git_log()
plain_log_content = run_plain_git_log()
diff_content = run_git_diff()
# Extract relevant portion of HISTORY.md
@@ -108,14 +94,15 @@ def main():
tmp_diff.write(diff_content)
diff_path = tmp_diff.name
with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".plain_log") as tmp_plain_log:
tmp_plain_log.write(plain_log_content)
plain_log_path = tmp_plain_log.name
with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".md") as tmp_hist:
tmp_hist.write(relevant_history)
hist_path = tmp_hist.name
# Display line counts
print(f"Lines in {hist_path}: {len(relevant_history.splitlines())}")
print(f"Lines in {log_path}: {len(log_content.splitlines())}")
print(f"Lines in {diff_path}: {len(diff_content.splitlines())}")
# Run blame to get aider percentage
blame_result = subprocess.run(["python3", "scripts/blame.py"], capture_output=True, text=True)
aider_line = blame_result.stdout.strip().split("\n")[-1] # Get last line with percentage
@@ -125,18 +112,18 @@ def main():
cmd = [
"aider",
"--model",
"o3",
hist_path,
"--read",
log_path,
"--read",
plain_log_path,
"--read",
diff_path,
"--msg",
message,
"--no-git",
"--no-auto-lint",
]
] + aider_args
subprocess.run(cmd)
# Read back the updated history
@@ -164,7 +151,6 @@ def main():
# Cleanup
os.unlink(log_path)
os.unlink(plain_log_path)
os.unlink(diff_path)
os.unlink(hist_path)

View File

@@ -649,7 +649,7 @@ TWO
coder.partial_response_function_call = dict()
return []
def mock_get_commit_message(diffs, context):
def mock_get_commit_message(diffs, context, user_language=None):
self.assertNotIn("one", diffs)
self.assertNotIn("ONE", diffs)
return "commit message"
@@ -704,7 +704,7 @@ three
saved_diffs = []
def mock_get_commit_message(diffs, context):
def mock_get_commit_message(diffs, context, user_language=None):
saved_diffs.append(diffs)
return "commit message"
@@ -782,7 +782,7 @@ two
saved_diffs = []
def mock_get_commit_message(diffs, context):
def mock_get_commit_message(diffs, context, user_language=None):
saved_diffs.append(diffs)
return "commit message"
@@ -834,6 +834,36 @@ two
self.assertNotIn(fname2, str(coder.abs_fnames))
self.assertNotIn(fname3, str(coder.abs_fnames))
def test_skip_gitignored_files_on_init(self):
with GitTemporaryDirectory() as _:
repo_path = Path(".")
repo = git.Repo.init(repo_path)
ignored_file = repo_path / "ignored_by_git.txt"
ignored_file.write_text("This file should be ignored by git.")
regular_file = repo_path / "regular_file.txt"
regular_file.write_text("This is a regular file.")
gitignore_content = "ignored_by_git.txt\n"
(repo_path / ".gitignore").write_text(gitignore_content)
repo.index.add([str(regular_file), ".gitignore"])
repo.index.commit("Initial commit with gitignore and regular file")
mock_io = MagicMock()
mock_io.tool_warning = MagicMock()
fnames_to_add = [str(ignored_file), str(regular_file)]
coder = Coder.create(self.GPT35, None, mock_io, fnames=fnames_to_add)
self.assertNotIn(str(ignored_file.resolve()), coder.abs_fnames)
self.assertIn(str(regular_file.resolve()), coder.abs_fnames)
mock_io.tool_warning.assert_any_call(
f"Skipping {ignored_file.name} that matches gitignore spec."
)
def test_check_for_urls(self):
io = InputOutput(yes=True)
coder = Coder.create(self.GPT35, None, io=io)
@@ -1181,6 +1211,122 @@ This command will print 'Hello, World!' to the console."""
sanity_check_messages(coder.cur_messages)
self.assertEqual(coder.cur_messages[-1]["role"], "assistant")
def test_normalize_language(self):
coder = Coder.create(self.GPT35, None, io=InputOutput())
# Test None and empty
self.assertIsNone(coder.normalize_language(None))
self.assertIsNone(coder.normalize_language(""))
# Test "C" and "POSIX"
self.assertIsNone(coder.normalize_language("C"))
self.assertIsNone(coder.normalize_language("POSIX"))
# Test already formatted names
self.assertEqual(coder.normalize_language("English"), "English")
self.assertEqual(coder.normalize_language("French"), "French")
# Test common locale codes (fallback map, assuming babel is not installed or fails)
with patch("aider.coders.base_coder.Locale", None):
self.assertEqual(coder.normalize_language("en_US"), "English")
self.assertEqual(coder.normalize_language("fr_FR"), "French")
self.assertEqual(coder.normalize_language("es"), "Spanish")
self.assertEqual(coder.normalize_language("de_DE.UTF-8"), "German")
self.assertEqual(
coder.normalize_language("zh-CN"), "Chinese"
) # Test hyphen in fallback
self.assertEqual(coder.normalize_language("ja"), "Japanese")
self.assertEqual(
coder.normalize_language("unknown_code"), "unknown_code"
) # Fallback to original
# Test with babel.Locale mocked (available)
mock_babel_locale = MagicMock()
mock_locale_instance = MagicMock()
mock_babel_locale.parse.return_value = mock_locale_instance
with patch("aider.coders.base_coder.Locale", mock_babel_locale):
mock_locale_instance.get_display_name.return_value = "english" # For en_US
self.assertEqual(coder.normalize_language("en_US"), "English")
mock_babel_locale.parse.assert_called_with("en_US")
mock_locale_instance.get_display_name.assert_called_with("en")
mock_locale_instance.get_display_name.return_value = "french" # For fr-FR
self.assertEqual(coder.normalize_language("fr-FR"), "French") # Test with hyphen
mock_babel_locale.parse.assert_called_with("fr_FR") # Hyphen replaced
mock_locale_instance.get_display_name.assert_called_with("en")
# Test with babel.Locale raising an exception (simulating parse failure)
mock_babel_locale_error = MagicMock()
mock_babel_locale_error.parse.side_effect = Exception("Babel parse error")
with patch("aider.coders.base_coder.Locale", mock_babel_locale_error):
self.assertEqual(coder.normalize_language("en_US"), "English") # Falls back to map
def test_get_user_language(self):
io = InputOutput()
coder = Coder.create(self.GPT35, None, io=io)
# 1. Test with self.chat_language set
coder.chat_language = "fr_CA"
with patch.object(coder, "normalize_language", return_value="French Canadian") as mock_norm:
self.assertEqual(coder.get_user_language(), "French Canadian")
mock_norm.assert_called_once_with("fr_CA")
coder.chat_language = None # Reset
# 2. Test with locale.getlocale()
with patch("locale.getlocale", return_value=("en_GB", "UTF-8")) as mock_getlocale:
with patch.object(
coder, "normalize_language", return_value="British English"
) as mock_norm:
self.assertEqual(coder.get_user_language(), "British English")
mock_getlocale.assert_called_once()
mock_norm.assert_called_once_with("en_GB")
# Test with locale.getlocale() returning None or empty
with patch("locale.getlocale", return_value=(None, None)) as mock_getlocale:
with patch("os.environ.get") as mock_env_get: # Ensure env vars are not used yet
mock_env_get.return_value = None
self.assertIsNone(coder.get_user_language()) # Should be None if nothing found
# 3. Test with environment variables: LANG
with patch(
"locale.getlocale", side_effect=Exception("locale error")
): # Mock locale to fail
with patch("os.environ.get") as mock_env_get:
mock_env_get.side_effect = lambda key: "de_DE.UTF-8" if key == "LANG" else None
with patch.object(coder, "normalize_language", return_value="German") as mock_norm:
self.assertEqual(coder.get_user_language(), "German")
mock_env_get.assert_any_call("LANG")
mock_norm.assert_called_once_with("de_DE")
# Test LANGUAGE (takes precedence over LANG if both were hypothetically checked
# by os.environ.get, but our code checks in order, so we mock the first one it finds)
with patch("locale.getlocale", side_effect=Exception("locale error")):
with patch("os.environ.get") as mock_env_get:
mock_env_get.side_effect = lambda key: "es_ES" if key == "LANGUAGE" else None
with patch.object(coder, "normalize_language", return_value="Spanish") as mock_norm:
self.assertEqual(coder.get_user_language(), "Spanish")
mock_env_get.assert_any_call("LANGUAGE") # LANG would be called first
mock_norm.assert_called_once_with("es_ES")
# 4. Test priority: chat_language > locale > env
coder.chat_language = "it_IT"
with patch("locale.getlocale", return_value=("en_US", "UTF-8")) as mock_getlocale:
with patch("os.environ.get", return_value="de_DE") as mock_env_get:
with patch.object(
coder, "normalize_language", side_effect=lambda x: x.upper()
) as mock_norm:
self.assertEqual(coder.get_user_language(), "IT_IT") # From chat_language
mock_norm.assert_called_once_with("it_IT")
mock_getlocale.assert_not_called()
mock_env_get.assert_not_called()
coder.chat_language = None
# 5. Test when no language is found
with patch("locale.getlocale", side_effect=Exception("locale error")):
with patch("os.environ.get", return_value=None) as mock_env_get:
self.assertIsNone(coder.get_user_language())
def test_architect_coder_auto_accept_true(self):
with GitTemporaryDirectory():
io = InputOutput(yes=True)

Some files were not shown because too many files have changed in this diff Show More