Compare commits

...

161 Commits

Author SHA1 Message Date
Paul Gauthier
c723364ada copy 2026-04-24 21:19:04 -07:00
Paul Gauthier
308b1546a0 feat: add gpt-5.5 model settings across providers
Co-authored-by: aider (gpt-5.4) <aider@aider.chat>
2026-04-24 15:59:03 -07:00
Paul Gauthier
cd24a3a3c8 test: update model alias expectations for sonnet and opus
Co-authored-by: aider (gpt-5.4) <aider@aider.chat>
2026-04-24 11:36:37 -07:00
Paul Gauthier
0189cf4f00 copy 2026-04-23 13:15:18 -07:00
Paul Gauthier
65cb4d3568 style: Format thinking_tokens model check with multiline condition
Co-authored-by: aider (gpt-5.4) <aider@aider.chat>
2026-04-23 07:12:19 -07:00
Paul Gauthier
93dfacc85e feat: add Claude Opus 4.7 model settings for Bedrock/Vertex/OpenRouter
Co-authored-by: aider (gpt-5.4) <aider@aider.chat>
2026-04-23 07:12:17 -07:00
Paul Gauthier
39023f9bc0 fix: Disable temperature for opus-4 models and gate thinking_tokens 2026-04-23 07:12:16 -07:00
Paul Gauthier
79c45c3cd6 fix: disable deprecated temperature for Claude 4 models
Co-authored-by: aider (gpt-5.4) <aider@aider.chat>
2026-04-23 07:07:32 -07:00
Paul Gauthier
b9d877488c feat: Map opus and sonnet aliases to latest Claude models
Co-authored-by: aider (gpt-5.4) <aider@aider.chat>
2026-04-23 07:01:49 -07:00
Paul Gauthier
9ce34d179c style: simplify model name conditional in models.py
Co-authored-by: aider (gpt-5.4) <aider@aider.chat>
2026-04-23 06:59:07 -07:00
Paul Gauthier
f939d0ac94 feat: add Claude Sonnet 4.6 and Opus 4.7 model support
Co-authored-by: aider (gpt-5.4) <aider@aider.chat>
2026-04-23 06:59:03 -07:00
Paul Gauthier
928bb49c4b copy 2026-04-16 10:04:48 -07:00
Paul Gauthier
f09d70659a feat: Enable overeager mode for Claude Sonnet 4.5 models 2026-04-08 22:07:19 -07:00
Paul Gauthier
bdb4d9ff8e copy 2026-03-16 18:21:33 -07:00
Paul Gauthier
3c2a8bdafc copy 2026-03-16 18:15:49 -07:00
Paul Gauthier
c41ef3b85b feat: Add gpt-5.3 and gpt-5.4 model variants
Co-authored-by: aider (gpt-5.3-codex) <aider@aider.chat>
2026-03-16 18:15:11 -07:00
Paul Gauthier
fabdce1a03 feat: add gpt-5.3-codex model variants
Co-authored-by: aider (gpt-5.2-codex) <aider@aider.chat>
2026-03-16 18:04:01 -07:00
Paul Gauthier
5b038fd76a copy 2026-03-16 17:06:15 -07:00
Paul Gauthier
413149e9c8 fix: Remove unused import in test_exceptions.py
Co-authored-by: aider (gpt-5.2-codex) <aider@aider.chat>
2026-03-16 17:05:51 -07:00
Paul Gauthier
c3356825dd test: Fix PermissionDeniedError test with httpx objects
Co-authored-by: aider (gpt-5.2-codex) <aider@aider.chat>
2026-03-16 17:05:49 -07:00
Paul Gauthier
8955c4e9ea fix: Add missing import for PermissionDeniedError
Co-authored-by: aider (gpt-5.2-codex) <aider@aider.chat>
2026-03-16 17:05:01 -07:00
Paul Gauthier
07c526f4ec test: Add response arg to PermissionDeniedError in test
Co-authored-by: aider (gpt-5.2-codex) <aider@aider.chat>
2026-03-16 17:05:00 -07:00
Paul Gauthier
0ec5f355d7 test: Add test for PermissionDeniedError EXInfo
Co-authored-by: aider (gpt-5.2-codex) <aider@aider.chat>
2026-03-16 17:01:33 -07:00
Paul Gauthier
38716cc5a2 feat: Add ExInfo for PermissionDeniedError
Co-authored-by: aider (gpt-5.2-codex) <aider@aider.chat>
2026-03-16 17:00:37 -07:00
paul-gauthier
f8e3379864 Merge pull request #4935 from claui/fix-deprecated-models 2026-03-16 16:07:00 -07:00
Claudia Pellegrino
55164933dc fix: remove deprecated vision model from test
The model that this test uses is no longer available online. [1] [2]

Per the upstream commit, gpt-4o would be the next best candidate for
vision models, so use that instead.

[1]: https://github.com/BerriAI/litellm/pull/23400

[2]: c9f7075690
2026-03-16 22:39:35 +01:00
Claudia Pellegrino
c0839cf36f fix: remove deprecated timestamped model from test
The model that this test uses is no longer available online. [1] [2]

Per the upstream commit, claude-sonnet-4-6 is a suitable replacement
so use that instead.

[1]: https://github.com/BerriAI/litellm/pull/23400

[2]: c9f7075690
2026-03-16 22:38:01 +01:00
Claudia Pellegrino
c0ab75371b fix: remove deprecated gpt-4-32k model from test
The model that this test uses is no longer available online. [1] [2]

Per the upstream commit, the only known suitable replacement is
gpt-4-0613, which the test already uses.

Hence, remove gpt-4-32k from the test without any replacement.

[1]: https://github.com/BerriAI/litellm/pull/20795

[2]: 15075ef9ec
2026-03-16 22:31:35 +01:00
paul-gauthier
861a1e4d15 Merge pull request #4899 from turian/codex/python-3-14-support
Add Python 3.13 and 3.14 support
2026-03-09 15:00:45 -07:00
Joseph Turian
975e5a8991 Add experimental Python 3.14 support 2026-03-09 15:06:30 -04:00
Paul Gauthier
265d8a473b copy 2026-03-03 07:47:59 -08:00
Paul Gauthier
37d6ebdf76 feat: Add overeager prompt to aider/coders/ask_prompts.py 2026-03-03 07:47:37 -08:00
Paul Gauthier
ec3470cc69 feat: Add overeager: true to gpt-5.2-codex variants
Co-authored-by: aider (gpt-5.2-codex) <aider@aider.chat>
2026-03-03 07:47:05 -08:00
Paul Gauthier
f761d7276d chore: Add overeager setting to gpt-4-turbo 2026-03-03 07:47:04 -08:00
Paul Gauthier
edfe0c801b feat: Allow /ok command to accept optional arguments
Co-authored-by: aider (gpt-5.2) <aider@aider.chat>
2026-02-26 06:49:40 -08:00
Paul Gauthier
b23516061e Merge branch 'main' of github.com:Aider-AI/aider 2026-02-25 06:18:46 -08:00
Paul Gauthier
d19a9b0c56 copy 2026-02-25 06:15:10 -08:00
Paul Gauthier
4b48d82750 feat: Add /ok command as an alias for /code Ok
Co-authored-by: aider (gpt-5.2) <aider@aider.chat>
2026-02-25 06:05:11 -08:00
paul-gauthier
7afaa26f8b Merge pull request #4674 from chr15m/add-readonly-no-git 2026-02-18 18:33:10 -08:00
paul-gauthier
cf72acfbf7 Merge pull request #4682 from chr15m/no-auto-commits-staging 2026-02-18 18:31:57 -08:00
paul-gauthier
b9050e1d5f Merge pull request #4838 from clayarnoldg2m/fix/4711-symlink-loop
fix: handle symlink loops in safe_abs_path()
2026-02-16 08:26:13 -08:00
coder_3
b2bec25c2c fix: handle symlink loops in safe_abs_path() (#4711)
Path.resolve() raises RuntimeError on circular symlinks. Catch
RuntimeError and OSError, fall back to Path.absolute().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 22:39:35 +13:00
Paul Gauthier
4625ebb4b5 fix: Add verify_ssl=False to Scraper for testing 2026-02-15 16:25:27 -08:00
paul-gauthier
e6f8edda93 Merge pull request #4830 from chr15m/add-readonly-no-git-feature
Allow adding files outside repo when git commits off.
2026-02-14 06:17:11 -08:00
Chris McCormick
172df73b85 Allow adding files outside repo when git commits off. 2026-02-14 20:42:06 +08:00
Paul Gauthier
7a1bd15f0c set version to 0.86.3.dev 2026-02-11 16:42:25 -08:00
Paul Gauthier
253f0368b8 version bump to 0.86.2 2026-02-11 16:42:24 -08:00
Paul Gauthier
275c9cb926 copy 2026-02-11 15:44:15 -08:00
Paul Gauthier
11120e5c6f copy 2026-02-11 15:44:05 -08:00
Paul Gauthier
27254aa616 copy 2026-02-11 08:30:09 -08:00
Paul Gauthier
1e001bd73c fix: Update model names in test_models.py 2026-02-11 08:29:48 -08:00
Paul Gauthier
b77180711c copy 2026-02-11 07:34:31 -08:00
Paul Gauthier
750c61c6a0 bump deps 2026-02-11 07:33:32 -08:00
Paul Gauthier
0811a180cf copy 2026-02-11 07:21:09 -08:00
Paul Gauthier
463bf8023c copy 2026-02-11 07:17:19 -08:00
Paul Gauthier
fa3d7b14c0 refactor: Update flash alias to point to gemini/gemini-flash-latest
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 07:13:25 -08:00
Paul Gauthier
87c552bbee feat: Add openrouter entries for new models
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 07:01:53 -08:00
Paul Gauthier
c7912bf76a feat: Add Gemini 2.5 Flash and Flash-Lite models to settings
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 06:56:50 -08:00
Paul Gauthier
c1e0c601da feat: Add settings for new OpenAI models
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 06:54:08 -08:00
Paul Gauthier
6a3bbfd95d fix: Remove non-existent openrouter anthropic model versions
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 06:48:58 -08:00
Paul Gauthier
c50eb7512f fix: Update openrouter model version numbers to use dots
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 06:46:45 -08:00
Paul Gauthier
3aa642fec9 feat: add missing openrouter anthropic model entries
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 06:45:56 -08:00
Paul Gauthier
114057283d feat: update models.py for Claude 4.5/4.6
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 06:43:41 -08:00
Paul Gauthier
98cc418ea3 feat: Add Claude 4.5/4.6 models to model-settings.yml
Co-authored-by: aider (openai/gpt-5.2) <aider@aider.chat>
2026-02-11 06:41:17 -08:00
Paul Gauthier
a6a31c7b82 fix: Update python version in Dockerfile site-packages permissions 2026-02-11 06:32:23 -08:00
Paul Gauthier
5cb6b61047 dockerfile to 3.12 2026-02-10 19:26:46 -08:00
Paul Gauthier
22b9aec8ac reqs 2026-02-10 19:25:06 -08:00
Paul Gauthier
f8f2726b14 copy 2026-02-10 18:59:19 -08:00
Paul Gauthier
d9d5c1e233 pip-compile 2026-02-10 18:55:35 -08:00
Paul Gauthier
94bd7abd17 from #4814 2026-02-10 18:55:16 -08:00
Paul Gauthier
c1924f2c45 from #4814 2026-02-10 18:53:22 -08:00
Paul Gauthier
a8c3e7c29c copy 2026-02-10 18:46:04 -08:00
paul-gauthier
4bf56b7714 Merge pull request #4772 from markmcd/sdk-depro
Remove `google-generativeai` as a dependency.
2026-01-19 07:39:27 -08:00
Mark McDonald
d91c02c205 Remove google-generativeai as a dependency.
The `google-generativeai` package is deprecated, and emits warnings when
it's imported. I'm doing some cleanup work to remove it from popular
surfacess, so here's a PR :)

I'll note that `litellm` uses direct HTTP requests for the API, so it
does not use `google-genai` (except for type checking) or
`google-generativeai` (except for a deprecated PaLM codepath).
2026-01-16 17:54:49 +08:00
paul-gauthier
fb05748ace Merge pull request #4748 from claui/fix-litellm-exception-list-regression
Fix regression in the LiteLLM exception list
2026-01-04 11:40:30 -04:00
Claudia Pellegrino
08165c57a2 fix: exclude regular classes that end with Error
In an attempt to fix issue #4615 [1], commit 656301c [2] introduces a
regression where running the `coder` feature raises the following error:

> TypeError: catching classes that do not inherit from BaseException is not allowed

The primary misunderstanding that caused the regression is the fact that
`ErrorEventError` sounds like an error class that needs to be included
in the exceptions list. In reality, however, the name `ErrorEventError`
is just a coincidence and actually belongs to a regular class, which
doesn’t have `BaseException` in its chain of base classes.

Current Python versions raise a `TypeError` at runtime if you try to
include such a class name in an `except` clause, which explains why the
error shows up.

Narrow down the filter so it only tries to include actual exception
classes and excludes classes like `ErrorEventError`.
Also remove `ErrorEventError` from the exception list.

Fixes issue #4615 [1] and #4724 [3]. Reverts commit 656301c [2].

[1]: https://github.com/Aider-AI/aider/issues/4615

[2]: 656301cc87

[3]: https://github.com/Aider-AI/aider/issues/4724
2026-01-04 15:26:28 +01:00
Paul Gauthier
1354e0bfa4 copy 2025-12-18 10:37:28 -08:00
Paul Gauthier
2d54feaa09 chore: Update dependencies in requirements files 2025-12-18 10:37:02 -08:00
Paul Gauthier
7ef1dcd64a fix: Add ImageFetchError to aider's exceptions list
Co-authored-by: aider (gemini/gemini-3-flash-preview) <aider@aider.chat>
2025-12-18 10:34:52 -08:00
Paul Gauthier
656301cc87 fix: Add ErrorEventError to aider's exceptions list
Co-authored-by: aider (gemini/gemini-3-flash-preview) <aider@aider.chat>
2025-12-18 10:34:30 -08:00
Paul Gauthier
2c39cb68c7 fix: Add BadGatewayError to exceptions list
Co-authored-by: aider (gemini/gemini-3-flash-preview) <aider@aider.chat>
2025-12-18 10:33:52 -08:00
Paul Gauthier
7e292a2efc feat: Add gemini-3-flash-preview model entries
Co-authored-by: aider (gemini/gemini-3-flash-preview) <aider@aider.chat>
2025-12-18 10:29:33 -08:00
paul-gauthier
7301d4522d Merge pull request #4698 from codeofdusk/gpt-5.2 2025-12-11 11:28:27 -08:00
Bill Dengler
4ff959f55b Add gpt-5.2 models 2025-12-11 11:14:33 -08:00
Chris McCormick
4e77720c6f Don't stage files with no-auto-commits. 2025-11-30 15:21:00 +08:00
Chris McCormick
f73085357c Allow adding read-only files to editable with git: false. 2025-11-30 09:54:14 +08:00
Paul Gauthier
5683f1c089 bump ts 2025-11-22 11:06:46 -08:00
Paul Gauthier
3bdd49c8ab bump deps 2025-11-21 15:22:54 -08:00
Paul Gauthier
dbc7ee0d0b copy 2025-11-21 15:22:43 -08:00
Paul Gauthier
a65e0892b9 feat: Add use_temperature: false to openrouter/openai/gpt-5-pro
Co-authored-by: aider (gemini/gemini-3-pro-preview) <aider@aider.chat>
2025-11-21 15:22:14 -08:00
Paul Gauthier
7360bb5064 feat: Add use_temperature: false to gpt-5 models 2025-11-21 15:22:14 -08:00
Paul Gauthier
f626e44a0d copy 2025-11-20 20:34:03 -08:00
Paul Gauthier
90ac33cb88 copy 2025-11-20 20:33:46 -08:00
Paul Gauthier
5b0f6ce9e9 Merge branch 'main' of github.com:Aider-AI/aider 2025-11-20 11:13:35 -08:00
paul-gauthier
58eae2f94a Merge pull request #4656 from codeofdusk/new-models-20251118 2025-11-19 09:08:49 -08:00
Bill Dengler
ab29b99518 Add Gemini 3 2025-11-18 13:54:03 -08:00
Bill Dengler
a719c2848b Add gpt-5.1 2025-11-18 13:54:03 -08:00
Bill Dengler
749dee8f30 Add support for gpt-5-pro 2025-11-18 13:54:03 -08:00
paul-gauthier
c74f5efb2f Merge pull request #4621 from TimPut/repomap-haskell 2025-11-02 09:43:18 -08:00
paul-gauthier
9fbfa36c27 Merge pull request #4620 from TimPut/repomap-zig 2025-11-02 09:42:56 -08:00
timput
be8da40b1f add initial zig-tags.scm for repomap 2025-11-02 08:03:26 -07:00
timput
93f20a6d23 add initial haskell-tags.scm for repomap 2025-11-02 07:57:29 -07:00
Paul Gauthier
92de49a50d Merge branch 'main' of github.com:Aider-AI/aider 2025-10-08 06:53:50 -07:00
paul-gauthier
11516d6d6b Merge pull request #4557 from muravvv/remove_duplicated_language 2025-10-05 12:11:17 -07:00
muravvv
bfed819c19 Remove duplicate instruction in what language model should respond
the same instruction included in {final_reminders}
2025-10-05 20:54:04 +03:00
paul-gauthier
1a6d035653 Merge pull request #4552 from gcp/deepseek32-pricing 2025-10-04 05:19:09 -07:00
Gian-Carlo Pascutto
cb6a152e5e chore: update deepseek model names and metadata 2025-10-04 11:14:08 +02:00
paul-gauthier
d47d689d18 Merge pull request #4551 from gcp/deepseek32-pricing 2025-10-03 05:54:06 -07:00
Gian-Carlo Pascutto
484e47d029 chore: add deepseek model test results to leaderboard 2025-10-03 13:11:00 +02:00
Gian-Carlo Pascutto
cbb5376197 feat: update deepseek model metadata and add deepseek-reasoner 2025-10-03 11:18:37 +02:00
paul-gauthier
6963e65887 Merge pull request #4547 from mlang/gpt-5-codex 2025-09-30 06:23:28 -07:00
Mario Lang
a3bbb5ec22 Support for gpt-5-codex 2025-09-30 07:17:50 +02:00
paul-gauthier
73409a52c3 Merge pull request #4544 from zlemisie/main
Feature request: support for Bedrock/Claude 4.5
2025-09-29 12:30:06 -07:00
michal.sliwa
82a31cc7cc Feature request: support for Bedrock/Claude 4.5 #4543 2025-09-29 21:21:58 +02:00
Paul Gauthier
249e389765 copy 2025-09-29 10:51:58 -07:00
Paul Gauthier
a1214101c6 chore: Remove ethicalads.io scripts and divs 2025-09-29 10:30:01 -07:00
paul-gauthier
b2379d585f Merge pull request #4541 from khulnasoft-bot/patch-1 2025-09-29 06:15:16 -07:00
KhulnaSoft bot
39b0c25ae3 added tags for FORTRAN
Reference:
Merge commit for PR #4534
Commit: 5777ab9703
2025-09-29 11:46:56 +06:00
paul-gauthier
f8aa80396d Merge pull request #4534 from varchasgopalaswamy/main
Added tree-sitter tags for FORTRAN
2025-09-26 10:36:51 -07:00
Varchas Gopalaswamy
5777ab9703 added tags for FORTRAN 2025-09-25 19:04:44 -04:00
paul-gauthier
e4fc2f515d Merge pull request #4493 from mubashir1osmani/main 2025-09-05 07:09:23 -07:00
mubashir1osmani
60c578e2a1 added source + license 2025-09-05 02:20:09 -04:00
Paul Gauthier
b3d339a583 copy 2025-09-02 11:00:09 -07:00
Paul Gauthier
c4b06c0870 copy 2025-09-02 08:53:17 -07:00
Paul Gauthier
bd3c5df505 Merge branch 'main' of github.com:Aider-AI/aider 2025-09-02 08:52:52 -07:00
paul-gauthier
37ab5e4b56 Merge pull request #4475 from lreeves/patch-1
Add GPT-5 with all reasoning settings to polyglot leaderboard
2025-09-02 08:52:13 -07:00
mubashir1osmani
f6ad53ea8c added julia tree sitter 2025-08-31 20:05:44 -04:00
Luke Reeves
54b266f289 Update polyglot_leaderboard.yml with medium and low reasoning 2025-08-25 10:52:12 -04:00
Luke Reeves
bfef1906bb Update polyglot_leaderboard.yml
add GPT-5 with high reasoning
2025-08-23 13:11:56 -04:00
Paul Gauthier
ad19c7b5aa bump deps 2025-08-16 14:06:32 -07:00
Paul Gauthier
32faf82b31 chore: Update base image to python:3.10-slim-bookworm
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-08-13 10:17:40 -07:00
Paul Gauthier
59250e070e set version to 0.86.2.dev 2025-08-13 08:46:02 -07:00
Paul Gauthier
b8b521f143 version bump to 0.86.1 2025-08-13 08:46:00 -07:00
Paul Gauthier
07e25599e9 copy 2025-08-13 08:44:21 -07:00
Paul Gauthier
2b98a9ecf0 copy 2025-08-13 08:43:58 -07:00
Paul Gauthier
450a535548 feat: Add reasoning_effort setting to gpt-5 models
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-08-12 18:23:38 -07:00
Paul Gauthier
5761b087b5 refactor: Remove unused ad styles from head_custom.html 2025-08-12 06:36:43 -07:00
Paul Gauthier
da45632087 fix: Adjust ad placement for narrow screens
Co-authored-by: aider (gpt-5) <aider@aider.chat>
2025-08-11 12:37:40 -07:00
Paul Gauthier
0a88f7ce34 feat: Add EthicalAds script and ad placement
Co-authored-by: aider (gpt-5) <aider@aider.chat>
2025-08-11 12:14:42 -07:00
Paul Gauthier
9fda5c93cc chore: Update polyglot leaderboard model name and command 2025-08-11 09:45:20 -07:00
paul-gauthier
2f5bb772b5 Merge pull request #4412 from Oct4Pie/bench/gpt-oss-120b-high
Add test results for gpt-oss-120b (high) to polyglot leaderboard
2025-08-11 12:44:38 -04:00
Paul Gauthier
5a3b2f34b6 feat: Add flash-lite model alias 2025-08-09 13:44:27 -04:00
Paul Gauthier
a7d3fdc23b copy 2025-08-09 12:59:45 -03:00
Paul Gauthier
0862128d36 copy 2025-08-09 12:56:55 -03:00
Paul Gauthier
01a9b88df1 set version to 0.86.1.dev 2025-08-09 12:55:11 -03:00
Paul Gauthier
a4be6ccd87 version bump to 0.86.0 2025-08-09 12:54:51 -03:00
Paul Gauthier
4cd71acebe copy 2025-08-09 12:35:59 -03:00
Paul Gauthier
3d8290cdef copy 2025-08-09 12:29:10 -03:00
Paul Gauthier
b782437918 copy 2025-08-09 12:22:31 -03:00
Paul Gauthier
f3d5f20ad7 blame 2025-08-09 11:23:25 -03:00
Paul Gauthier
f57c0f624a feat: blame: Detect aider commits using co-authored-by
Co-authored-by: aider (gpt-5) <aider@aider.chat>
2025-08-09 09:55:52 -03:00
Paul Gauthier
071d177309 feat: Add OpenAI and OpenRouter GPT-5 model settings
Co-authored-by: aider (gpt-5) <aider@aider.chat>
2025-08-09 09:53:34 -03:00
Paul Gauthier
4e7c9f2fcd fix: Remove editor settings from models using gpt-5 nano weak model
Co-authored-by: aider (gpt-5) <aider@aider.chat>
2025-08-08 10:24:33 -03:00
Paul Gauthier
a14cb222c0 feat: Add GPT-5 model family settings
Co-authored-by: aider (gpt-5) <aider@aider.chat>
2025-08-08 09:37:44 -03:00
Paul Gauthier
3b919646a5 set version to 0.85.6.dev 2025-08-07 17:54:56 -03:00
Paul Gauthier
9702b1c199 version bump to 0.85.5 2025-08-07 17:54:54 -03:00
Paul Gauthier
7440a01015 copy 2025-08-07 17:10:47 -03:00
Paul Gauthier
3a6f217dcd feat: Add reasoning_effort setting support for GPT-5 models 2025-08-07 17:04:44 -03:00
Paul Gauthier
ceb81369ea feat: Enforce diff edit format for GPT-5 models 2025-08-07 17:03:10 -03:00
Paul Gauthier
ad49e56b24 fix: Accurately match gpt-5 and gpt-5-2025-08-07 models
Co-authored-by: aider (gpt-5) <aider@aider.chat>
2025-08-07 16:58:47 -03:00
oct4pie
ac40a4c5cb add test results for gpt-oss-120b (high) to polyglot leaderboard 2025-08-05 23:33:06 -07:00
68 changed files with 5964 additions and 2547 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,38 @@
# Release history
### main branch
- Added support for Claude 4.5/4.6 models and updated model aliases (sonnet/haiku/opus).
- Expanded Gemini model support with 2.5 Flash and FlashLite, added Gemini 3 preview models, and updated the flash alias to gemini/gemini-flash-latest.
- Added DeepSeek Reasoner model and updated DeepSeek model metadata with costs and prompt caching.
- Added BadGatewayError and ImageFetchError to handled exceptions.
- Fixed exception mapping to only include real exception classes, avoiding runtime errors, by Claudia Pellegrino.
- Repo map now tags Fortran, Haskell, Julia, and Zig and is compatible with newer tree-sitter Python APIs, by Varchas Gopalaswamy, Tim Put, and Mubashir Osmani.
- Removed deprecated google-generativeai dependency to eliminate import warnings, by Mark McDonald.
- Added settings for new OpenAI GPT5.1/5.2 and GPT5pro models across OpenAI, Azure, and OpenRouter, including chat and codex variants.
- Changed the gemini alias to point to gemini/gemini-3-pro-preview.
- Added support for OpenAI o1-pro model.
- Added support for GPT5.3/5.4 model variants across OpenAI, Azure, and OpenRouter, plus GPT4.1nano.
- Added `/ok` as a shortcut for asking aider to go ahead with the proposed changes, with optional extra instructions.
- When auto-commits are disabled, aider can add files outside the git repo and promote read-only files to editable, by Chris McCormick.
- Fixed crashes caused by circular symlink loops when resolving paths, by coder_3.
- Aider wrote 62% of the code in this release.
### Aider v0.86.1
- Added a reasoning_effort setting for GPT-5 models and disabled temperature by default for the GPT-5 family.
### Aider v0.86.0
- Expanded GPT-5 model support across family variants and providers (OpenAI, Azure, OpenRouter), including dated and chat/mini/nano variants.
- Aider wrote 88% of the code in this release.
### Aider v0.85.5
- Enforced diff edit format for GPT-5 models.
- Added support for the reasoning_effort setting for GPT-5 models.
- Fixed model detection to correctly apply GPT-5 settings to versioned names (gpt-5 and gpt-5-2025-08-07).
### Aider v0.85.4
- Added support for openai/gpt-5

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-3.0M-2ecc71?style=flat-square&labelColor=555555"/></a>
src="https://img.shields.io/badge/📦%20Installs-6.8M-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-21%25-e74c3c?style=flat-square&labelColor=555555"/></a>
src="https://img.shields.io/badge/🔄%20Singularity-88%25-e74c3c?style=flat-square&labelColor=555555"/></a>
<!--[[[end]]]-->
</p>

View File

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

View File

@@ -9,6 +9,12 @@ Answer questions about the supplied code.
Always reply to the user in {language}.
If you need to describe code changes, do so *briefly*.
"""
overeager_prompt = """Do not return fully detailed code or full diffs.
Describe the needed changes or give a plan.
Providing code snippets or pseudo-code is fine,
if it helps explain the plan or the needed changes.
"""
example_messages = []

View File

@@ -2216,7 +2216,7 @@ class Coder:
# Seems unlikely that we needed to create the file, but it was
# actually already part of the repo.
# But let's only add if we need to, just to be safe.
if need_to_add:
if need_to_add and self.auto_commits:
self.repo.repo.git.add(full_path)
self.abs_fnames.add(full_path)
@@ -2230,7 +2230,7 @@ class Coder:
self.io.tool_output(f"Skipping edits to {path}")
return
if need_to_add:
if need_to_add and self.auto_commits:
self.repo.repo.git.add(full_path)
self.abs_fnames.add(full_path)

View File

@@ -12,8 +12,6 @@ Respect and use existing conventions, libraries, etc that are already present in
Take requests for changes to the supplied code.
If the request is ambiguous, ask questions.
Always reply to the user in {language}.
Once you understand the request you MUST:
1. Decide if you need to propose *SEARCH/REPLACE* edits to any files that haven't been added to the chat. You can create new files without asking!

View File

@@ -15,8 +15,6 @@ Respect and use existing conventions, libraries, etc that are already present in
Take requests for changes to the supplied code.
If the request is ambiguous, ask questions.
Always reply to the user in {language}.
Once you understand the request you MUST:
1. Decide if you need to propose edits to any files that haven't been added to the chat. You can create new files without asking!

View File

@@ -13,8 +13,6 @@ Respect and use existing conventions, libraries, etc that are already present in
Take requests for changes to the supplied code.
If the request is ambiguous, ask questions.
Always reply to the user in {language}.
For each file that needs to be changed, write out the changes similar to a unified diff like `diff -U0` would produce.
"""

View File

@@ -7,9 +7,6 @@ class WholeFilePrompts(CoderPrompts):
main_system = """Act as an expert software developer.
Take requests for changes to the supplied code.
If the request is ambiguous, ask questions.
Always reply to the user in {language}.
{final_reminders}
Once you understand the request you MUST:
1. Determine if any code changes are needed.

View File

@@ -846,7 +846,11 @@ class Commands:
for matched_file in sorted(all_matched_files):
abs_file_path = self.coder.abs_root_path(matched_file)
if not abs_file_path.startswith(self.coder.root) and not is_image_file(matched_file):
if (
not abs_file_path.startswith(self.coder.root)
and not is_image_file(matched_file)
and self.coder.auto_commits
):
self.io.tool_error(
f"Can not add {abs_file_path}, which is not within {self.coder.root}"
)
@@ -864,7 +868,13 @@ class Commands:
self.io.tool_error(f"{matched_file} is already in the chat as an editable file")
continue
elif abs_file_path in self.coder.abs_read_only_fnames:
if self.coder.repo and self.coder.repo.path_in_repo(matched_file):
# Determine if file can be promoted to editable
if self.coder.repo:
can_edit = self.coder.repo.path_in_repo(matched_file)
else:
can_edit = abs_file_path.startswith(self.coder.root)
if can_edit:
self.coder.abs_read_only_fnames.remove(abs_file_path)
self.coder.abs_fnames.add(abs_file_path)
self.io.tool_output(
@@ -1185,6 +1195,14 @@ class Commands:
"""Enter context mode to see surrounding code context. If no prompt provided, switches to context mode.""" # noqa
return self._generic_chat_command(args, "context", placeholder=args.strip() or None)
def cmd_ok(self, args):
"Alias for `/code Ok, please go ahead and make those changes.` (any args are appended)"
msg = "Ok, please go ahead and make those changes."
extra = (args or "").strip()
if extra:
msg = f"{msg} {extra}"
return self.cmd_code(msg)
def _generic_chat_command(self, args, edit_format, placeholder=None):
if not args.strip():
# Switch to the corresponding chat mode if no args provided

View File

@@ -20,6 +20,7 @@ EXCEPTIONS = [
"The API provider is not able to authenticate you. Check your API key.",
),
ExInfo("AzureOpenAIError", True, None),
ExInfo("BadGatewayError", True, "The API provider's servers are down or overloaded."),
ExInfo("BadRequestError", False, None),
ExInfo("BudgetExceededError", True, None),
ExInfo(
@@ -28,10 +29,16 @@ EXCEPTIONS = [
"The API provider has refused the request due to a safety policy about the content.",
),
ExInfo("ContextWindowExceededError", False, None), # special case handled in base_coder
ExInfo("ImageFetchError", False, "The API provider was unable to fetch one or more images."),
ExInfo("InternalServerError", True, "The API provider's servers are down or overloaded."),
ExInfo("InvalidRequestError", True, None),
ExInfo("JSONSchemaValidationError", True, None),
ExInfo("NotFoundError", False, None),
ExInfo(
"PermissionDeniedError",
False,
"Permission was denied. Check your API key and/or credentials.",
),
ExInfo("OpenAIError", True, None),
ExInfo(
"RateLimitError",
@@ -61,7 +68,10 @@ class LiteLLMExceptions:
import litellm
for var in dir(litellm):
if var.endswith("Error"):
# Filter by BaseException because instances of non-exception classes cannot be caught.
# `litellm.ErrorEventError` is an example of a regular class which just happens to end
# with `Error`.
if var.endswith("Error") and issubclass(getattr(litellm, var), BaseException):
if var not in self.exception_info:
raise ValueError(f"{var} is in litellm but not in aider's exceptions list")
@@ -77,10 +87,6 @@ class LiteLLMExceptions:
import litellm
if ex.__class__ is litellm.APIConnectionError:
if "google.auth" in str(ex):
return ExInfo(
"APIConnectionError", False, "You need to: pip install google-generativeai"
)
if "boto3" in str(ex):
return ExInfo("APIConnectionError", False, "You need to: pip install boto3")
if "OpenrouterException" in str(ex) and "'choices'" in str(ex):

View File

@@ -52,6 +52,9 @@ gpt-4-vision-preview
gpt-4-1106-vision-preview
gpt-4o-mini
gpt-4o-mini-2024-07-18
gpt-5.5
gpt-5.5-pro
gpt-5.5-chat-latest
gpt-3.5-turbo
gpt-3.5-turbo-0301
gpt-3.5-turbo-0613
@@ -74,6 +77,13 @@ claude-3-5-sonnet-20240620
claude-3-5-sonnet-20241022
claude-sonnet-4-20250514
claude-opus-4-20250514
claude-opus-4-6
claude-opus-4-7
claude-sonnet-4-5
claude-sonnet-4-5-20250929
claude-sonnet-4-6
claude-haiku-4-5
claude-haiku-4-5-20251001
"""
ANTHROPIC_MODELS = [ln.strip() for ln in ANTHROPIC_MODELS.splitlines() if ln.strip()]
@@ -81,9 +91,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-sonnet-4-20250514",
"haiku": "claude-3-5-haiku-20241022",
"opus": "claude-opus-4-20250514",
"sonnet": "claude-sonnet-4-6",
"haiku": "claude-haiku-4-5",
"opus": "claude-opus-4-7",
# GPT models
"4": "gpt-4-0613",
"4o": "gpt-4o",
@@ -93,11 +103,13 @@ MODEL_ALIASES = {
"3": "gpt-3.5-turbo",
# Other models
"deepseek": "deepseek/deepseek-chat",
"flash": "gemini/gemini-2.5-flash",
"flash": "gemini/gemini-flash-latest",
"flash-lite": "gemini/gemini-2.5-flash-lite",
"quasar": "openrouter/openrouter/quasar-alpha",
"r1": "deepseek/deepseek-reasoner",
"gemini-2.5-pro": "gemini/gemini-2.5-pro",
"gemini": "gemini/gemini-2.5-pro",
"gemini-3-pro-preview": "gemini/gemini-3-pro-preview",
"gemini": "gemini/gemini-3-pro-preview",
"gemini-exp": "gemini/gemini-2.5-pro-exp-03-25",
"grok3": "xai/grok-3-beta",
"optimus": "openrouter/openrouter/optimus-alpha",
@@ -406,7 +418,11 @@ class Model(ModelSettings):
if self.name.startswith("openrouter/"):
if self.accepts_settings is None:
self.accepts_settings = []
if "thinking_tokens" not in self.accepts_settings:
if (
"thinking_tokens" not in self.accepts_settings
and "claude-opus-4.7" not in self.name
and "claude-opus-4-7" not in self.name
):
self.accepts_settings.append("thinking_tokens")
if "reasoning_effort" not in self.accepts_settings:
self.accepts_settings.append("reasoning_effort")
@@ -436,8 +452,12 @@ class Model(ModelSettings):
self.examples_as_sys_msg = False
return # <--
if "gpt-5" in model:
last_segment = model.split("/")[-1]
if last_segment in ("gpt-5", "gpt-5-2025-08-07"):
self.use_temperature = False
self.edit_format = "diff"
if "reasoning_effort" not in self.accepts_settings:
self.accepts_settings.append("reasoning_effort")
return # <--
if "/o1-mini" in model:
@@ -501,6 +521,20 @@ class Model(ModelSettings):
self.reminder = "sys"
return # <--
if "sonnet-4-" in model or "opus-4-" in model or "haiku-4-" in model:
self.edit_format = "diff"
self.use_repo_map = True
self.examples_as_sys_msg = False
if "opus-4-" in model:
self.use_temperature = False
if (
"thinking_tokens" not in self.accepts_settings
and "4.7" not in model
and "4-7" not in model
):
self.accepts_settings.append("thinking_tokens")
return # <--
if "3-7-sonnet" in model:
self.edit_format = "diff"
self.use_repo_map = True

View File

@@ -21,3 +21,4 @@ tree-sitter language implementations:
* [https://github.com/tree-sitter/tree-sitter-ruby](https://github.com/tree-sitter/tree-sitter-ruby) — licensed under the MIT License.
* [https://github.com/tree-sitter/tree-sitter-rust](https://github.com/tree-sitter/tree-sitter-rust) — licensed under the MIT License.
* [https://github.com/tree-sitter/tree-sitter-typescript](https://github.com/tree-sitter/tree-sitter-typescript) — licensed under the MIT License.
* [https://github.com/starelmanma/tree-sitter-fortran](https://github.com/starelmanma/tree-sitter-fortran) — licensed under the MIT License.

View File

@@ -0,0 +1,15 @@
;; derived from: https://github.com/stadelmanma/tree-sitter-fortran
;; License: MIT
(module_statement
(name) @name.definition.class) @definition.class
(function_statement
name: (name) @name.definition.function) @definition.function
(subroutine_statement
name: (name) @name.definition.function) @definition.function
(module_procedure_statement
name: (name) @name.definition.function) @definition.function

View File

@@ -0,0 +1,3 @@
(function (variable) @name.definition.function)
(bind (variable) @name.definition.function)
(signature (variable) @name.definition.type)

View File

@@ -0,0 +1,60 @@
;; derived from: https://github.com/tree-sitter/tree-sitter-julia
;; License: MIT
(module
name: (identifier) @name.definition.module) @definition.module
(module
name: (scoped_identifier) @name.definition.module) @definition.module
(struct_definition
name: (type_identifier) @name.definition.class) @definition.class
(mutable_struct_definition
name: (type_identifier) @name.definition.class) @definition.class
(abstract_type_declaration
name: (type_identifier) @name.definition.class) @definition.class
(constant_assignment
left: (identifier) @name.definition.class) @definition.class
(function_definition
name: (identifier) @name.definition.function) @definition.function
(function_definition
name: (scoped_identifier) @name.definition.function) @definition.function
(assignment
left: (call_expression
function: (identifier) @name.definition.function)) @definition.function
(method_definition
name: (identifier) @name.definition.method) @definition.method
(macro_definition
name: (identifier) @name.definition.macro) @definition.macro
(macro_call
name: (identifier) @name.reference.call) @reference.call
(call_expression
function: (identifier) @name.reference.call) @reference.call
(call_expression
function: (scoped_identifier) @name.reference.call) @reference.call
(type_expression
name: (type_identifier) @name.reference.type) @reference.type
(constant_assignment
left: (identifier) @name.definition.constant) @definition.constant
(export_statement
(identifier) @name.reference.export) @reference.export
(using_statement
(identifier) @name.reference.module) @reference.module
(import_statement
(identifier) @name.reference.module) @reference.module

View File

@@ -0,0 +1,3 @@
(FnProto) @name.definition.function
(VarDecl "const" @name.definition.constant)
(VarDecl "var" @name.definition.variable)

View File

@@ -571,7 +571,8 @@ class GitRepo:
return
tracked_files = set(self.get_tracked_files())
return self.normalize_path(path) in tracked_files
normalized = self.normalize_path(path)
return normalized in tracked_files
def abs_root_path(self, path):
res = Path(self.root) / path

View File

@@ -16,6 +16,7 @@ from grep_ast import TreeContext, filename_to_lang
from pygments.lexers import guess_lexer_for_filename
from pygments.token import Token
from tqdm import tqdm
from tree_sitter import Query
from aider.dump import dump
from aider.special import filter_important_files
@@ -262,6 +263,19 @@ class RepoMap:
return data
def _run_captures(self, query: Query, node):
# tree-sitter 0.23.2's python bindings had captures directly on the Query object
# but 0.24.0 moved it to a separate QueryCursor class. Support both.
if hasattr(query, "captures"):
# Old API
return query.captures(node)
# New API
from tree_sitter import QueryCursor
cursor = QueryCursor(query)
return cursor.captures(node)
def get_tags_raw(self, fname, rel_fname):
lang = filename_to_lang(fname)
if not lang:
@@ -285,17 +299,22 @@ class RepoMap:
tree = parser.parse(bytes(code, "utf-8"))
# Run the tags queries
query = language.query(query_scm)
captures = query.captures(tree.root_node)
captures = self._run_captures(Query(language, query_scm), tree.root_node)
captures_by_tag = defaultdict(list)
matches = []
for tag, nodes in captures.items():
for node in nodes:
captures_by_tag[tag].append(node)
captures_by_tag[tag].append(node)
matches.append((node, tag))
if USING_TSL_PACK:
all_nodes = [(node, tag) for tag, nodes in captures_by_tag.items() for node in nodes]
else:
all_nodes = matches
saw = set()
if USING_TSL_PACK:
all_nodes = []
for tag, nodes in captures.items():
all_nodes += [(node, tag) for node in nodes]
else:
all_nodes = list(captures)
for node, tag in all_nodes:
if tag.startswith("name.definition."):
kind = "def"

View File

@@ -1,16 +1,32 @@
{
"deepseek-reasoner": {
"max_tokens": 8192,
"max_input_tokens": 64000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.00000055,
"input_cost_per_token_cache_hit": 0.00000014,
"cache_read_input_token_cost": 0.00000014,
"deepseek/deepseek-reasoner": {
"max_tokens": 64000,
"max_input_tokens": 128000,
"max_output_tokens": 64000,
"input_cost_per_token": 0.00000028,
"input_cost_per_token_cache_hit": 0.000000028,
"cache_read_input_token_cost": 0.000000028,
"cache_creation_input_token_cost": 0.0,
"output_cost_per_token": 0.00000219,
"output_cost_per_token": 0.00000042,
"litellm_provider": "deepseek",
"mode": "chat",
//"supports_function_calling": true,
//"supports_function_calling": true,
"supports_assistant_prefill": true,
"supports_tool_choice": false,
"supports_prompt_caching": true
},
"deepseek/deepseek-chat": {
"max_tokens": 8192,
"max_input_tokens": 128000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.00000028,
"input_cost_per_token_cache_hit": 0.000000028,
"cache_read_input_token_cost": 0.000000028,
"cache_creation_input_token_cost": 0.0,
"output_cost_per_token": 0.00000042,
"litellm_provider": "deepseek",
"mode": "chat",
//"supports_function_calling": true,
"supports_assistant_prefill": true,
//"supports_tool_choice": true,
"supports_prompt_caching": true

File diff suppressed because it is too large Load Diff

View File

@@ -95,7 +95,10 @@ def is_image_file(file_name):
def safe_abs_path(res):
"Gives an abs path, which safely returns a full (not 8.3) windows path"
res = Path(res).resolve()
try:
res = Path(res).resolve()
except (RuntimeError, OSError):
res = Path(res).absolute()
return str(res)

View File

@@ -24,6 +24,39 @@ cog.out(text)
]]]-->
### main branch
- Added support for Claude 4.5/4.6 models and updated model aliases (sonnet/haiku/opus).
- Expanded Gemini model support with 2.5 Flash and FlashLite, added Gemini 3 preview models, and updated the flash alias to gemini/gemini-flash-latest.
- Added DeepSeek Reasoner model and updated DeepSeek model metadata with costs and prompt caching.
- Added BadGatewayError and ImageFetchError to handled exceptions.
- Fixed exception mapping to only include real exception classes, avoiding runtime errors, by Claudia Pellegrino.
- Repo map now tags Fortran, Haskell, Julia, and Zig and is compatible with newer tree-sitter Python APIs, by Varchas Gopalaswamy, Tim Put, and Mubashir Osmani.
- Removed deprecated google-generativeai dependency to eliminate import warnings, by Mark McDonald.
- Added settings for new OpenAI GPT5.1/5.2 and GPT5pro models across OpenAI, Azure, and OpenRouter, including chat and codex variants.
- Changed the gemini alias to point to gemini/gemini-3-pro-preview.
- Added support for OpenAI o1-pro model.
- Added support for GPT5.3/5.4 model variants across OpenAI, Azure, and OpenRouter, plus GPT4.1nano.
- Added `/ok` as a shortcut for asking aider to go ahead with the proposed changes, with optional extra instructions.
- When auto-commits are disabled, aider can add files outside the git repo and promote read-only files to editable, by Chris McCormick.
- Fixed crashes caused by circular symlink loops when resolving paths, by coder_3.
- Aider wrote 62% of the code in this release.
### Aider v0.86.1
- Added a reasoning_effort setting for GPT-5 models and disabled temperature by default for the GPT-5 family.
### Aider v0.86.0
- Expanded GPT-5 model support across family variants and providers (OpenAI, Azure, OpenRouter), including dated and chat/mini/nano variants.
- Aider wrote 88% of the code in this release.
### Aider v0.85.5
- Enforced diff edit format for GPT-5 models.
- Added support for the reasoning_effort setting for GPT-5 models.
- Fixed model detection to correctly apply GPT-5 settings to versioned names (gpt-5 and gpt-5-2025-08-07).
### Aider v0.85.4
- Added support for openai/gpt-5

File diff suppressed because it is too large Load Diff

View File

@@ -1682,4 +1682,175 @@
date: 2025-07-17
versions: 0.85.3.dev
seconds_per_case: 67.6
total_cost: 1.2357
total_cost: 1.2357
- dirname: 2025-08-06-04-54-48--gpt-oss-120b-high-polyglot
test_cases: 225
model: gpt-oss-120b (high)
edit_format: diff
commit_hash: 1af0e59
pass_rate_1: 13.8
pass_rate_2: 41.8
pass_num_1: 31
pass_num_2: 94
percent_cases_well_formed: 79.1
error_outputs: 95
num_malformed_responses: 77
num_with_malformed_responses: 47
user_asks: 142
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 3123768
completion_tokens: 856495
test_timeouts: 4
total_tests: 225
command: aider --model openrouter/openai/gpt-oss-120b --reasoning-effort high
date: 2025-08-06
versions: 0.85.3.dev
seconds_per_case: 35.5
total_cost: 0.7406
- dirname: 2025-08-23-15-47-21--gpt-5-high
test_cases: 225
model: gpt-5 (high)
edit_format: diff
commit_hash: 32faf82
reasoning_effort: high
pass_rate_1: 52.0
pass_rate_2: 88.0
pass_num_1: 117
pass_num_2: 198
percent_cases_well_formed: 91.6
error_outputs: 23
num_malformed_responses: 22
num_with_malformed_responses: 19
user_asks: 96
lazy_comments: 3
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2675561
completion_tokens: 2623429
test_timeouts: 3
total_tests: 225
command: aider --model openai/gpt-5
date: 2025-08-23
versions: 0.86.2.dev
seconds_per_case: 194.0
total_cost: 29.0829
- dirname: 2025-08-25-13-23-27--gpt-5-medium
test_cases: 225
model: gpt-5 (medium)
edit_format: diff
commit_hash: 32faf82
reasoning_effort: medium
pass_rate_1: 49.8
pass_rate_2: 86.7
pass_num_1: 112
pass_num_2: 195
percent_cases_well_formed: 88.4
error_outputs: 40
num_malformed_responses: 40
num_with_malformed_responses: 26
user_asks: 102
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2827261
completion_tokens: 1468799
test_timeouts: 0
total_tests: 225
command: aider --model openai/gpt-5
date: 2025-08-25
versions: 0.86.2.dev
seconds_per_case: 118.7
total_cost: 17.6930
- dirname: 2025-08-25-14-16-37--gpt-5-low
test_cases: 225
model: gpt-5 (low)
edit_format: diff
commit_hash: 32faf82
reasoning_effort: low
pass_rate_1: 43.1
pass_rate_2: 81.3
pass_num_1: 97
pass_num_2: 183
percent_cases_well_formed: 86.7
error_outputs: 46
num_malformed_responses: 46
num_with_malformed_responses: 30
user_asks: 113
lazy_comments: 1
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
prompt_tokens: 2534059
completion_tokens: 779568
test_timeouts: 1
total_tests: 225
command: aider --model openai/gpt-5
date: 2025-08-25
versions: 0.86.2.dev
seconds_per_case: 62.4
total_cost: 10.3713
- dirname: 2025-10-03-09-45-34--deepseek-v3.2-reasoner
test_cases: 225
model: DeepSeek-V3.2-Exp (Reasoner)
edit_format: diff
commit_hash: cbb5376
pass_rate_1: 39.6
pass_rate_2: 74.2
pass_num_1: 89
pass_num_2: 167
percent_cases_well_formed: 97.3
error_outputs: 8
num_malformed_responses: 6
num_with_malformed_responses: 6
user_asks: 67
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
prompt_tokens: 2191446
completion_tokens: 1645129
test_timeouts: 1
total_tests: 225
command: aider --model deepseek/deepseek-reasoner
date: 2025-10-03
versions: 0.86.2.dev
seconds_per_case: 291.2
total_cost: 1.3045
- dirname: 2025-10-03-09-21-36--deepseek-v3.2-chat
test_cases: 225
model: DeepSeek-V3.2-Exp (Chat)
edit_format: diff
commit_hash: cbb5376
pass_rate_1: 38.7
pass_rate_2: 70.2
pass_num_1: 87
pass_num_2: 158
percent_cases_well_formed: 98.2
error_outputs: 6
num_malformed_responses: 4
num_with_malformed_responses: 4
user_asks: 60
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
prompt_tokens: 2266868
completion_tokens: 573477
test_timeouts: 4
total_tests: 225
command: aider --model deepseek/deepseek-chat
date: 2025-10-03
versions: 0.86.2.dev
seconds_per_case: 104.0
total_cost: 0.8756

View File

@@ -32,6 +32,11 @@
.side-bar {
background: linear-gradient(135deg, #ffffff 0%, rgba(20, 176, 20, 0.01) 25%, rgba(20, 176, 20, 0.04) 40%, rgba(220, 230, 255, 0.4) 60%, rgba(205, 218, 255, 0.4) 80%, #F5F6FA 100%);
}
@media (max-width: 50em) {
.ea-ad--sidebar { display: none; }
.ea-ad--mobile { display: block; }
}
</style>
<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="{{ site.url }}/feed.xml">
<link rel="preconnect" href="https://fonts.gstatic.com">

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -79,17 +79,19 @@ 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
- `gemini`: gemini/gemini-2.5-pro
- `flash`: gemini/gemini-flash-latest
- `flash-lite`: gemini/gemini-2.5-flash-lite
- `gemini`: gemini/gemini-3-pro-preview
- `gemini-2.5-pro`: gemini/gemini-2.5-pro
- `gemini-3-pro-preview`: gemini/gemini-3-pro-preview
- `gemini-exp`: gemini/gemini-2.5-pro-exp-03-25
- `grok3`: xai/grok-3-beta
- `haiku`: claude-3-5-haiku-20241022
- `haiku`: claude-haiku-4-5
- `optimus`: openrouter/openrouter/optimus-alpha
- `opus`: claude-opus-4-20250514
- `opus`: claude-opus-4-7
- `quasar`: openrouter/openrouter/quasar-alpha
- `r1`: deepseek/deepseek-reasoner
- `sonnet`: anthropic/claude-sonnet-4-20250514
- `sonnet`: claude-sonnet-4-6
<!--[[[end]]]-->
## Priority

View File

@@ -264,20 +264,18 @@ 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</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>
<tr><td>openai/gpt-5.2</td><td class='right'>982,120</td><td class='right'>39.2%</td></tr>
<tr><td>gpt-5.4</td><td class='right'>775,412</td><td class='right'>31.0%</td></tr>
<tr><td>gemini/gemini-3-flash-preview</td><td class='right'>241,516</td><td class='right'>9.6%</td></tr>
<tr><td>gpt-5.2-codex</td><td class='right'>166,945</td><td class='right'>6.7%</td></tr>
<tr><td>gpt-5.2</td><td class='right'>93,248</td><td class='right'>3.7%</td></tr>
<tr><td>gemini/gemini-3-pro-preview</td><td class='right'>81,851</td><td class='right'>3.3%</td></tr>
<tr><td>gpt-5.3-codex</td><td class='right'>64,402</td><td class='right'>2.6%</td></tr>
<tr><td>gemini/gemini-2.5-pro</td><td class='right'>58,916</td><td class='right'>2.4%</td></tr>
<tr><td>gpt-5</td><td class='right'>39,467</td><td class='right'>1.6%</td></tr>
<tr><td>openai/gpt-5.4</td><td class='right'>278</td><td class='right'>0.0%</td></tr>
<tr><td>openai/gpt-5.5</td><td class='right'>89</td><td class='right'>0.0%</td></tr>
</table>
{: .note :}
Some models show as REDACTED, because they are new or unpopular models.
Aider's analytics only records the names of "well known" LLMs.
<!--[[[end]]]-->
## How are the "aider wrote xx% of code" stats computed?

View File

@@ -110,11 +110,11 @@ cog.out(get_supported_languages_md())
| fennel | .fnl | | ✓ |
| firrtl | .fir | | ✓ |
| fish | .fish | | ✓ |
| fortran | .f | | ✓ |
| fortran | .f03 | | ✓ |
| fortran | .f08 | | ✓ |
| fortran | .f90 | | ✓ |
| fortran | .f95 | | ✓ |
| fortran | .f | | ✓ |
| fortran | .f03 | | ✓ |
| fortran | .f08 | | ✓ |
| fortran | .f90 | | ✓ |
| fortran | .f95 | | ✓ |
| func | .fc | | ✓ |
| gdscript | .gd | | ✓ |
| gitattributes | .gitattributes | | ✓ |
@@ -133,7 +133,7 @@ cog.out(get_supported_languages_md())
| gstlaunch | .launch | | ✓ |
| hack | .hack | | ✓ |
| hare | .ha | | ✓ |
| haskell | .hs | | ✓ |
| haskell | .hs | | ✓ |
| haxe | .hx | | ✓ |
| hcl | .hcl | ✓ | ✓ |
| hcl | .tf | ✓ | ✓ |
@@ -153,7 +153,7 @@ cog.out(get_supported_languages_md())
| json | .json | | ✓ |
| jsonnet | .jsonnet | | ✓ |
| jsonnet | .libsonnet | | ✓ |
| julia | .jl | | ✓ |
| julia | .jl | | ✓ |
| kconfig | Kconfig | | ✓ |
| kdl | .kdl | | ✓ |
| kotlin | .kt | ✓ | ✓ |
@@ -257,7 +257,7 @@ cog.out(get_supported_languages_md())
| xml | .xml | | ✓ |
| xml | .xsl | | ✓ |
| yuck | .yuck | | ✓ |
| zig | .zig | | ✓ |
| zig | .zig | | ✓ |
<!--[[[end]]]-->

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.')}")
]]]-->
August 07, 2025.
November 20, 2025.
<!--[[[end]]]-->
</p>

View File

@@ -35,15 +35,3 @@ aider --model gemini-exp
aider --list-models gemini/
```
You may need to install the `google-generativeai` package.
```bash
# If you installed with aider-install or `uv tool`
uv tool run --from aider-chat pip install google-generativeai
# Or with pipx...
pipx inject aider-chat google-generativeai
# Or with pip
pip install -U google-generativeai
```

View File

@@ -59,16 +59,20 @@ cog.out(''.join(lines))
- ALEPHALPHA_API_KEY
- ANTHROPIC_API_KEY
- ANYSCALE_API_KEY
- ARK_API_KEY
- AZURE_AI_API_KEY
- AZURE_API_KEY
- AZURE_OPENAI_API_KEY
- BASETEN_API_KEY
- BYTEZ_API_KEY
- CEREBRAS_API_KEY
- CLARIFAI_API_KEY
- CLOUDFLARE_API_KEY
- CO_API_KEY
- CODESTRAL_API_KEY
- COHERE_API_KEY
- COMPACTIFAI_API_KEY
- DASHSCOPE_API_KEY
- DATABRICKS_API_KEY
- DEEPINFRA_API_KEY
- DEEPSEEK_API_KEY
@@ -77,11 +81,13 @@ cog.out(''.join(lines))
- FIREWORKS_API_KEY
- FIREWORKSAI_API_KEY
- GEMINI_API_KEY
- GOOGLE_API_KEY
- GROQ_API_KEY
- HUGGINGFACE_API_KEY
- INFINITY_API_KEY
- MARITALK_API_KEY
- MISTRAL_API_KEY
- MOONSHOT_API_KEY
- NEBIUS_API_KEY
- NLP_CLOUD_API_KEY
- NOVITA_API_KEY
@@ -91,14 +97,19 @@ cog.out(''.join(lines))
- OPENAI_LIKE_API_KEY
- OPENROUTER_API_KEY
- OR_API_KEY
- OVHCLOUD_API_KEY
- PALM_API_KEY
- PERPLEXITYAI_API_KEY
- PREDIBASE_API_KEY
- PROVIDER_API_KEY
- REPLICATE_API_KEY
- SAMBANOVA_API_KEY
- TOGETHERAI_API_KEY
- USER_API_KEY
- VERCEL_AI_GATEWAY_API_KEY
- VOLCENGINE_API_KEY
- VOYAGE_API_KEY
- WANDB_API_KEY
- WATSONX_API_KEY
- WX_API_KEY
- XAI_API_KEY

View File

@@ -57,61 +57,126 @@ 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-20240620-v1:0
- anthropic.claude-3-7-sonnet-20250219-v1:0
- anthropic.claude-haiku-4-5-20251001-v1:0
- anthropic.claude-haiku-4-5@20251001
- anthropic.claude-opus-4-1-20250805-v1:0
- anthropic.claude-opus-4-20250514-v1:0
- anthropic.claude-opus-4-5-20251101-v1:0
- anthropic.claude-sonnet-4-20250514-v1:0
- anthropic.claude-sonnet-4-5-20250929-v1:0
- anthropic.claude-sonnet-4-6
- apac.anthropic.claude-3-5-sonnet-20241022-v2:0
- apac.anthropic.claude-haiku-4-5-20251001-v1:0
- apac.anthropic.claude-sonnet-4-20250514-v1:0
- au.anthropic.claude-haiku-4-5-20251001-v1:0
- au.anthropic.claude-sonnet-4-5-20250929-v1:0
- au.anthropic.claude-sonnet-4-6
- azure_ai/claude-haiku-4-5
- azure_ai/claude-opus-4-1
- azure_ai/claude-opus-4-5
- azure_ai/claude-sonnet-4-5
- azure_ai/claude-sonnet-4-6
- azure_ai/deepseek-v3.2
- azure_ai/deepseek-v3.2-speciale
- azure_ai/mistral-medium-2505
- claude-3-5-haiku-20241022
- claude-3-5-haiku-latest
- claude-3-5-sonnet-20240620
- claude-3-5-sonnet-20241022
- claude-3-5-sonnet-latest
- bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0
- bedrock/us-gov-east-1/anthropic.claude-sonnet-4-5-20250929-v1:0
- bedrock/us-gov-east-1/claude-sonnet-4-5-20250929-v1:0
- bedrock/us-gov-west-1/anthropic.claude-3-7-sonnet-20250219-v1:0
- bedrock/us-gov-west-1/anthropic.claude-haiku-4-5-20251001-v1:0
- bedrock/us-gov-west-1/anthropic.claude-sonnet-4-5-20250929-v1:0
- bedrock/us-gov-west-1/claude-sonnet-4-5-20250929-v1:0
- bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0
- claude-3-7-sonnet-20250219
- claude-3-7-sonnet-latest
- claude-3-haiku-20240307
- claude-3-opus-20240229
- claude-3-opus-latest
- claude-4-opus-20250514
- claude-4-sonnet-20250514
- claude-haiku-4-5
- claude-haiku-4-5-20251001
- claude-opus-4-1
- claude-opus-4-1-20250805
- claude-opus-4-20250514
- claude-opus-4-5
- claude-opus-4-5-20251101
- claude-sonnet-4-20250514
- claude-sonnet-4-5
- claude-sonnet-4-5-20250929
- claude-sonnet-4-5-20250929-v1:0
- claude-sonnet-4-6
- codestral/codestral-2405
- codestral/codestral-latest
- databricks/databricks-claude-3-7-sonnet
- databricks/databricks-claude-haiku-4-5
- databricks/databricks-claude-opus-4
- databricks/databricks-claude-opus-4-1
- databricks/databricks-claude-opus-4-5
- databricks/databricks-claude-sonnet-4
- databricks/databricks-claude-sonnet-4-1
- databricks/databricks-claude-sonnet-4-5
- deepseek-v3-2-251201
- deepseek/deepseek-chat
- deepseek/deepseek-coder
- deepseek/deepseek-r1
- deepseek/deepseek-reasoner
- deepseek/deepseek-v3
- deepseek/deepseek-v3.2
- 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-haiku-4-5-20251001-v1:0
- eu.anthropic.claude-opus-4-1-20250805-v1:0
- eu.anthropic.claude-opus-4-20250514-v1:0
- eu.anthropic.claude-opus-4-5-20251101-v1:0
- eu.anthropic.claude-sonnet-4-20250514-v1:0
- eu.anthropic.claude-sonnet-4-5-20250929-v1:0
- eu.anthropic.claude-sonnet-4-6
- glm-4-7-251222
- global.anthropic.claude-haiku-4-5-20251001-v1:0
- global.anthropic.claude-opus-4-5-20251101-v1:0
- global.anthropic.claude-sonnet-4-20250514-v1:0
- global.anthropic.claude-sonnet-4-5-20250929-v1:0
- global.anthropic.claude-sonnet-4-6
- jp.anthropic.claude-haiku-4-5-20251001-v1:0
- jp.anthropic.claude-sonnet-4-5-20250929-v1:0
- kimi-k2-thinking-251104
- mistral/codestral-2405
- mistral/codestral-2508
- mistral/codestral-latest
- mistral/codestral-mamba-latest
- mistral/devstral-2512
- mistral/devstral-latest
- mistral/devstral-medium-2507
- mistral/devstral-medium-latest
- mistral/devstral-small-2505
- mistral/devstral-small-2507
- mistral/devstral-small-latest
- mistral/labs-devstral-small-2512
- mistral/magistral-medium-1-2-2509
- mistral/magistral-medium-2506
- mistral/magistral-medium-2509
- mistral/magistral-medium-latest
- mistral/magistral-small-1-2-2509
- mistral/magistral-small-2506
- mistral/magistral-small-latest
- mistral/ministral-3-14b-2512
- mistral/ministral-3-3b-2512
- mistral/ministral-3-8b-2512
- mistral/mistral-large-2402
- mistral/mistral-large-2407
- mistral/mistral-large-2411
- mistral/mistral-large-2512
- mistral/mistral-large-3
- mistral/mistral-large-latest
- mistral/mistral-medium
- mistral/mistral-medium-2312
- mistral/mistral-medium-2505
- mistral/mistral-medium-3-1-2508
- mistral/mistral-medium-latest
- mistral/mistral-small
- mistral/mistral-small-3-2-2506
- mistral/mistral-small-latest
- mistral/mistral-tiny
- mistral/open-codestral-mamba
@@ -125,20 +190,44 @@ cog.out(model_list)
- mistral/pixtral-large-latest
- openrouter/anthropic/claude-3.5-sonnet
- openrouter/anthropic/claude-3.7-sonnet
- openrouter/anthropic/claude-haiku-4.5
- openrouter/anthropic/claude-opus-4
- openrouter/anthropic/claude-opus-4.1
- openrouter/anthropic/claude-opus-4.5
- openrouter/anthropic/claude-opus-4.6
- openrouter/anthropic/claude-sonnet-4
- openrouter/anthropic/claude-sonnet-4.5
- openrouter/anthropic/claude-sonnet-4.6
- openrouter/deepseek/deepseek-chat-v3.1
- openrouter/deepseek/deepseek-r1
- openrouter/deepseek/deepseek-r1-0528
- openrouter/deepseek/deepseek-v3.2
- openrouter/deepseek/deepseek-v3.2-exp
- openrouter/z-ai/glm-4.7
- us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0
- 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-haiku-4-5-20251001-v1:0
- us.anthropic.claude-opus-4-1-20250805-v1:0
- us.anthropic.claude-opus-4-20250514-v1:0
- us.anthropic.claude-opus-4-5-20251101-v1:0
- us.anthropic.claude-sonnet-4-20250514-v1:0
- us.anthropic.claude-sonnet-4-5-20250929-v1:0
- us.anthropic.claude-sonnet-4-6
- vercel_ai_gateway/anthropic/claude-3-5-sonnet
- vercel_ai_gateway/anthropic/claude-3-5-sonnet-20241022
- vercel_ai_gateway/anthropic/claude-3-7-sonnet
- vercel_ai_gateway/anthropic/claude-haiku-4.5
- vercel_ai_gateway/anthropic/claude-opus-4
- vercel_ai_gateway/anthropic/claude-opus-4.1
- vercel_ai_gateway/anthropic/claude-opus-4.5
- vercel_ai_gateway/anthropic/claude-opus-4.6
- vercel_ai_gateway/anthropic/claude-sonnet-4
- vercel_ai_gateway/anthropic/claude-sonnet-4.5
- vertex_ai/claude-3-5-haiku
- vertex_ai/claude-3-5-haiku@20241022
- vertex_ai/claude-3-5-sonnet
- vertex_ai/claude-3-5-sonnet-v2
- vertex_ai/claude-3-5-sonnet-v2@20241022
- vertex_ai/claude-3-5-sonnet@20240620
- vertex_ai/claude-3-7-sonnet@20250219
- vertex_ai/claude-3-haiku
@@ -147,12 +236,23 @@ cog.out(model_list)
- vertex_ai/claude-3-opus@20240229
- vertex_ai/claude-3-sonnet
- vertex_ai/claude-3-sonnet@20240229
- vertex_ai/claude-haiku-4-5
- vertex_ai/claude-haiku-4-5@20251001
- vertex_ai/claude-opus-4
- vertex_ai/claude-opus-4-1
- vertex_ai/claude-opus-4-1@20250805
- vertex_ai/claude-opus-4-5
- vertex_ai/claude-opus-4-5@20251101
- vertex_ai/claude-opus-4@20250514
- vertex_ai/claude-sonnet-4
- vertex_ai/claude-sonnet-4-5
- vertex_ai/claude-sonnet-4-5@20250929
- vertex_ai/claude-sonnet-4-6
- vertex_ai/claude-sonnet-4-6@default
- vertex_ai/claude-sonnet-4@20250514
- vertex_ai/deepseek-ai/deepseek-r1-0528-maas
- vertex_ai/deepseek-ai/deepseek-v3.1-maas
- vertex_ai/deepseek-ai/deepseek-v3.2-maas
<!--[[[end]]]-->

View File

@@ -47,6 +47,7 @@ cog.out(get_help_md())
| **/model** | Switch the Main Model to a new LLM |
| **/models** | Search the list of available models |
| **/multiline-mode** | Toggle multiline mode (swaps behavior of Enter and Meta+Enter) |
| **/ok** | Alias for `/code Ok, please go ahead and make those changes.` (any args are appended) |
| **/paste** | Paste image/text from the clipboard into the chat. Optionally provide a name for the image. |
| **/quit** | Exit the application |
| **/read-only** | Add files to the chat that are for reference only, or turn added files to read-only |

View File

@@ -69,23 +69,19 @@ 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">36K</span>
<span class="badge-value">44K</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">3.0M</span>
<span class="badge-value">6.8M</span>
</a>
<div class="github-badge badge-tokens" title="Number of tokens processed weekly by Aider users">
<span class="badge-label">📈 Tokens/week</span>
<span class="badge-value">15B</span>
</div>
<a href="https://openrouter.ai/#options-menu" class="github-badge badge-router" title="Aider's ranking among applications on the OpenRouter platform">
<span class="badge-label">🏆 OpenRouter</span>
<span class="badge-value">Top 20</span>
</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">21%</span>
<span class="badge-value">88%</span>
</a>
<!--[[[end]]]-->
</div>

View File

@@ -1,4 +1,4 @@
FROM python:3.10-slim AS base
FROM python:3.12-slim-bookworm AS base
# Install system dependencies
RUN apt-get update && \
@@ -48,7 +48,7 @@ RUN /venv/bin/python -m pip install --upgrade --no-cache-dir pip && \
RUN /venv/bin/python -m playwright install --with-deps chromium
# Fix site-packages permissions
RUN find /venv/lib/python3.10/site-packages \( -type d -exec chmod a+rwx {} + \) -o \( -type f -exec chmod a+rw {} + \)
RUN find /venv/lib/python3.12/site-packages \( -type d -exec chmod a+rwx {} + \) -o \( -type f -exec chmod a+rw {} + \)
# Switch to appuser
USER appuser
@@ -72,7 +72,7 @@ RUN /venv/bin/python -m pip install --upgrade --no-cache-dir pip && \
RUN /venv/bin/python -m playwright install --with-deps chromium
# Fix site-packages permissions
RUN find /venv/lib/python3.10/site-packages \( -type d -exec chmod a+rwx {} + \) -o \( -type f -exec chmod a+rw {} + \)
RUN find /venv/lib/python3.12/site-packages \( -type d -exec chmod a+rwx {} + \) -o \( -type f -exec chmod a+rw {} + \)
# Switch to appuser
USER appuser

View File

@@ -12,10 +12,12 @@ classifiers = [
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python",
"Topic :: Software Development",
]
requires-python = ">=3.10,<3.13"
requires-python = ">=3.10,<3.15"
dynamic = ["dependencies", "optional-dependencies", "version"]
[project.urls]

View File

@@ -4,7 +4,7 @@ aiohappyeyeballs==2.6.1
# via
# -c requirements/common-constraints.txt
# aiohttp
aiohttp==3.12.15
aiohttp==3.13.3
# via
# -c requirements/common-constraints.txt
# litellm
@@ -12,17 +12,27 @@ aiosignal==1.4.0
# via
# -c requirements/common-constraints.txt
# aiohttp
annotated-doc==0.0.4
# via
# -c requirements/common-constraints.txt
# fastapi
# typer
annotated-types==0.7.0
# via
# -c requirements/common-constraints.txt
# pydantic
anyio==4.10.0
anyio==4.12.1
# via
# -c requirements/common-constraints.txt
# httpx
# openai
# starlette
# watchfiles
attrs==25.3.0
asgiref==3.11.1
# via
# -c requirements/common-constraints.txt
# mixpanel
attrs==25.4.0
# via
# -c requirements/common-constraints.txt
# aiohttp
@@ -33,34 +43,31 @@ backoff==2.2.1
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
# posthog
beautifulsoup4==4.13.4
beautifulsoup4==4.14.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
cachetools==5.5.2
# via
# -c requirements/common-constraints.txt
# google-auth
certifi==2025.8.3
certifi==2026.2.25
# via
# -c requirements/common-constraints.txt
# httpcore
# httpx
# requests
cffi==1.17.1
cffi==2.0.0
# via
# -c requirements/common-constraints.txt
# sounddevice
# soundfile
charset-normalizer==3.4.2
charset-normalizer==3.4.6
# via
# -c requirements/common-constraints.txt
# requests
click==8.2.1
click==8.3.1
# via
# -c requirements/common-constraints.txt
# litellm
configargparse==1.7.1
# typer
configargparse==1.7.5
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -77,7 +84,15 @@ distro==1.9.0
# -c requirements/common-constraints.txt
# openai
# posthog
filelock==3.18.0
fastapi==0.135.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
fastuuid==0.14.0
# via
# -c requirements/common-constraints.txt
# litellm
filelock==3.25.2
# via
# -c requirements/common-constraints.txt
# huggingface-hub
@@ -85,12 +100,12 @@ flake8==7.3.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
frozenlist==1.7.0
frozenlist==1.8.0
# via
# -c requirements/common-constraints.txt
# aiohttp
# aiosignal
fsspec==2025.7.0
fsspec==2026.2.0
# via
# -c requirements/common-constraints.txt
# huggingface-hub
@@ -98,63 +113,19 @@ gitdb==4.0.12
# via
# -c requirements/common-constraints.txt
# gitpython
gitpython==3.1.45
gitpython==3.1.46
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
google-ai-generativelanguage==0.6.15
# via
# -c requirements/common-constraints.txt
# google-generativeai
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.178.0
# via
# -c requirements/common-constraints.txt
# google-generativeai
google-auth==2.40.3
# via
# -c requirements/common-constraints.txt
# google-ai-generativelanguage
# google-api-core
# google-api-python-client
# google-auth-httplib2
# google-generativeai
google-auth-httplib2==0.2.0
# via
# -c requirements/common-constraints.txt
# google-api-python-client
google-generativeai==0.8.5
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
googleapis-common-protos==1.70.0
# via
# -c requirements/common-constraints.txt
# google-api-core
# grpcio-status
grep-ast==0.9.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
grpcio==1.74.0
# via
# -c requirements/common-constraints.txt
# google-api-core
# grpcio-status
grpcio-status==1.71.2
# via
# -c requirements/common-constraints.txt
# google-api-core
h11==0.16.0
# via
# -c requirements/common-constraints.txt
# httpcore
hf-xet==1.1.7
hf-xet==1.4.2
# via
# -c requirements/common-constraints.txt
# huggingface-hub
@@ -162,21 +133,18 @@ httpcore==1.0.9
# via
# -c requirements/common-constraints.txt
# httpx
httplib2==0.22.0
# via
# -c requirements/common-constraints.txt
# google-api-python-client
# google-auth-httplib2
httpx==0.28.1
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# litellm
# mixpanel
# openai
huggingface-hub==0.34.3
huggingface-hub==1.7.1
# via
# -c requirements/common-constraints.txt
# tokenizers
idna==3.10
idna==3.11
# via
# -c requirements/common-constraints.txt
# anyio
@@ -196,32 +164,32 @@ jinja2==3.1.6
# via
# -c requirements/common-constraints.txt
# litellm
jiter==0.10.0
jiter==0.13.0
# via
# -c requirements/common-constraints.txt
# openai
json5==0.12.0
json5==0.13.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
jsonschema==4.25.0
jsonschema==4.26.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
# litellm
jsonschema-specifications==2025.4.1
jsonschema-specifications==2025.9.1
# via
# -c requirements/common-constraints.txt
# jsonschema
litellm==1.75.0
litellm==1.82.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
markdown-it-py==3.0.0
markdown-it-py==4.0.0
# via
# -c requirements/common-constraints.txt
# rich
markupsafe==3.0.2
markupsafe==3.0.3
# via
# -c requirements/common-constraints.txt
# jinja2
@@ -233,7 +201,7 @@ mdurl==0.1.2
# via
# -c requirements/common-constraints.txt
# markdown-it-py
mixpanel==4.10.1
mixpanel==5.0.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -241,7 +209,7 @@ mslex==1.3.0
# via
# -c requirements/common-constraints.txt
# oslex
multidict==6.6.3
multidict==6.7.1
# via
# -c requirements/common-constraints.txt
# aiohttp
@@ -250,25 +218,29 @@ networkx==3.4.2
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
numpy==1.26.4
# via
# -c requirements/common-constraints.txt
# -r requirements/python-compat.in
# scipy
# soundfile
openai==1.99.1
openai==2.28.0
# via
# -c requirements/common-constraints.txt
# litellm
orjson==3.11.7
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
oslex==0.1.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
packaging==25.0
packaging==26.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
# huggingface-hub
pathspec==0.12.1
pathspec==1.0.4
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -277,38 +249,24 @@ pexpect==4.9.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
pillow==11.3.0
pillow==12.1.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
posthog==6.4.1
posthog==7.9.12
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
prompt-toolkit==3.0.51
prompt-toolkit==3.0.52
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
propcache==0.3.2
propcache==0.4.1
# via
# -c requirements/common-constraints.txt
# aiohttp
# yarl
proto-plus==1.26.1
# via
# -c requirements/common-constraints.txt
# google-ai-generativelanguage
# google-api-core
protobuf==5.29.5
# via
# -c requirements/common-constraints.txt
# google-ai-generativelanguage
# google-api-core
# google-generativeai
# googleapis-common-protos
# grpcio-status
# proto-plus
psutil==7.0.0
psutil==7.2.2
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -316,30 +274,22 @@ ptyprocess==0.7.0
# via
# -c requirements/common-constraints.txt
# pexpect
pyasn1==0.6.1
# via
# -c requirements/common-constraints.txt
# pyasn1-modules
# rsa
pyasn1-modules==0.4.2
# via
# -c requirements/common-constraints.txt
# google-auth
pycodestyle==2.14.0
# via
# -c requirements/common-constraints.txt
# flake8
pycparser==2.22
pycparser==3.0
# via
# -c requirements/common-constraints.txt
# cffi
pydantic==2.11.7
pydantic==2.12.5
# via
# -c requirements/common-constraints.txt
# google-generativeai
# fastapi
# litellm
# mixpanel
# openai
pydantic-core==2.33.2
pydantic-core==2.41.5
# via
# -c requirements/common-constraints.txt
# pydantic
@@ -355,15 +305,11 @@ pygments==2.19.2
# via
# -c requirements/common-constraints.txt
# rich
pypandoc==1.15
pypandoc==1.17
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
pyparsing==3.2.3
# via
# -c requirements/common-constraints.txt
# httplib2
pyperclip==1.9.0
pyperclip==1.11.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -371,73 +317,69 @@ python-dateutil==2.9.0.post0
# via
# -c requirements/common-constraints.txt
# posthog
python-dotenv==1.1.1
python-dotenv==1.2.2
# via
# -c requirements/common-constraints.txt
# litellm
pyyaml==6.0.2
pyyaml==6.0.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
# huggingface-hub
referencing==0.36.2
referencing==0.37.0
# via
# -c requirements/common-constraints.txt
# jsonschema
# jsonschema-specifications
regex==2025.7.34
regex==2026.2.28
# via
# -c requirements/common-constraints.txt
# tiktoken
requests==2.32.4
requests==2.32.5
# via
# -c requirements/common-constraints.txt
# google-api-core
# huggingface-hub
# mixpanel
# posthog
# tiktoken
rich==14.1.0
rich==14.3.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
rpds-py==0.27.0
# typer
rpds-py==0.30.0
# via
# -c requirements/common-constraints.txt
# jsonschema
# referencing
rsa==4.9.1
# via
# -c requirements/common-constraints.txt
# google-auth
scipy==1.15.3
# -r requirements/python-compat.in
shellingham==1.5.4
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
shtab==1.7.2
# typer
shtab==1.8.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
six==1.17.0
# via
# -c requirements/common-constraints.txt
# mixpanel
# posthog
# python-dateutil
smmap==5.0.2
smmap==5.0.3
# via
# -c requirements/common-constraints.txt
# gitdb
sniffio==1.3.1
# via
# -c requirements/common-constraints.txt
# anyio
# openai
socksio==1.0.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
sounddevice==0.5.2
sounddevice==0.5.5
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
@@ -445,22 +387,25 @@ soundfile==0.13.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
soupsieve==2.7
soupsieve==2.8.3
# via
# -c requirements/common-constraints.txt
# beautifulsoup4
tiktoken==0.10.0
starlette==0.52.1
# via
# -c requirements/common-constraints.txt
# fastapi
tiktoken==0.12.0
# via
# -c requirements/common-constraints.txt
# litellm
tokenizers==0.21.4
tokenizers==0.22.2
# via
# -c requirements/common-constraints.txt
# litellm
tqdm==4.67.1
tqdm==4.67.3
# via
# -c requirements/common-constraints.txt
# google-generativeai
# huggingface-hub
# openai
# via
@@ -470,54 +415,55 @@ tree-sitter-c-sharp==0.23.1
# via
# -c requirements/common-constraints.txt
# tree-sitter-language-pack
tree-sitter-embedded-template==0.23.2
tree-sitter-embedded-template==0.25.0
# via
# -c requirements/common-constraints.txt
# tree-sitter-language-pack
tree-sitter-language-pack==0.9.0
tree-sitter-language-pack==0.13.0
# via
# -c requirements/common-constraints.txt
# grep-ast
tree-sitter-yaml==0.7.1
tree-sitter-yaml==0.7.2
# via
# -c requirements/common-constraints.txt
# tree-sitter-language-pack
typing-extensions==4.14.1
typer==0.24.1
# via
# -c requirements/common-constraints.txt
# huggingface-hub
typing-extensions==4.15.0
# via
# -c requirements/common-constraints.txt
# aiosignal
# anyio
# beautifulsoup4
# google-generativeai
# fastapi
# huggingface-hub
# openai
# posthog
# pydantic
# pydantic-core
# referencing
# starlette
# typing-inspection
typing-inspection==0.4.1
typing-inspection==0.4.2
# via
# -c requirements/common-constraints.txt
# fastapi
# pydantic
uritemplate==4.2.0
urllib3==2.6.3
# via
# -c requirements/common-constraints.txt
# google-api-python-client
urllib3==2.5.0
# via
# -c requirements/common-constraints.txt
# mixpanel
# requests
watchfiles==1.1.0
watchfiles==1.1.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements.in
wcwidth==0.2.13
wcwidth==0.6.0
# via
# -c requirements/common-constraints.txt
# prompt-toolkit
yarl==1.20.1
yarl==1.23.0
# via
# -c requirements/common-constraints.txt
# aiohttp
@@ -527,4 +473,17 @@ zipp==3.23.0
# importlib-metadata
tree-sitter==0.23.2; python_version < "3.10"
tree-sitter==0.24.0; python_version >= "3.10"
tree-sitter==0.25.2; python_version >= "3.10"
# NumPy 2.x adds Python 3.14 wheels, but dropped Python 3.10.
numpy<2; python_version < "3.11"
numpy>=2.3,<2.5; python_version >= "3.11"
# This is the one networkx dependency that we need.
# Including it here explicitly because we
# didn't specify networkx[default] above.
#
# SciPy 1.16+ adds Python 3.14 wheels, but dropped Python 3.10.
scipy<1.16; python_version < "3.11"
scipy>=1.16.1,<1.18; python_version >= "3.11"
# Remove if Python 3.13+ support lands in pydub upstream.
audioop-lts>=0.2.2; python_version >= "3.13"

View File

@@ -2,25 +2,31 @@
# 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.12.15
aiohttp==3.13.3
# via
# huggingface-hub
# litellm
# llama-index-core
aiosignal==1.4.0
# via aiohttp
aiosqlite==0.21.0
aiosqlite==0.22.1
# via llama-index-core
altair==5.5.0
altair==6.0.0
# via streamlit
annotated-doc==0.0.4
# via
# fastapi
# typer
annotated-types==0.7.0
# via pydantic
anyio==4.10.0
anyio==4.12.1
# via
# httpx
# openai
# starlette
# watchfiles
attrs==25.3.0
asgiref==3.11.1
# via mixpanel
attrs==25.4.0
# via
# aiohttp
# jsonschema
@@ -29,63 +35,64 @@ backoff==2.2.1
# via
# -r requirements/requirements.in
# posthog
banks==2.2.0
banks==2.4.1
# via llama-index-core
beautifulsoup4==4.13.4
beautifulsoup4==4.14.3
# via -r requirements/requirements.in
blinker==1.9.0
# via streamlit
build==1.3.0
build==1.4.0
# via pip-tools
cachetools==5.5.2
# via
# google-auth
# streamlit
certifi==2025.8.3
cachetools==7.0.5
# via streamlit
certifi==2026.2.25
# via
# httpcore
# httpx
# requests
cffi==1.17.1
cffi==2.0.0
# via
# cryptography
# sounddevice
# soundfile
cfgv==3.4.0
cfgv==3.5.0
# via pre-commit
charset-normalizer==3.4.2
charset-normalizer==3.4.6
# via requests
click==8.2.1
click==8.3.1
# via
# litellm
# nltk
# pip-tools
# streamlit
# typer
codespell==2.4.1
codespell==2.4.2
# via -r requirements/requirements-dev.in
cogapp==3.5.1
cogapp==3.6.0
# via -r requirements/requirements-dev.in
colorama==0.4.6
# via griffe
configargparse==1.7.1
# via griffecli
configargparse==1.7.5
# via -r requirements/requirements.in
contourpy==1.3.3
# via matplotlib
# via
# -r requirements/requirements-dev.in
# matplotlib
coverage[toml]==7.13.4
# via pytest-cov
cryptography==46.0.5
# via google-auth
cycler==0.12.1
# via matplotlib
dataclasses-json==0.6.7
# via llama-index-core
deprecated==1.2.18
deprecated==1.3.1
# via
# banks
# llama-index-core
# llama-index-instrumentation
diff-match-patch==20241021
# via -r requirements/requirements.in
dill==0.4.0
# via
# multiprocess
# pathos
dirtyjson==1.0.8
# via llama-index-core
diskcache==5.6.3
@@ -96,107 +103,102 @@ distro==1.9.0
# via
# openai
# posthog
filelock==3.18.0
fastapi==0.135.1
# via -r requirements/requirements.in
fastuuid==0.14.0
# via litellm
filelock==3.25.2
# via
# huggingface-hub
# python-discovery
# torch
# transformers
# virtualenv
filetype==1.2.0
# via llama-index-core
# via
# banks
# llama-index-core
flake8==7.3.0
# via -r requirements/requirements.in
fonttools==4.59.0
fonttools==4.62.1
# via matplotlib
frozenlist==1.7.0
frozenlist==1.8.0
# via
# aiohttp
# aiosignal
fsspec==2025.7.0
fsspec==2026.2.0
# via
# huggingface-hub
# llama-index-core
# torch
gitdb==4.0.12
# via gitpython
gitpython==3.1.45
gitpython==3.1.46
# via
# -r requirements/requirements.in
# streamlit
google-ai-generativelanguage==0.6.15
# via google-generativeai
google-api-core[grpc]==2.25.1
google-api-core[grpc]==2.30.0
# via
# google-ai-generativelanguage
# google-api-python-client
# google-cloud-bigquery
# google-cloud-core
# google-generativeai
google-api-python-client==2.178.0
# via google-generativeai
google-auth==2.40.3
google-auth==2.49.1
# via
# google-ai-generativelanguage
# google-api-core
# google-api-python-client
# google-auth-httplib2
# google-cloud-bigquery
# google-cloud-core
# google-generativeai
google-auth-httplib2==0.2.0
# via google-api-python-client
google-cloud-bigquery==3.35.1
google-cloud-bigquery==3.40.1
# via -r requirements/requirements-dev.in
google-cloud-core==2.4.3
google-cloud-core==2.5.0
# via google-cloud-bigquery
google-crc32c==1.7.1
google-crc32c==1.8.0
# via google-resumable-media
google-generativeai==0.8.5
# via -r requirements/requirements.in
google-resumable-media==2.7.2
google-resumable-media==2.8.0
# via google-cloud-bigquery
googleapis-common-protos==1.70.0
googleapis-common-protos==1.73.0
# via
# google-api-core
# grpcio-status
greenlet==3.2.3
greenlet==3.3.2
# via
# playwright
# sqlalchemy
grep-ast==0.9.0
# via -r requirements/requirements.in
griffe==1.10.0
griffe==2.0.0
# via banks
grpcio==1.74.0
griffecli==2.0.0
# via griffe
griffelib==2.0.0
# via
# griffe
# griffecli
grpcio==1.78.0
# via
# google-api-core
# grpcio-status
grpcio-status==1.71.2
grpcio-status==1.78.0
# via google-api-core
h11==0.16.0
# via httpcore
hf-xet==1.1.7
hf-xet==1.4.2
# via huggingface-hub
httpcore==1.0.9
# via httpx
httplib2==0.22.0
# via
# google-api-python-client
# google-auth-httplib2
httpx==0.28.1
# via
# huggingface-hub
# litellm
# llama-index-core
# mixpanel
# openai
huggingface-hub[inference]==0.34.3
huggingface-hub[inference]==1.7.1
# via
# llama-index-embeddings-huggingface
# sentence-transformers
# tokenizers
# transformers
identify==2.6.12
identify==2.6.18
# via pre-commit
idna==3.10
idna==3.11
# via
# anyio
# httpx
@@ -210,7 +212,7 @@ importlib-metadata==7.2.1
# litellm
importlib-resources==6.5.2
# via -r requirements/requirements.in
iniconfig==2.1.0
iniconfig==2.3.0
# via pytest
jinja2==3.1.6
# via
@@ -219,62 +221,60 @@ jinja2==3.1.6
# litellm
# pydeck
# torch
jiter==0.10.0
jiter==0.13.0
# via openai
joblib==1.5.1
joblib==1.5.3
# via
# nltk
# scikit-learn
json5==0.12.0
json5==0.13.0
# via -r requirements/requirements.in
jsonschema==4.25.0
jsonschema==4.26.0
# via
# -r requirements/requirements.in
# altair
# litellm
jsonschema-specifications==2025.4.1
jsonschema-specifications==2025.9.1
# via jsonschema
kiwisolver==1.4.8
kiwisolver==1.5.0
# via matplotlib
litellm==1.75.0
litellm==1.82.3
# via -r requirements/requirements.in
llama-index-core==0.13.0
llama-index-core==0.14.18
# via llama-index-embeddings-huggingface
llama-index-embeddings-huggingface==0.6.0
llama-index-embeddings-huggingface==0.7.0
# via -r requirements/requirements-help.in
llama-index-instrumentation==0.4.0
llama-index-instrumentation==0.5.0
# via llama-index-workflows
llama-index-workflows==1.3.0
llama-index-workflows==2.16.1
# via llama-index-core
lox==0.13.0
lox==1.0.0
# via -r requirements/requirements-dev.in
markdown-it-py==3.0.0
markdown-it-py==4.0.0
# via rich
markupsafe==3.0.2
markupsafe==3.0.3
# via jinja2
marshmallow==3.26.1
marshmallow==3.26.2
# via dataclasses-json
matplotlib==3.10.5
matplotlib==3.10.8
# via -r requirements/requirements-dev.in
mccabe==0.7.0
# via flake8
mdurl==0.1.2
# via markdown-it-py
mixpanel==4.10.1
mixpanel==5.0.0
# via -r requirements/requirements.in
mpmath==1.3.0
# via sympy
mslex==1.3.0
# via oslex
multidict==6.6.3
multidict==6.7.1
# via
# aiohttp
# yarl
multiprocess==0.70.18
# via pathos
mypy-extensions==1.1.0
# via typing-inspect
narwhals==2.0.1
narwhals==2.18.0
# via altair
nest-asyncio==1.6.0
# via llama-index-core
@@ -283,12 +283,13 @@ networkx==3.4.2
# -r requirements/requirements.in
# llama-index-core
# torch
nltk==3.9.1
nltk==3.9.3
# via llama-index-core
nodeenv==1.9.1
nodeenv==1.10.0
# via pre-commit
numpy==1.26.4
numpy==2.4.3
# via
# -r requirements/python-compat.in
# -r requirements/requirements-help.in
# contourpy
# llama-index-core
@@ -297,14 +298,17 @@ numpy==1.26.4
# pydeck
# scikit-learn
# scipy
# sentence-transformers
# soundfile
# streamlit
# transformers
openai==1.99.1
openai==2.28.0
# via litellm
orjson==3.11.7
# via -r requirements/requirements.in
oslex==0.1.3
# via -r requirements/requirements.in
packaging==25.0
packaging==26.0
# via
# -r requirements/requirements.in
# altair
@@ -316,97 +320,89 @@ packaging==25.0
# pytest
# streamlit
# transformers
pandas==2.3.1
# wheel
pandas==2.3.3
# via
# -r requirements/requirements-dev.in
# streamlit
pathos==0.3.4
# via lox
pathspec==0.12.1
pathspec==1.0.4
# via
# -r requirements/requirements.in
# grep-ast
pexpect==4.9.0
# via -r requirements/requirements.in
pillow==11.3.0
pillow==12.1.1
# via
# -r requirements/requirements.in
# llama-index-core
# matplotlib
# sentence-transformers
# streamlit
pip==25.2
pip==26.0.1
# via pip-tools
pip-tools==7.5.0
pip-tools==7.5.3
# via -r requirements/requirements-dev.in
platformdirs==4.3.8
platformdirs==4.9.4
# via
# banks
# llama-index-core
# python-discovery
# virtualenv
playwright==1.54.0
playwright==1.58.0
# via -r requirements/requirements-playwright.in
pluggy==1.6.0
# via pytest
posthog==6.4.1
# via
# pytest
# pytest-cov
posthog==7.9.12
# via -r requirements/requirements.in
pox==0.3.6
# via pathos
ppft==1.7.7
# via pathos
pre-commit==4.2.0
pre-commit==4.5.1
# via -r requirements/requirements-dev.in
prompt-toolkit==3.0.51
prompt-toolkit==3.0.52
# via -r requirements/requirements.in
propcache==0.3.2
propcache==0.4.1
# via
# aiohttp
# yarl
proto-plus==1.26.1
proto-plus==1.27.1
# via google-api-core
protobuf==6.33.5
# via
# google-ai-generativelanguage
# google-api-core
protobuf==5.29.5
# via
# google-ai-generativelanguage
# google-api-core
# google-generativeai
# googleapis-common-protos
# grpcio-status
# proto-plus
# streamlit
psutil==7.0.0
psutil==7.2.2
# via -r requirements/requirements.in
ptyprocess==0.7.0
# via pexpect
pyarrow==21.0.0
pyarrow==23.0.1
# via streamlit
pyasn1==0.6.1
# via
# pyasn1-modules
# rsa
pyasn1==0.6.2
# via pyasn1-modules
pyasn1-modules==0.4.2
# via google-auth
pycodestyle==2.14.0
# via flake8
pycparser==2.22
pycparser==3.0
# via cffi
pydantic==2.11.7
pydantic==2.12.5
# via
# banks
# google-generativeai
# fastapi
# litellm
# llama-index-core
# llama-index-instrumentation
# llama-index-workflows
# mixpanel
# openai
pydantic-core==2.33.2
pydantic-core==2.41.5
# via pydantic
pydeck==0.9.1
# via streamlit
pydub==0.25.1
# via -r requirements/requirements.in
pyee==13.0.0
pyee==13.0.1
# via playwright
pyflakes==3.4.0
# via flake8
@@ -414,23 +410,24 @@ pygments==2.19.2
# via
# pytest
# rich
pypandoc==1.15
pypandoc==1.17
# via -r requirements/requirements.in
pyparsing==3.2.3
# via
# httplib2
# matplotlib
pyperclip==1.9.0
pyparsing==3.3.2
# via matplotlib
pyperclip==1.11.0
# via -r requirements/requirements.in
pyproject-hooks==1.2.0
# via
# build
# pip-tools
pytest==8.4.1
pytest==9.0.2
# via
# -r requirements/requirements-dev.in
# pytest-cov
# pytest-env
pytest-env==1.1.5
pytest-cov==7.0.0
# via -r requirements/requirements-dev.in
pytest-env==1.6.0
# via -r requirements/requirements-dev.in
python-dateutil==2.9.0.post0
# via
@@ -438,145 +435,152 @@ python-dateutil==2.9.0.post0
# matplotlib
# pandas
# posthog
python-dotenv==1.1.1
# via litellm
pytz==2025.2
python-discovery==1.1.3
# via virtualenv
python-dotenv==1.2.2
# via
# litellm
# pytest-env
pytz==2026.1.post1
# via pandas
pyyaml==6.0.2
pyyaml==6.0.3
# via
# -r requirements/requirements.in
# huggingface-hub
# llama-index-core
# pre-commit
# transformers
referencing==0.36.2
referencing==0.37.0
# via
# jsonschema
# jsonschema-specifications
regex==2025.7.34
regex==2026.2.28
# via
# nltk
# tiktoken
# transformers
requests==2.32.4
requests==2.32.5
# via
# google-api-core
# google-cloud-bigquery
# huggingface-hub
# llama-index-core
# mixpanel
# posthog
# streamlit
# tiktoken
# transformers
rich==14.1.0
rich==14.3.3
# via
# -r requirements/requirements.in
# typer
rpds-py==0.27.0
rpds-py==0.30.0
# via
# jsonschema
# referencing
rsa==4.9.1
# via google-auth
safetensors==0.6.1
safetensors==0.7.0
# via transformers
scikit-learn==1.7.1
# via sentence-transformers
scipy==1.15.3
scikit-learn==1.8.0
# via
# -r requirements/requirements.in
# -r requirements/requirements-help.in
# sentence-transformers
scipy==1.17.1
# via
# -r requirements/python-compat.in
# scikit-learn
# sentence-transformers
semver==3.0.4
# via -r requirements/requirements-dev.in
sentence-transformers==5.1.0
sentence-transformers==5.3.0
# via llama-index-embeddings-huggingface
setuptools==80.9.0
setuptools==82.0.1
# via
# llama-index-core
# pip-tools
# torch
shellingham==1.5.4
# via typer
shtab==1.7.2
shtab==1.8.0
# via -r requirements/requirements.in
six==1.17.0
# via
# mixpanel
# posthog
# python-dateutil
smmap==5.0.2
smmap==5.0.3
# via gitdb
sniffio==1.3.1
# via
# anyio
# openai
# via openai
socksio==1.0.0
# via -r requirements/requirements.in
sounddevice==0.5.2
sounddevice==0.5.5
# via -r requirements/requirements.in
soundfile==0.13.1
# via -r requirements/requirements.in
soupsieve==2.7
soupsieve==2.8.3
# via beautifulsoup4
sqlalchemy[asyncio]==2.0.42
sqlalchemy[asyncio]==2.0.48
# via llama-index-core
streamlit==1.48.0
starlette==0.52.1
# via fastapi
streamlit==1.55.0
# via -r requirements/requirements-browser.in
sympy==1.14.0
# via torch
tenacity==9.1.2
tenacity==9.1.4
# via
# llama-index-core
# streamlit
threadpoolctl==3.6.0
# via scikit-learn
tiktoken==0.10.0
tiktoken==0.12.0
# via
# litellm
# llama-index-core
tokenizers==0.21.4
tinytag==2.2.1
# via llama-index-core
tokenizers==0.22.2
# via
# litellm
# transformers
toml==0.10.2
# via streamlit
torch==2.8.0
# via sentence-transformers
tornado==6.5.1
# via streamlit
tqdm==4.67.1
torch==2.10.0
# via
# -r requirements/requirements-help.in
# sentence-transformers
tornado==6.5.5
# via streamlit
tqdm==4.67.3
# via
# google-generativeai
# huggingface-hub
# llama-index-core
# nltk
# openai
# sentence-transformers
# transformers
transformers==4.55.0
transformers==5.3.0
# via sentence-transformers
tree-sitter==0.25.1
tree-sitter==0.25.2
# via tree-sitter-language-pack
tree-sitter-c-sharp==0.23.1
# via tree-sitter-language-pack
tree-sitter-embedded-template==0.23.2
tree-sitter-embedded-template==0.25.0
# via tree-sitter-language-pack
tree-sitter-language-pack==0.9.0
tree-sitter-language-pack==0.13.0
# via grep-ast
tree-sitter-yaml==0.7.1
tree-sitter-yaml==0.7.2
# via tree-sitter-language-pack
typer==0.16.0
# via -r requirements/requirements-dev.in
typing-extensions==4.14.1
typer==0.24.1
# via
# -r requirements/requirements-dev.in
# huggingface-hub
# transformers
typing-extensions==4.15.0
# via
# aiosignal
# aiosqlite
# altair
# anyio
# beautifulsoup4
# google-generativeai
# fastapi
# grpcio
# huggingface-hub
# llama-index-core
# llama-index-workflows
@@ -588,40 +592,38 @@ typing-extensions==4.14.1
# referencing
# sentence-transformers
# sqlalchemy
# starlette
# streamlit
# torch
# typer
# typing-inspect
# typing-inspection
typing-inspect==0.9.0
# via
# dataclasses-json
# llama-index-core
typing-inspection==0.4.1
# via pydantic
tzdata==2025.2
# via pandas
uritemplate==4.2.0
# via google-api-python-client
urllib3==2.5.0
typing-inspection==0.4.2
# via
# mixpanel
# requests
uv==0.8.5
# fastapi
# pydantic
tzdata==2025.3
# via pandas
urllib3==2.6.3
# via requests
uv==0.10.11
# via -r requirements/requirements-dev.in
virtualenv==20.33.1
virtualenv==21.2.0
# via pre-commit
watchfiles==1.1.0
watchfiles==1.1.1
# via -r requirements/requirements.in
wcwidth==0.2.13
wcwidth==0.6.0
# via prompt-toolkit
wheel==0.45.1
wheel==0.46.3
# via pip-tools
wrapt==1.17.2
wrapt==2.1.2
# via
# deprecated
# llama-index-core
yarl==1.20.1
yarl==1.23.0
# via aiohttp
zipp==3.23.0
# via importlib-metadata

2
requirements/pydub.in Normal file
View File

@@ -0,0 +1,2 @@
# Remove if Python 3.13+ support lands in pydub upstream.
audioop-lts>=0.2.2; python_version >= "3.13"

View File

@@ -0,0 +1,11 @@
# NumPy 2.x adds Python 3.14 wheels, but dropped Python 3.10.
numpy<2; python_version < "3.11"
numpy>=2.3,<2.5; python_version >= "3.11"
# This is the one networkx dependency that we need.
# Including it here explicitly because we
# didn't specify networkx[default] above.
#
# SciPy 1.16+ adds Python 3.14 wheels, but dropped Python 3.10.
scipy<1.16; python_version < "3.11"
scipy>=1.16.1,<1.18; python_version >= "3.11"

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-browser.txt requirements/requirements-browser.in
altair==5.5.0
altair==6.0.0
# via
# -c requirements/common-constraints.txt
# streamlit
attrs==25.3.0
attrs==25.4.0
# via
# -c requirements/common-constraints.txt
# jsonschema
@@ -13,19 +13,19 @@ blinker==1.9.0
# via
# -c requirements/common-constraints.txt
# streamlit
cachetools==5.5.2
cachetools==7.0.5
# via
# -c requirements/common-constraints.txt
# streamlit
certifi==2025.8.3
certifi==2026.2.25
# via
# -c requirements/common-constraints.txt
# requests
charset-normalizer==3.4.2
charset-normalizer==3.4.6
# via
# -c requirements/common-constraints.txt
# requests
click==8.2.1
click==8.3.1
# via
# -c requirements/common-constraints.txt
# streamlit
@@ -33,11 +33,11 @@ gitdb==4.0.12
# via
# -c requirements/common-constraints.txt
# gitpython
gitpython==3.1.45
gitpython==3.1.46
# via
# -c requirements/common-constraints.txt
# streamlit
idna==3.10
idna==3.11
# via
# -c requirements/common-constraints.txt
# requests
@@ -46,46 +46,46 @@ jinja2==3.1.6
# -c requirements/common-constraints.txt
# altair
# pydeck
jsonschema==4.25.0
jsonschema==4.26.0
# via
# -c requirements/common-constraints.txt
# altair
jsonschema-specifications==2025.4.1
jsonschema-specifications==2025.9.1
# via
# -c requirements/common-constraints.txt
# jsonschema
markupsafe==3.0.2
markupsafe==3.0.3
# via
# -c requirements/common-constraints.txt
# jinja2
narwhals==2.0.1
narwhals==2.18.0
# via
# -c requirements/common-constraints.txt
# altair
numpy==1.26.4
numpy==2.4.3
# via
# -c requirements/common-constraints.txt
# pandas
# pydeck
# streamlit
packaging==25.0
packaging==26.0
# via
# -c requirements/common-constraints.txt
# altair
# streamlit
pandas==2.3.1
pandas==2.3.3
# via
# -c requirements/common-constraints.txt
# streamlit
pillow==11.3.0
pillow==12.1.1
# via
# -c requirements/common-constraints.txt
# streamlit
protobuf==5.29.5
protobuf==6.33.5
# via
# -c requirements/common-constraints.txt
# streamlit
pyarrow==21.0.0
pyarrow==23.0.1
# via
# -c requirements/common-constraints.txt
# streamlit
@@ -97,20 +97,20 @@ python-dateutil==2.9.0.post0
# via
# -c requirements/common-constraints.txt
# pandas
pytz==2025.2
pytz==2026.1.post1
# via
# -c requirements/common-constraints.txt
# pandas
referencing==0.36.2
referencing==0.37.0
# via
# -c requirements/common-constraints.txt
# jsonschema
# jsonschema-specifications
requests==2.32.4
requests==2.32.5
# via
# -c requirements/common-constraints.txt
# streamlit
rpds-py==0.27.0
rpds-py==0.30.0
# via
# -c requirements/common-constraints.txt
# jsonschema
@@ -119,15 +119,15 @@ six==1.17.0
# via
# -c requirements/common-constraints.txt
# python-dateutil
smmap==5.0.2
smmap==5.0.3
# via
# -c requirements/common-constraints.txt
# gitdb
streamlit==1.48.0
streamlit==1.55.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-browser.in
tenacity==9.1.2
tenacity==9.1.4
# via
# -c requirements/common-constraints.txt
# streamlit
@@ -135,21 +135,21 @@ toml==0.10.2
# via
# -c requirements/common-constraints.txt
# streamlit
tornado==6.5.1
tornado==6.5.5
# via
# -c requirements/common-constraints.txt
# streamlit
typing-extensions==4.14.1
typing-extensions==4.15.0
# via
# -c requirements/common-constraints.txt
# altair
# referencing
# streamlit
tzdata==2025.2
tzdata==2025.3
# via
# -c requirements/common-constraints.txt
# pandas
urllib3==2.5.0
urllib3==2.6.3
# via
# -c requirements/common-constraints.txt
# requests

View File

@@ -1,4 +1,5 @@
pytest
pytest-cov
pytest-env
pip-tools
lox
@@ -12,3 +13,7 @@ semver
codespell
uv
google-cloud-bigquery
# matplotlib 3.7.2 requires contourpy 1.3.2, but contourpy 1.3.2 does not support Python 3.11.
contourpy==1.3.2 ; python_version < "3.11"
contourpy==1.3.3 ; python_version >= "3.11"

View File

@@ -1,109 +1,118 @@
# 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.3.0
annotated-doc==0.0.4
# via
# -c requirements/common-constraints.txt
# typer
build==1.4.0
# via
# -c requirements/common-constraints.txt
# pip-tools
cachetools==5.5.2
# via
# -c requirements/common-constraints.txt
# google-auth
certifi==2025.8.3
certifi==2026.2.25
# via
# -c requirements/common-constraints.txt
# requests
cfgv==3.4.0
cffi==2.0.0
# via
# -c requirements/common-constraints.txt
# cryptography
cfgv==3.5.0
# via
# -c requirements/common-constraints.txt
# pre-commit
charset-normalizer==3.4.2
charset-normalizer==3.4.6
# via
# -c requirements/common-constraints.txt
# requests
click==8.2.1
click==8.3.1
# via
# -c requirements/common-constraints.txt
# pip-tools
# typer
codespell==2.4.1
codespell==2.4.2
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
cogapp==3.5.1
cogapp==3.6.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
contourpy==1.3.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
# matplotlib
coverage[toml]==7.13.4
# via
# -c requirements/common-constraints.txt
# pytest-cov
cryptography==46.0.5
# via
# -c requirements/common-constraints.txt
# google-auth
cycler==0.12.1
# via
# -c requirements/common-constraints.txt
# matplotlib
dill==0.4.0
# via
# -c requirements/common-constraints.txt
# multiprocess
# pathos
distlib==0.4.0
# via
# -c requirements/common-constraints.txt
# virtualenv
filelock==3.18.0
filelock==3.25.2
# via
# -c requirements/common-constraints.txt
# python-discovery
# virtualenv
fonttools==4.59.0
fonttools==4.62.1
# via
# -c requirements/common-constraints.txt
# matplotlib
google-api-core[grpc]==2.25.1
google-api-core[grpc]==2.30.0
# via
# -c requirements/common-constraints.txt
# google-cloud-bigquery
# google-cloud-core
google-auth==2.40.3
google-auth==2.49.1
# via
# -c requirements/common-constraints.txt
# google-api-core
# google-cloud-bigquery
# google-cloud-core
google-cloud-bigquery==3.35.1
google-cloud-bigquery==3.40.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
google-cloud-core==2.4.3
google-cloud-core==2.5.0
# via
# -c requirements/common-constraints.txt
# google-cloud-bigquery
google-crc32c==1.7.1
google-crc32c==1.8.0
# via
# -c requirements/common-constraints.txt
# google-resumable-media
google-resumable-media==2.7.2
google-resumable-media==2.8.0
# via
# -c requirements/common-constraints.txt
# google-cloud-bigquery
googleapis-common-protos==1.70.0
googleapis-common-protos==1.73.0
# via
# -c requirements/common-constraints.txt
# google-api-core
# grpcio-status
grpcio==1.74.0
grpcio==1.78.0
# via
# -c requirements/common-constraints.txt
# google-api-core
# grpcio-status
grpcio-status==1.71.2
grpcio-status==1.78.0
# via
# -c requirements/common-constraints.txt
# google-api-core
identify==2.6.12
identify==2.6.18
# via
# -c requirements/common-constraints.txt
# pre-commit
idna==3.10
idna==3.11
# via
# -c requirements/common-constraints.txt
# requests
@@ -111,23 +120,23 @@ imgcat==0.6.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
iniconfig==2.1.0
iniconfig==2.3.0
# via
# -c requirements/common-constraints.txt
# pytest
kiwisolver==1.4.8
kiwisolver==1.5.0
# via
# -c requirements/common-constraints.txt
# matplotlib
lox==0.13.0
lox==1.0.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
markdown-it-py==3.0.0
markdown-it-py==4.0.0
# via
# -c requirements/common-constraints.txt
# rich
matplotlib==3.10.5
matplotlib==3.10.8
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
@@ -135,93 +144,83 @@ mdurl==0.1.2
# via
# -c requirements/common-constraints.txt
# markdown-it-py
multiprocess==0.70.18
# via
# -c requirements/common-constraints.txt
# pathos
nodeenv==1.9.1
nodeenv==1.10.0
# via
# -c requirements/common-constraints.txt
# pre-commit
numpy==1.26.4
numpy==2.4.3
# via
# -c requirements/common-constraints.txt
# contourpy
# matplotlib
# pandas
packaging==25.0
packaging==26.0
# via
# -c requirements/common-constraints.txt
# build
# google-cloud-bigquery
# matplotlib
# pytest
pandas==2.3.1
# wheel
pandas==2.3.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
pathos==0.3.4
# via
# -c requirements/common-constraints.txt
# lox
pillow==11.3.0
pillow==12.1.1
# via
# -c requirements/common-constraints.txt
# matplotlib
pip==25.2
pip==26.0.1
# via
# -c requirements/common-constraints.txt
# pip-tools
pip-tools==7.5.0
pip-tools==7.5.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
platformdirs==4.3.8
platformdirs==4.9.4
# via
# -c requirements/common-constraints.txt
# python-discovery
# virtualenv
pluggy==1.6.0
# via
# -c requirements/common-constraints.txt
# pytest
pox==0.3.6
# via
# -c requirements/common-constraints.txt
# pathos
ppft==1.7.7
# via
# -c requirements/common-constraints.txt
# pathos
pre-commit==4.2.0
# pytest-cov
pre-commit==4.5.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
proto-plus==1.26.1
proto-plus==1.27.1
# via
# -c requirements/common-constraints.txt
# google-api-core
protobuf==5.29.5
protobuf==6.33.5
# via
# -c requirements/common-constraints.txt
# google-api-core
# googleapis-common-protos
# grpcio-status
# proto-plus
pyasn1==0.6.1
pyasn1==0.6.2
# via
# -c requirements/common-constraints.txt
# pyasn1-modules
# rsa
pyasn1-modules==0.4.2
# via
# -c requirements/common-constraints.txt
# google-auth
pycparser==3.0
# via
# -c requirements/common-constraints.txt
# cffi
pygments==2.19.2
# via
# -c requirements/common-constraints.txt
# pytest
# rich
pyparsing==3.2.3
pyparsing==3.3.2
# via
# -c requirements/common-constraints.txt
# matplotlib
@@ -230,12 +229,17 @@ pyproject-hooks==1.2.0
# -c requirements/common-constraints.txt
# build
# pip-tools
pytest==8.4.1
pytest==9.0.2
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
# pytest-cov
# pytest-env
pytest-env==1.1.5
pytest-cov==7.0.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
pytest-env==1.6.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
@@ -245,32 +249,36 @@ python-dateutil==2.9.0.post0
# google-cloud-bigquery
# matplotlib
# pandas
pytz==2025.2
python-discovery==1.1.3
# via
# -c requirements/common-constraints.txt
# virtualenv
python-dotenv==1.2.2
# via
# -c requirements/common-constraints.txt
# pytest-env
pytz==2026.1.post1
# via
# -c requirements/common-constraints.txt
# pandas
pyyaml==6.0.2
pyyaml==6.0.3
# via
# -c requirements/common-constraints.txt
# pre-commit
requests==2.32.4
requests==2.32.5
# via
# -c requirements/common-constraints.txt
# google-api-core
# google-cloud-bigquery
rich==14.1.0
rich==14.3.3
# via
# -c requirements/common-constraints.txt
# typer
rsa==4.9.1
# via
# -c requirements/common-constraints.txt
# google-auth
semver==3.0.4
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
setuptools==80.9.0
setuptools==82.0.1
# via
# -c requirements/common-constraints.txt
# pip-tools
@@ -282,31 +290,31 @@ six==1.17.0
# via
# -c requirements/common-constraints.txt
# python-dateutil
typer==0.16.0
typer==0.24.1
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
typing-extensions==4.14.1
typing-extensions==4.15.0
# via
# -c requirements/common-constraints.txt
# typer
tzdata==2025.2
# grpcio
tzdata==2025.3
# via
# -c requirements/common-constraints.txt
# pandas
urllib3==2.5.0
urllib3==2.6.3
# via
# -c requirements/common-constraints.txt
# requests
uv==0.8.5
uv==0.10.11
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-dev.in
virtualenv==20.33.1
virtualenv==21.2.0
# via
# -c requirements/common-constraints.txt
# pre-commit
wheel==0.45.1
wheel==0.46.3
# via
# -c requirements/common-constraints.txt
# pip-tools

View File

@@ -1,11 +1,13 @@
llama-index-embeddings-huggingface
# Because sentence-transformers doesn't like >=2
numpy<2
# NumPy 2.x adds Python 3.14 wheels, but dropped Python 3.10.
numpy<2; python_version < "3.11"
numpy>=2.3,<2.5; python_version >= "3.11"
# 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.3+ works with NumPy 2 on the supported Python versions.
torch>=2.3.0
# Later versions break test_help in GitHub Actions on Windows and Ubuntu
# llama-index-core==0.12.26
# due to llama-index-core==0.12.26
scikit-learn==1.7.2 ; python_version < "3.11"
scikit-learn==1.8.0 ; python_version >= "3.11"

View File

@@ -4,58 +4,62 @@ aiohappyeyeballs==2.6.1
# via
# -c requirements/common-constraints.txt
# aiohttp
aiohttp==3.12.15
aiohttp==3.13.3
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# llama-index-core
aiosignal==1.4.0
# via
# -c requirements/common-constraints.txt
# aiohttp
aiosqlite==0.21.0
aiosqlite==0.22.1
# via
# -c requirements/common-constraints.txt
# llama-index-core
annotated-doc==0.0.4
# via
# -c requirements/common-constraints.txt
# typer
annotated-types==0.7.0
# via
# -c requirements/common-constraints.txt
# pydantic
anyio==4.10.0
anyio==4.12.1
# via
# -c requirements/common-constraints.txt
# httpx
attrs==25.3.0
attrs==25.4.0
# via
# -c requirements/common-constraints.txt
# aiohttp
banks==2.2.0
banks==2.4.1
# via
# -c requirements/common-constraints.txt
# llama-index-core
certifi==2025.8.3
certifi==2026.2.25
# via
# -c requirements/common-constraints.txt
# httpcore
# httpx
# requests
charset-normalizer==3.4.2
charset-normalizer==3.4.6
# via
# -c requirements/common-constraints.txt
# requests
click==8.2.1
click==8.3.1
# via
# -c requirements/common-constraints.txt
# nltk
# typer
colorama==0.4.6
# via
# -c requirements/common-constraints.txt
# griffe
# griffecli
dataclasses-json==0.6.7
# via
# -c requirements/common-constraints.txt
# llama-index-core
deprecated==1.2.18
deprecated==1.3.1
# via
# -c requirements/common-constraints.txt
# banks
@@ -65,40 +69,49 @@ dirtyjson==1.0.8
# via
# -c requirements/common-constraints.txt
# llama-index-core
filelock==3.18.0
filelock==3.25.2
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# torch
# transformers
filetype==1.2.0
# via
# -c requirements/common-constraints.txt
# banks
# llama-index-core
frozenlist==1.7.0
frozenlist==1.8.0
# via
# -c requirements/common-constraints.txt
# aiohttp
# aiosignal
fsspec==2025.7.0
fsspec==2026.2.0
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# llama-index-core
# torch
greenlet==3.2.3
greenlet==3.3.2
# via
# -c requirements/common-constraints.txt
# sqlalchemy
griffe==1.10.0
griffe==2.0.0
# via
# -c requirements/common-constraints.txt
# banks
griffecli==2.0.0
# via
# -c requirements/common-constraints.txt
# griffe
griffelib==2.0.0
# via
# -c requirements/common-constraints.txt
# griffe
# griffecli
h11==0.16.0
# via
# -c requirements/common-constraints.txt
# httpcore
hf-xet==1.1.7
hf-xet==1.4.2
# via
# -c requirements/common-constraints.txt
# huggingface-hub
@@ -109,15 +122,16 @@ httpcore==1.0.9
httpx==0.28.1
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# llama-index-core
huggingface-hub[inference]==0.34.3
huggingface-hub[inference]==1.7.1
# via
# -c requirements/common-constraints.txt
# llama-index-embeddings-huggingface
# sentence-transformers
# tokenizers
# transformers
idna==3.10
idna==3.11
# via
# -c requirements/common-constraints.txt
# anyio
@@ -129,40 +143,48 @@ jinja2==3.1.6
# -c requirements/common-constraints.txt
# banks
# torch
joblib==1.5.1
joblib==1.5.3
# via
# -c requirements/common-constraints.txt
# nltk
# scikit-learn
llama-index-core==0.13.0
llama-index-core==0.14.18
# via
# -c requirements/common-constraints.txt
# llama-index-embeddings-huggingface
llama-index-embeddings-huggingface==0.6.0
llama-index-embeddings-huggingface==0.7.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-help.in
llama-index-instrumentation==0.4.0
llama-index-instrumentation==0.5.0
# via
# -c requirements/common-constraints.txt
# llama-index-workflows
llama-index-workflows==1.3.0
llama-index-workflows==2.16.1
# via
# -c requirements/common-constraints.txt
# llama-index-core
markupsafe==3.0.2
markdown-it-py==4.0.0
# via
# -c requirements/common-constraints.txt
# rich
markupsafe==3.0.3
# via
# -c requirements/common-constraints.txt
# jinja2
marshmallow==3.26.1
marshmallow==3.26.2
# via
# -c requirements/common-constraints.txt
# dataclasses-json
mdurl==0.1.2
# via
# -c requirements/common-constraints.txt
# markdown-it-py
mpmath==1.3.0
# via
# -c requirements/common-constraints.txt
# sympy
multidict==6.6.3
multidict==6.7.1
# via
# -c requirements/common-constraints.txt
# aiohttp
@@ -180,96 +202,103 @@ networkx==3.4.2
# -c requirements/common-constraints.txt
# llama-index-core
# torch
nltk==3.9.1
nltk==3.9.3
# via
# -c requirements/common-constraints.txt
# llama-index-core
numpy==1.26.4
numpy==2.4.3
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-help.in
# llama-index-core
# scikit-learn
# scipy
# sentence-transformers
# transformers
packaging==25.0
packaging==26.0
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# marshmallow
# transformers
pillow==11.3.0
pillow==12.1.1
# via
# -c requirements/common-constraints.txt
# llama-index-core
# sentence-transformers
platformdirs==4.3.8
platformdirs==4.9.4
# via
# -c requirements/common-constraints.txt
# banks
# llama-index-core
propcache==0.3.2
propcache==0.4.1
# via
# -c requirements/common-constraints.txt
# aiohttp
# yarl
pydantic==2.11.7
pydantic==2.12.5
# via
# -c requirements/common-constraints.txt
# banks
# llama-index-core
# llama-index-instrumentation
# llama-index-workflows
pydantic-core==2.33.2
pydantic-core==2.41.5
# via
# -c requirements/common-constraints.txt
# pydantic
pyyaml==6.0.2
pygments==2.19.2
# via
# -c requirements/common-constraints.txt
# rich
pyyaml==6.0.3
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# llama-index-core
# transformers
regex==2025.7.34
regex==2026.2.28
# via
# -c requirements/common-constraints.txt
# nltk
# tiktoken
# transformers
requests==2.32.4
requests==2.32.5
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# llama-index-core
# tiktoken
# transformers
safetensors==0.6.1
rich==14.3.3
# via
# -c requirements/common-constraints.txt
# typer
safetensors==0.7.0
# via
# -c requirements/common-constraints.txt
# transformers
scikit-learn==1.7.1
scikit-learn==1.8.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-help.in
# sentence-transformers
scipy==1.15.3
scipy==1.17.1
# via
# -c requirements/common-constraints.txt
# scikit-learn
# sentence-transformers
sentence-transformers==5.1.0
sentence-transformers==5.3.0
# via
# -c requirements/common-constraints.txt
# llama-index-embeddings-huggingface
setuptools==80.9.0
setuptools==82.0.1
# via
# -c requirements/common-constraints.txt
# llama-index-core
# torch
sniffio==1.3.1
shellingham==1.5.4
# via
# -c requirements/common-constraints.txt
# anyio
sqlalchemy[asyncio]==2.0.42
# typer
sqlalchemy[asyncio]==2.0.48
# via
# -c requirements/common-constraints.txt
# llama-index-core
@@ -277,7 +306,7 @@ sympy==1.14.0
# via
# -c requirements/common-constraints.txt
# torch
tenacity==9.1.2
tenacity==9.1.4
# via
# -c requirements/common-constraints.txt
# llama-index-core
@@ -285,19 +314,24 @@ threadpoolctl==3.6.0
# via
# -c requirements/common-constraints.txt
# scikit-learn
tiktoken==0.10.0
tiktoken==0.12.0
# via
# -c requirements/common-constraints.txt
# llama-index-core
tokenizers==0.21.4
tinytag==2.2.1
# via
# -c requirements/common-constraints.txt
# llama-index-core
tokenizers==0.22.2
# via
# -c requirements/common-constraints.txt
# transformers
torch==2.8.0
torch==2.10.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-help.in
# sentence-transformers
tqdm==4.67.1
tqdm==4.67.3
# via
# -c requirements/common-constraints.txt
# huggingface-hub
@@ -305,15 +339,19 @@ tqdm==4.67.1
# nltk
# sentence-transformers
# transformers
transformers==4.55.0
transformers==5.3.0
# via
# -c requirements/common-constraints.txt
# sentence-transformers
typing-extensions==4.14.1
typer==0.24.1
# via
# -c requirements/common-constraints.txt
# huggingface-hub
# transformers
typing-extensions==4.15.0
# via
# -c requirements/common-constraints.txt
# aiosignal
# aiosqlite
# anyio
# huggingface-hub
# llama-index-core
@@ -330,20 +368,20 @@ typing-inspect==0.9.0
# -c requirements/common-constraints.txt
# dataclasses-json
# llama-index-core
typing-inspection==0.4.1
typing-inspection==0.4.2
# via
# -c requirements/common-constraints.txt
# pydantic
urllib3==2.5.0
urllib3==2.6.3
# via
# -c requirements/common-constraints.txt
# requests
wrapt==1.17.2
wrapt==2.1.2
# via
# -c requirements/common-constraints.txt
# deprecated
# llama-index-core
yarl==1.20.1
yarl==1.23.0
# via
# -c requirements/common-constraints.txt
# aiohttp

View File

@@ -1,18 +1,18 @@
# 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.3
greenlet==3.3.2
# via
# -c requirements/common-constraints.txt
# playwright
playwright==1.54.0
playwright==1.58.0
# via
# -c requirements/common-constraints.txt
# -r requirements/requirements-playwright.in
pyee==13.0.0
pyee==13.0.1
# via
# -c requirements/common-constraints.txt
# playwright
typing-extensions==4.14.1
typing-extensions==4.15.0
# via
# -c requirements/common-constraints.txt
# pyee

View File

@@ -29,7 +29,7 @@ socksio
pillow
shtab
oslex
google-generativeai
-r python-compat.in
# The proper dependency is networkx[default], but this brings
# in matplotlib and a bunch of other deps
@@ -39,14 +39,12 @@ google-generativeai
# >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.
#
# 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
# Uses importlib-metadata
importlib-metadata<8.0.0
# The proper dependency is litellm[proxy], but it installs
# mcp which is a pywin32 dependency that fails on linux CI.
fastapi
orjson

View File

@@ -1,3 +1,3 @@
tree-sitter==0.23.2; python_version < "3.10"
tree-sitter==0.24.0; python_version >= "3.10"
tree-sitter==0.25.2; python_version >= "3.10"

View File

@@ -89,8 +89,13 @@ def get_commit_authors(commits):
commit_to_author = dict()
for commit in commits:
author = run(["git", "show", "-s", "--format=%an", commit]).strip()
commit_message = run(["git", "show", "-s", "--format=%s", commit]).strip()
if commit_message.lower().startswith("aider:"):
subject = run(["git", "show", "-s", "--format=%s", commit]).strip()
full_message = run(["git", "show", "-s", "--format=%B", commit]).strip()
lower_subject = subject.lower()
lower_full = full_message.lower()
if lower_subject.startswith("aider:") or "co-authored-by: aider" in lower_full:
author += " (aider)"
commit_to_author[commit] = author
return commit_to_author

View File

@@ -398,10 +398,6 @@ def get_badges_html():
<span class="badge-label">📈 Tokens/week</span>
<span class="badge-value">{TOKENS_PER_WEEK}</span>
</div>
<a href="https://openrouter.ai/#options-menu" class="github-badge badge-router" title="{OPENROUTER_TOOLTIP}">
<span class="badge-label">🏆 OpenRouter</span>
<span class="badge-value">Top 20</span>
</a>
<a href="/HISTORY.html" class="github-badge badge-coded" title="{SINGULARITY_TOOLTIP}">
<span class="badge-label">🔄 Singularity</span>
<span class="badge-value">{aider_percent_rounded}%</span>

View File

@@ -25,8 +25,8 @@ uv pip compile \
requirements/requirements.in \
$1
grep -v ^tree-sitter= tmp.requirements.txt \
| cat - requirements/tree-sitter.in \
grep -Ev '^(tree-sitter|numpy|scipy)=' tmp.requirements.txt \
| cat - requirements/tree-sitter.in requirements/python-compat.in requirements/pydub.in \
> requirements.txt
# Compile additional requirements files

View File

@@ -113,7 +113,7 @@ def main():
cmd = [
"aider",
"--model",
"o3",
"gpt-5.4",
hist_path,
"--read",
log_path,

View File

@@ -536,7 +536,7 @@ class TestCommands(TestCase):
io = InputOutput(pretty=False, fancy_input=False, yes=False)
from aider.coders import Coder
coder = Coder.create(Model("claude-3-5-sonnet-20240620"), None, io)
coder = Coder.create(Model("claude-sonnet-4-6"), None, io)
print(coder.get_announcements())
commands = Commands(io, coder)
@@ -924,7 +924,7 @@ class TestCommands(TestCase):
self.assertEqual(len(coder.abs_read_only_fnames), 0)
# Test with vision model
vision_model = Model("gpt-4-vision-preview")
vision_model = Model("gpt-4o")
vision_coder = Coder.create(vision_model, None, io)
vision_commands = Commands(io, vision_coder)

View File

@@ -42,6 +42,26 @@ def test_get_ex_info():
assert ex_info.description is None
def test_permission_denied_error():
"""Test specific handling of PermissionDeniedError"""
ex = LiteLLMExceptions()
import httpx
from litellm import PermissionDeniedError
request = httpx.Request("GET", "https://example.com")
response = httpx.Response(403, request=request)
perm_error = PermissionDeniedError(
message="Permission denied",
llm_provider="openai",
model="gpt-4",
response=response,
)
ex_info = ex.get_ex_info(perm_error)
assert ex_info.retry is False
assert "permission was denied" in ex_info.description.lower()
assert "api key" in ex_info.description.lower()
def test_rate_limit_error():
"""Test specific handling of RateLimitError"""
ex = LiteLLMExceptions()

View File

@@ -43,9 +43,6 @@ class TestModels(unittest.TestCase):
model = Model("gpt-4")
self.assertEqual(model.info["max_input_tokens"], 8 * 1024)
model = Model("gpt-4-32k")
self.assertEqual(model.info["max_input_tokens"], 32 * 1024)
model = Model("gpt-4-0613")
self.assertEqual(model.info["max_input_tokens"], 8 * 1024)
@@ -138,13 +135,13 @@ class TestModels(unittest.TestCase):
self.assertEqual(model.name, "gpt-3.5-turbo")
model = Model("sonnet")
self.assertEqual(model.name, "anthropic/claude-sonnet-4-20250514")
self.assertEqual(model.name, "claude-sonnet-4-6")
model = Model("haiku")
self.assertEqual(model.name, "claude-3-5-haiku-20241022")
self.assertEqual(model.name, "claude-haiku-4-5")
model = Model("opus")
self.assertEqual(model.name, "claude-opus-4-20250514")
self.assertEqual(model.name, "claude-opus-4-7")
# Test non-alias passes through unchanged
model = Model("gpt-4")
@@ -558,6 +555,46 @@ class TestModels(unittest.TestCase):
timeout=600,
)
def test_gpt_5_5_model_settings(self):
base_models = [
"gpt-5.5",
"gpt-5.5-chat-latest",
"openai/gpt-5.5",
"openai/gpt-5.5-chat-latest",
"azure/gpt-5.5",
"azure/gpt-5.5-chat-latest",
"openrouter/openai/gpt-5.5",
"openrouter/openai/gpt-5.5-chat-latest",
]
for name in base_models:
with self.subTest(name=name):
model = Model(name)
self.assertEqual(model.edit_format, "diff")
self.assertTrue(model.use_repo_map)
self.assertFalse(model.use_temperature)
self.assertIn("reasoning_effort", model.accepts_settings)
self.assertTrue(Model("gpt-5.5").overeager)
pro_models = {
"gpt-5.5-pro": "gpt-5.5",
"openai/gpt-5.5-pro": "openai/gpt-5.5",
"azure/gpt-5.5-pro": "azure/gpt-5.5",
"openrouter/openai/gpt-5.5-pro": "openrouter/openai/gpt-5.5",
}
for name, editor_name in pro_models.items():
with self.subTest(name=name):
model = Model(name)
self.assertFalse(model.streaming)
self.assertEqual(model.edit_format, "diff")
self.assertTrue(model.use_repo_map)
self.assertFalse(model.use_temperature)
self.assertEqual(model.editor_model_name, editor_name)
self.assertEqual(model.editor_model.name, editor_name)
self.assertIn("reasoning_effort", model.accepts_settings)
if __name__ == "__main__":
unittest.main()

View File

@@ -302,6 +302,9 @@ class TestRepoMapAllLanguages(unittest.TestCase):
def test_language_gleam(self):
self._test_language_repo_map("gleam", "gleam", "greet")
def test_language_haskell(self):
self._test_language_repo_map("haskell", "hs", "add")
def test_language_java(self):
self._test_language_repo_map("java", "java", "Greeting")
@@ -334,6 +337,9 @@ class TestRepoMapAllLanguages(unittest.TestCase):
def test_language_tsx(self):
self._test_language_repo_map("tsx", "tsx", "UserProps")
def test_language_zig(self):
self._test_language_repo_map("zig", "zig", "add")
def test_language_csharp(self):
self._test_language_repo_map("csharp", "cs", "IGreeter")

15
tests/basic/test_utils.py Normal file
View File

@@ -0,0 +1,15 @@
import os
from aider.utils import safe_abs_path
def test_safe_abs_path_symlink_loop(tmp_path):
# Create circular symlink: a -> b -> a
link_a = tmp_path / "link_a"
link_b = tmp_path / "link_b"
link_a.symlink_to(link_b)
link_b.symlink_to(link_a)
# safe_abs_path must not raise, and must return an absolute path
result = safe_abs_path(str(link_a))
assert os.path.isabs(result)

View File

@@ -0,0 +1,7 @@
module Main where
add :: Int -> Int -> Int
add a b = a + b
main :: IO ()
main = print (add 2 3)

10
tests/fixtures/languages/zig/test.zig vendored Normal file
View File

@@ -0,0 +1,10 @@
const std = @import("std");
pub fn add(a: i32, b: i32) i32 {
return a + b;
}
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print("{}", .{add(2, 3)});
}

View File

@@ -84,7 +84,7 @@ class TestScrape(unittest.TestCase):
def test_scraper_print_error_not_called(self):
# Create a Scraper instance with a mock print_error function
mock_print_error = MagicMock()
scraper = Scraper(print_error=mock_print_error)
scraper = Scraper(print_error=mock_print_error, verify_ssl=False)
# Test various methods of the Scraper class
scraper.scrape_with_httpx("https://example.com")