Compare commits

...

1097 Commits

Author SHA1 Message Date
Paul Gauthier
66f94d2141 set version to 0.63.2.dev 2024-11-14 06:56:43 -08:00
Paul Gauthier
503a9a0038 version bump to 0.63.1 2024-11-14 06:55:05 -08:00
Paul Gauthier
d8a5bc3ae9 Revert "Merge branch 'issue2283'"
This reverts commit e1a1e43c3a, reversing
changes made to c538817b61.
2024-11-14 06:53:21 -08:00
Paul Gauthier (aider)
94c3957d92 fix: Add error handling for git.ignored() method 2024-11-14 06:48:35 -08:00
Paul Gauthier
266350b8ce fix: Handle potential git errors in git_ignored_file method 2024-11-14 06:48:33 -08:00
Paul Gauthier (aider)
721d852cc7 feat: Add vertical spacing div to improve FAQ anchor link behavior 2024-11-13 16:23:50 -08:00
Paul Gauthier
ffbf205aba docs: Add explanation for aider code stats computation 2024-11-13 16:20:07 -08:00
Paul Gauthier
e1a1e43c3a Merge branch 'issue2283' 2024-11-13 13:43:30 -08:00
Paul Gauthier
c538817b61 updated blame 2024-11-13 13:43:05 -08:00
Paul Gauthier
71d85d2771 fix: Update Qwen 2.5 Coder 32b model configuration condition 2024-11-13 13:40:35 -08:00
Paul Gauthier
69f4d5fca7 set version to 0.63.1.dev 2024-11-13 13:37:03 -08:00
Paul Gauthier
bb31fc5301 version bump to 0.63.0 2024-11-13 13:35:36 -08:00
Paul Gauthier
87ce51e314 copy 2024-11-13 13:32:20 -08:00
Paul Gauthier
33555ca2ea refactor: Simplify file display logic and label formatting 2024-11-13 13:31:38 -08:00
Paul Gauthier (aider)
6fc3776c0c style: Fix linter warnings in io.py 2024-11-13 13:27:11 -08:00
Paul Gauthier (aider)
8a05f05bd4 refactor: Improve file list display logic with line-based spacing 2024-11-13 13:27:06 -08:00
Paul Gauthier (aider)
0dff51920e feat: Conditionally print blank line between file sections based on file count 2024-11-13 13:26:09 -08:00
Paul Gauthier
262f217d04 style: Shorten file list labels for cleaner display 2024-11-13 13:26:08 -08:00
Paul Gauthier (aider)
8b9154bab0 feat: Add labels to read-only and editable files columns 2024-11-13 13:24:51 -08:00
Paul Gauthier (aider)
533613d92b fix: Remove unused repo variable in test_cmd_add_gitignored_file 2024-11-13 13:22:57 -08:00
Paul Gauthier
20d87e1136 refactor: Remove unnecessary .gitignore commit in test setup 2024-11-13 13:22:45 -08:00
Paul Gauthier (aider)
1450c4194e test: Add test to verify cmd_add respects .gitignore files 2024-11-13 13:20:52 -08:00
Paul Gauthier
bc82baa968 refactor: Reorder git ignored file check to handle non-git repos 2024-11-13 13:18:09 -08:00
Paul Gauthier
218623be28 feat: Add git_ignored_file method to check files against gitignore 2024-11-13 13:12:25 -08:00
Paul Gauthier
ea1a4ecdc6 fix: Handle empty content in reply_completed method 2024-11-13 12:57:45 -08:00
Paul Gauthier
6acbff3c11 fix: Handle empty content in ArchitectCoder reply_completed method 2024-11-13 12:57:38 -08:00
Paul Gauthier
153021efcf fix: Handle OSError in get_rel_repo_dir method for edge cases 2024-11-13 12:51:27 -08:00
Paul Gauthier
fef1b59b42 refactor: Restructure file mention check and interrupt handling in base coder 2024-11-13 12:50:17 -08:00
Paul Gauthier
733b11b7d4 copy 2024-11-13 12:40:43 -08:00
Paul Gauthier
400514ff10 fix: Remove hardcoded reminder and add Qwen 2.5 coder model configuration 2024-11-13 12:36:28 -08:00
Paul Gauthier
bbfac316fc feat: Add model metadata for Qwen 2.5 Coder 32B Instruct model 2024-11-13 12:24:32 -08:00
Paul Gauthier
7d0b67f70e copy 2024-11-12 19:12:19 -08:00
Paul Gauthier
d0f1b38848 feat: Add Qwen 2.5 Coder 32B model settings and improve model loading robustness 2024-11-12 19:10:48 -08:00
Paul Gauthier
4d4b5bc366 chore: Remove model-metadata.json file 2024-11-12 18:38:59 -08:00
Paul Gauthier
1f39c7ef0d refactor: Improve model info retrieval logic in ModelInfoManager 2024-11-12 18:37:33 -08:00
Paul Gauthier (aider)
2e97fcc47f fix: Remove double-counting of cached tokens in token calculation 2024-11-11 17:19:11 -08:00
Paul Gauthier
550c8322c4 copy 2024-11-11 15:54:38 -08:00
Paul Gauthier (aider)
2467e23033 feat: Add vertex_ai/gemini-pro-experimental model with diff-fenced edit mode 2024-11-11 15:53:53 -08:00
Paul Gauthier
0e53198c59 do not swallow litellm.get_model_info() exceptions #2318 2024-11-11 15:15:24 -08:00
Paul Gauthier
44063590e2 copy 2024-11-11 10:30:23 -08:00
Paul Gauthier
557f25bf80 copy 2024-11-11 10:30:00 -08:00
paul-gauthier
190531543f Merge pull request #2335 from Hambaobao/qwen2.5-coder-32b-diff-results
Add diff format evaluation results of Qwen2.5-Coder-32B-Instruct.
2024-11-11 10:29:16 -08:00
Paul Gauthier
acfb7c3a89 fix: Handle git repo initialization errors gracefully 2024-11-11 09:56:19 -08:00
Paul Gauthier
94a6d3bc7e fix: Handle case when current working directory is inaccessible in git setup 2024-11-11 09:55:23 -08:00
Paul Gauthier (aider)
5751bcd382 refactor: Move Path.cwd() call to top of setup_git and add OSError handling 2024-11-11 09:54:43 -08:00
Paul Gauthier
21b88c0e65 refactor: Update language reply prompts to use {language} placeholder 2024-11-11 09:38:30 -08:00
Paul Gauthier
f66b916d4b feat: Add language configuration for user communication in prompts 2024-11-11 09:36:23 -08:00
柏枫
bd9c43a48d Add evaluation results for Qwen2.5-Coder-32B-Instruct using the diff format. 2024-11-12 01:23:19 +08:00
Paul Gauthier
352b91f342 copy 2024-11-11 08:46:08 -08:00
Paul Gauthier
be6e3254ea copy 2024-11-11 08:45:42 -08:00
paul-gauthier
dd1ee209ab Merge pull request #2334 from Hambaobao/qwen2.5-coder-series-results
Add Evaluation Results of Qwen2.5-Coder Series.
2024-11-11 08:43:51 -08:00
柏枫
c0b1101a52 Add evaluation results of Qwen2.5-Coder series. 2024-11-11 20:18:30 +08:00
Paul Gauthier
52c49fc8fd feat: Add option to return web scrape content instead of printing 2024-11-08 14:27:59 -08:00
Paul Gauthier
77cb64958e refactor: Modify URL scraping and message handling in commands 2024-11-08 14:23:55 -08:00
Paul Gauthier (aider)
b3d13e44b2 refactor: Modify cmd_web to add scraped content to cur_messages as assistant reply 2024-11-08 14:21:59 -08:00
Paul Gauthier
9dd7b795ca fix: Handle NotFoundError in send chat test with single print call 2024-11-08 14:18:23 -08:00
Paul Gauthier (aider)
7a8399571a fix: Handle non-retryable errors by returning None in simple_send_with_retries 2024-11-08 10:03:49 -08:00
Paul Gauthier (aider)
d0e85d9c2c style: Apply linter formatting to sendchat.py and test_sendchat.py 2024-11-08 10:02:54 -08:00
Paul Gauthier (aider)
14d02bc843 fix: Handle None response and update InvalidRequestError test 2024-11-08 10:02:48 -08:00
Paul Gauthier (aider)
b79c09cf58 refactor: Remove unused CACHE import from test_sendchat.py 2024-11-08 10:01:45 -08:00
Paul Gauthier (aider)
c9dfe5daff style: Organize imports and format code in test_sendchat.py 2024-11-08 10:01:16 -08:00
Paul Gauthier (aider)
092e7f6b3c test: Add comprehensive tests for sendchat module functionality 2024-11-08 10:01:11 -08:00
Paul Gauthier (aider)
203634314c style: Format code with linter 2024-11-08 10:00:33 -08:00
Paul Gauthier (aider)
c472e6e160 fix: Update test_exceptions.py to provide required arguments for litellm exceptions 2024-11-08 10:00:30 -08:00
Paul Gauthier (aider)
86d9275375 refactor: Remove unused pytest import from test_exceptions.py 2024-11-08 09:59:44 -08:00
Paul Gauthier (aider)
9db6780af6 style: Sort imports and add whitespace in test_exceptions.py 2024-11-08 09:59:30 -08:00
Paul Gauthier (aider)
e10205ff69 test: Add comprehensive tests for LiteLLMExceptions module 2024-11-08 09:59:25 -08:00
Paul Gauthier
9f539436b8 test: Add test_exceptions.py to basic test suite 2024-11-08 09:59:23 -08:00
Paul Gauthier
acd75e1083 copy 2024-11-08 09:58:21 -08:00
Paul Gauthier
f30225db90 removing buggy close-stale.yml workflow 2024-11-08 09:58:06 -08:00
Paul Gauthier (aider)
007305962a style: Remove unnecessary line breaks in comment_url assignment 2024-11-08 09:56:20 -08:00
Paul Gauthier (aider)
8065e38797 style: Wrap long comment_url line to fix flake8 line length error 2024-11-08 09:56:15 -08:00
Paul Gauthier (aider)
34dc684867 style: Remove unnecessary line breaks in comment_url assignment 2024-11-08 09:56:06 -08:00
Paul Gauthier (aider)
7edc9603d0 fix: Break long line to resolve flake8 line length error 2024-11-08 09:55:59 -08:00
Paul Gauthier (aider)
479d476878 style: Format code with consistent indentation and line breaks 2024-11-08 09:55:42 -08:00
Paul Gauthier (aider)
92bbec1852 feat: Add function to process and close stale issues after 7 days of inactivity 2024-11-08 09:55:37 -08:00
Paul Gauthier
d406636878 refactor: Improve issue output formatting and message clarity 2024-11-08 09:55:35 -08:00
Paul Gauthier (aider)
6362199363 fix: Reorder stale label and comment operations in handle_stale_issues 2024-11-08 09:25:11 -08:00
Paul Gauthier
22dbcb7590 refactor: Update stale issue comment text for clarity and conciseness 2024-11-08 09:25:09 -08:00
Paul Gauthier (aider)
cefea38ee5 feat: Add issue URL to stale issue output for easier navigation 2024-11-08 09:17:55 -08:00
Paul Gauthier (aider)
d44cd01493 refactor: Add noqa comment to stale comment line to resolve flake8 warning 2024-11-08 09:11:41 -08:00
Paul Gauthier (aider)
e578655653 style: Format Python code with linter 2024-11-08 09:11:24 -08:00
Paul Gauthier (aider)
434dc27557 feat: Add stale issue detection for question-labeled issues with no activity 2024-11-08 09:11:19 -08:00
Paul Gauthier
79af39bd2c fix: Change tool_output to tool_warning for error message logging 2024-11-07 13:22:28 -08:00
Paul Gauthier (aider)
20d5a9fd4b style: Run linter to clean up whitespace in test_sendchat.py 2024-11-07 13:09:52 -08:00
Paul Gauthier (aider)
80e57ca074 fix: Remove unused import of httpx in test_sendchat.py 2024-11-07 13:09:50 -08:00
Paul Gauthier
8a3c95d8dd feat: Add LiteLLMExceptions loading in test for send chat functionality 2024-11-07 13:09:47 -08:00
Paul Gauthier
4941a360cb fix: Restore import of LiteLLMExceptions in base_coder.py 2024-11-07 13:02:17 -08:00
Paul Gauthier (aider)
9e7219c4d6 style: Run linter to clean up code formatting in sendchat.py 2024-11-07 13:02:10 -08:00
Paul Gauthier (aider)
4d96728709 fix: Remove unused import of 'backoff' in sendchat.py 2024-11-07 13:02:07 -08:00
Paul Gauthier
816fd5e65c refactor: Simplify error handling and remove unused retry exceptions code 2024-11-07 13:02:04 -08:00
Paul Gauthier (aider)
8d4175536f style: fix linting issues and whitespace in exceptions.py 2024-11-07 12:45:32 -08:00
Paul Gauthier (aider)
bba9ca3d5a feat: add get_ex_info method to lookup exception info 2024-11-07 12:45:29 -08:00
Paul Gauthier
8bc9ebf2aa feat: add LiteLLM exception handling with ExInfo dataclass 2024-11-07 12:45:27 -08:00
Paul Gauthier (aider)
dad335b8b6 refactor: remove unused comment from LiteLLMExceptions class 2024-11-07 12:19:45 -08:00
Paul Gauthier
62e93d4002 feat: add custom exceptions module 2024-11-07 12:19:41 -08:00
Paul Gauthier
728f4a0f81 copy 2024-11-07 11:54:53 -08:00
Paul Gauthier
0cafd6ee4b Merge branch 'main' of github.com:Aider-AI/aider 2024-11-07 11:50:28 -08:00
Paul Gauthier
2962e51dac test: Add webbrowser patching to TestCoder and fix argument order in test_sanity_check_repo 2024-11-07 11:48:17 -08:00
Paul Gauthier (aider)
cf5733b237 style: fix import order in test_sanity_check_repo.py 2024-11-07 11:47:39 -08:00
Paul Gauthier (aider)
c96e3326bc fix: update test to check for offer_url instead of confirm_ask 2024-11-07 11:47:35 -08:00
Paul Gauthier
1cd373c0a5 test: fix git index version test to use offer_url instead of confirm_ask 2024-11-07 11:47:33 -08:00
Paul Gauthier
ae970cf2da fix: Update webbrowser patch to use correct module path 2024-11-07 11:35:40 -08:00
Paul Gauthier
d43a01f182 cleanup 2024-11-07 11:29:47 -08:00
Paul Gauthier
42aac55b82 use offer_url 2024-11-07 11:29:05 -08:00
Paul Gauthier
a66f31dc87 bugfix 2024-11-07 11:28:52 -08:00
Paul Gauthier (aider)
64c48f2151 refactor: remove unused webbrowser import 2024-11-07 11:23:02 -08:00
Paul Gauthier (aider)
9eead8a904 style: Fix comment formatting and whitespace 2024-11-07 10:30:45 -08:00
Paul Gauthier (aider)
7761bccffe refactor: replace confirm_ask/webbrowser.open with io.offer_url 2024-11-07 10:30:41 -08:00
Paul Gauthier
a848933875 chore: add TODO comment for refactoring URL handling 2024-11-07 10:30:38 -08:00
Paul Gauthier (aider)
e475f3d752 refactor: move webbrowser import to io.py and remove from base_coder.py 2024-11-07 10:26:54 -08:00
Paul Gauthier (aider)
4d24dbc661 style: fix linting issues in io.py header comment 2024-11-07 10:26:41 -08:00
Paul Gauthier (aider)
0368c3fae9 refactor: extract URL opening functionality into dedicated io.offer_url method 2024-11-07 10:26:33 -08:00
Paul Gauthier
2cf93ccb54 refactor: simplify URL opening confirmation prompt 2024-11-07 10:26:31 -08:00
paul-gauthier
3d72cafea4 Merge pull request #2284 from Mushoz/main 2024-11-07 06:07:47 -08:00
Jaap Buurman
af0466ea83 Added Qwen2.5-7b-coder with the updated weights
The Qwen team still calls it Qwen2.5, but as can be seen from the
benchmarks the difference in performance compared to the old weights
is pretty substantial. The GGUF version of this model made by Bartowski
calls it 2.5.1 to differentiate it from the earlier version of the
same model.
2024-11-07 13:18:24 +01:00
Paul Gauthier
c84f2996ec copy 2024-11-06 20:13:38 -08:00
Paul Gauthier
add9b83d3b copy 2024-11-06 20:13:31 -08:00
Paul Gauthier
5411fb6fd4 Merge branch 'main' of github.com:Aider-AI/aider 2024-11-06 20:13:02 -08:00
paul-gauthier
49fc1b40e5 Merge pull request #2277 from lattwood/lattwood/bedrock_claude_feature_parity
Add Sonnet & Haiku ModelSettings for Bedrock
2024-11-06 09:03:18 -08:00
Logan Attwood
daef2eecdd Add Sonnet & Haiku ModelSettings for Bedrock 2024-11-06 12:28:24 -04:00
Paul Gauthier
1520422cc3 copy 2024-11-05 15:39:17 -08:00
Paul Gauthier
c7530085a6 set version to 0.62.2.dev 2024-11-05 12:41:44 -08:00
Paul Gauthier
bf43c567d8 version bump to 0.62.1 2024-11-05 12:40:17 -08:00
Paul Gauthier
b81f3e4f8d style: reorder chart canvas elements in blame.md 2024-11-05 12:11:14 -08:00
Paul Gauthier
97051b9d40 refactor: Replace GitTemporaryDirectory with ChdirTemporaryDirectory 2024-11-05 11:54:27 -08:00
Paul Gauthier
90730845de style: fix indentation in test_editblock.py 2024-11-05 11:43:04 -08:00
Paul Gauthier (aider)
f7c0c433c3 refactor: add mock for sendchat.simple_send_with_retries in test 2024-11-05 11:42:31 -08:00
Paul Gauthier
538752d0cf test: add mock for sendchat.simple_send_with_retries in editblock test 2024-11-05 11:42:30 -08:00
Paul Gauthier
c71a92ac84 fix: handle empty original content when creating new files 2024-11-05 09:14:01 -08:00
Paul Gauthier
85f23b3408 copy 2024-11-05 09:06:56 -08:00
Paul Gauthier
44cab0a4d7 refactor: update Claude model references to use 3.5-haiku-20241022 2024-11-05 09:01:35 -08:00
Paul Gauthier (aider)
33db8ee0c3 feat: enable repo map for Claude 3.5 Haiku models 2024-11-05 08:49:56 -08:00
Paul Gauthier
da4b3770c0 refactor: set use_repo_map=True for Claude 3.5 Haiku models 2024-11-05 08:49:53 -08:00
Paul Gauthier
12698998b9 feat: add verbose output for file processing in RepoMap 2024-11-05 08:48:06 -08:00
Paul Gauthier
6177856baf refactor: simplify issues script by removing redundant flag 2024-11-05 08:45:48 -08:00
Paul Gauthier (aider)
54b9c46b96 style: Fix whitespace in issues.py script 2024-11-05 07:04:15 -08:00
Paul Gauthier (aider)
2dd83e7dbe feat: exclude pull requests from unlabeled issues search 2024-11-05 07:04:11 -08:00
Paul Gauthier (aider)
17351e8f91 refactor: extract issue handling into dedicated functions 2024-11-05 07:02:24 -08:00
Paul Gauthier
e8c153f72f docs: add refactoring comments for issue handling functions 2024-11-05 07:02:22 -08:00
Paul Gauthier (aider)
ddfd1276c5 style: Format issues.py with black linter 2024-11-05 06:58:44 -08:00
Paul Gauthier (aider)
46251c6a1c feat: add function to find unlabeled issues with paul-gauthier comments 2024-11-05 06:58:40 -08:00
Paul Gauthier
e699968be5 copy 2024-11-05 06:53:13 -08:00
Paul Gauthier
389b58b75b fix: remove premature return after disabling analytics 2024-11-05 06:52:50 -08:00
Paul Gauthier
a7cf34dea4 copy 2024-11-04 15:40:21 -08:00
Paul Gauthier
e601682706 updated blame 2024-11-04 13:00:42 -08:00
Paul Gauthier
55f16dc0b5 copy 2024-11-04 12:53:10 -08:00
Paul Gauthier
775011033f set version to 0.62.1.dev 2024-11-04 12:50:13 -08:00
Paul Gauthier
8ffe21a2dd version bump to 0.62.0 2024-11-04 12:48:44 -08:00
Paul Gauthier
73d63ef5ce copy 2024-11-04 12:37:21 -08:00
Paul Gauthier
e12b1a9184 copy 2024-11-04 12:36:46 -08:00
Paul Gauthier
d099a95b92 copy 2024-11-04 12:36:38 -08:00
Paul Gauthier
496ed90439 copy 2024-11-04 12:17:02 -08:00
Paul Gauthier (aider)
7883db1834 feat: add --haiku flag for claude-3-5-haiku model selection 2024-11-04 12:14:23 -08:00
Paul Gauthier
0cfc23b1a8 refactor: remove unused haiku formatting option 2024-11-04 12:14:22 -08:00
Paul Gauthier (aider)
d33104aec1 refactor: move haiku flag next to sonnet flag in args 2024-11-04 12:13:27 -08:00
Paul Gauthier
711b2a431c chore: add comment about sonnet flag placement 2024-11-04 12:13:25 -08:00
Paul Gauthier (aider)
09d21b5951 feat: add --haiku flag to format responses as haikus 2024-11-04 12:13:05 -08:00
Paul Gauthier
d9193387cc feat: add haiku command line argument placeholder 2024-11-04 12:13:04 -08:00
Paul Gauthier
d5330ae2f3 refactor: update highlight model constant in leaderboard chart 2024-11-04 12:12:32 -08:00
Paul Gauthier (aider)
571c1b47b5 refactor: extract Haiku model name to constant 2024-11-04 12:11:48 -08:00
Paul Gauthier (aider)
0c9d4dd123 fix: update Chart.js scales config and add null checks for labels 2024-11-04 12:09:47 -08:00
Paul Gauthier (aider)
7d79408683 feat: add distinct color for 3.5 Haiku models in leaderboard chart 2024-11-04 12:08:05 -08:00
Paul Gauthier
e6d4c3558b add 3.5 haiku to leaderboard 2024-11-04 11:40:37 -08:00
Paul Gauthier
3be2109964 fix: update Claude 3.5 Haiku models to use diff mode instead of whole 2024-11-04 11:33:40 -08:00
Paul Gauthier
ce37ff26b5 refactor: remove redundant examples_as_sys_msg flag from Claude 3.5 models 2024-11-04 11:32:41 -08:00
Paul Gauthier
03bbdb010f add haiku metadata 2024-11-04 11:18:55 -08:00
Paul Gauthier (aider)
0bde1da42c feat: add Claude 3.5 Haiku model and provider variants 2024-11-04 10:46:55 -08:00
Paul Gauthier
987cb3bca9 feat: add claude-3-haiku model configuration 2024-11-04 10:46:54 -08:00
Paul Gauthier
0b11024967 copy 2024-11-04 10:35:37 -08:00
Paul Gauthier (aider)
dfaaedb466 style: remove empty line at start of main.py 2024-11-04 10:34:27 -08:00
Paul Gauthier (aider)
8bc0d5544d feat: add --apply-clipboard-edits switch for direct clipboard editing 2024-11-04 10:34:21 -08:00
Paul Gauthier
c67e63bc09 feat: add clipboard edit mode via --apply-clipboard-edits flag 2024-11-04 10:34:19 -08:00
Paul Gauthier
129f5fae76 cleanup 2024-11-04 09:09:45 -08:00
Paul Gauthier
966a613ffe fix: handle non-existent files in EditBlockCoder #2233 2024-11-04 09:08:00 -08:00
Paul Gauthier (aider)
96ad107c19 style: add newline before error message in io.py 2024-11-04 09:05:28 -08:00
Paul Gauthier (aider)
ebdc126b00 feat: add traceback printing for file read errors 2024-11-04 09:05:24 -08:00
Paul Gauthier
5e1be966ed chore: add comment about printing traceback stack in error handling 2024-11-04 09:05:23 -08:00
Paul Gauthier
0022c1a67e copy 2024-11-01 11:26:39 -07:00
Paul Gauthier
6a0380b8c0 copy 2024-11-01 09:46:27 -07:00
Paul Gauthier
305b4fee87 set version to 0.61.1.dev 2024-11-01 09:40:02 -07:00
Paul Gauthier
9e18fc55d3 version bump to 0.61.0 2024-11-01 09:38:46 -07:00
Paul Gauthier
ebc9a30cc6 copy 2024-11-01 09:23:37 -07:00
Paul Gauthier
f53f5927df Show friendly API error messages 2024-11-01 09:20:31 -07:00
Paul Gauthier (aider)
78a8d19ac5 fix: pass exception objects directly to check_and_open_urls 2024-11-01 09:12:50 -07:00
Paul Gauthier
bfa9dce1e0 refactor: improve API error messages and display format 2024-11-01 09:12:49 -07:00
Paul Gauthier (aider)
3b2f1f1e66 style: format long error messages with line breaks 2024-11-01 09:09:03 -07:00
Paul Gauthier (aider)
b2bcca967f refactor: update check_and_open_urls to handle exceptions with friendly messages 2024-11-01 09:08:57 -07:00
Paul Gauthier
929aeb22bf refactor: Update check_and_open_urls to handle exceptions with user-friendly messages 2024-11-01 09:08:56 -07:00
Paul Gauthier
66ad186edd start /save commands with /drop 2024-11-01 09:04:55 -07:00
Paul Gauthier
c098354a67 copy 2024-11-01 09:03:44 -07:00
Paul Gauthier (aider)
d67d319b31 style: fix whitespace and line spacing issues 2024-11-01 08:12:17 -07:00
Paul Gauthier (aider)
93639039d4 feat: disable spinner when stdout is not a tty 2024-11-01 08:12:13 -07:00
Paul Gauthier
789535cb85 feat: disable spinner animation when stdout is not a tty 2024-11-01 08:12:11 -07:00
Paul Gauthier
d8e1e823e7 update deps with chained constraints 2024-10-31 16:04:37 -07:00
Paul Gauthier (aider)
5b9fe6fee0 refactor: convert pip-compile script to use loop for requirements compilation 2024-10-31 16:03:12 -07:00
Paul Gauthier (aider)
91bc8cddf3 fix: add dependency constraints between requirements files 2024-10-31 16:02:33 -07:00
Paul Gauthier
392162ae84 copy 2024-10-31 15:33:17 -07:00
Paul Gauthier
0c4e4a123a pin pillow<11 to avoid regressing streamlit to ancient 1.22 2024-10-31 15:31:58 -07:00
Paul Gauthier (aider)
27711010a0 refactor: update --gui/--browser to use BooleanOptionalAction 2024-10-31 15:01:29 -07:00
Paul Gauthier
401967c27f refactor: convert browser flag to boolean argument 2024-10-31 15:01:26 -07:00
Paul Gauthier (aider)
d1b25b9a72 fix: remove duplicate test_cmd_read_only_with_image_file method 2024-10-31 15:00:21 -07:00
Paul Gauthier
df478e1f8f copy 2024-10-31 14:59:52 -07:00
Paul Gauthier (aider)
a459f0e130 test: add test for read-only command with image files 2024-10-31 14:59:46 -07:00
Paul Gauthier (aider)
66b6788990 test: add test for image file handling in read command 2024-10-31 14:59:22 -07:00
Paul Gauthier (aider)
624f9122ab style: fix whitespace in commands.py 2024-10-31 14:58:29 -07:00
Paul Gauthier (aider)
704350286c feat: allow /read command to work with images for vision models 2024-10-31 14:58:23 -07:00
Paul Gauthier (aider)
ec40ff5987 feat: prevent adding image files with /read command 2024-10-31 14:57:44 -07:00
Paul Gauthier
af7aaad903 fix: handle RecursionError during tree traversal in linter 2024-10-31 14:55:54 -07:00
Paul Gauthier
3794cf941f feat: add support for claude-3-5-sonnet-latest model 2024-10-31 14:53:50 -07:00
Paul Gauthier
72c1f25005 refactor: Move StringIO import to top of file 2024-10-31 14:49:16 -07:00
Paul Gauthier (aider)
c13536e641 style: move rich.columns import to top of file 2024-10-31 14:48:12 -07:00
Paul Gauthier (aider)
7a9988c060 style: fix linting issues in io.py 2024-10-31 14:45:35 -07:00
Paul Gauthier (aider)
b9939d4bd9 refactor: improve file list display with section headers 2024-10-31 14:45:31 -07:00
Paul Gauthier (aider)
b71a3148cf style: fix import order in io.py 2024-10-31 14:43:29 -07:00
Paul Gauthier (aider)
42abdb0a41 feat: add compact file listing using rich Columns when pretty=True 2024-10-31 14:43:25 -07:00
Paul Gauthier
4c39e92773 copy 2024-10-31 14:39:27 -07:00
Paul Gauthier
b7f7204c4e copy 2024-10-31 14:29:53 -07:00
Paul Gauthier (aider)
8f73c15f48 feat: skip analytics update in check mode 2024-10-31 14:16:34 -07:00
Paul Gauthier
17330e53c3 refactor: Improve error handling and URL processing in chat functionality 2024-10-31 14:13:36 -07:00
Paul Gauthier (aider)
3fcd79e165 style: fix line length and comment formatting 2024-10-31 14:03:33 -07:00
Paul Gauthier (aider)
750b12282f refactor: strip trailing punctuation from URLs before displaying 2024-10-31 14:03:27 -07:00
Paul Gauthier
94c5ff2fd2 refactor: simplify URL pattern matching and cleanup commented code 2024-10-31 14:03:26 -07:00
Paul Gauthier
85ad2826da test: add debug dump of URL pattern regex 2024-10-31 14:02:05 -07:00
Paul Gauthier
15c62e3e43 fix: improve URL pattern to handle trailing commas in links 2024-10-31 14:01:41 -07:00
Paul Gauthier (aider)
fea7134064 style: fix comment spacing and remove commented code 2024-10-31 14:01:28 -07:00
Paul Gauthier (aider)
da706d9eb8 fix: update URL regex to strip trailing punctuation 2024-10-31 14:01:21 -07:00
Paul Gauthier
9a37c0491d refactor: improve URL handling and error reporting in base coder 2024-10-31 14:01:20 -07:00
Paul Gauthier (aider)
1d3d6a589f style: remove unused Optional import 2024-10-31 13:52:50 -07:00
Paul Gauthier (aider)
c5a439e4e8 style: sort imports alphabetically in base_coder.py 2024-10-31 13:52:41 -07:00
Paul Gauthier (aider)
2b7584b651 refactor: extract URL checking logic into separate method 2024-10-31 13:52:37 -07:00
Paul Gauthier (aider)
1ef60b5a40 refactor: add URL checking function with browser open option 2024-10-31 13:52:24 -07:00
Paul Gauthier
b79321da51 chore: add TODO comments for URL handling refactoring 2024-10-31 13:52:22 -07:00
Paul Gauthier (aider)
6829b29ef4 feat: add error base class hierarchy to retry exception messages 2024-10-31 13:50:12 -07:00
Paul Gauthier
a9c0d20347 chore: add comment about error base class inspection 2024-10-31 13:50:11 -07:00
Paul Gauthier (aider)
25a906950c refactor: move webbrowser import to top of file 2024-10-31 13:48:28 -07:00
Paul Gauthier
740534dcff refactor: Move webbrowser import to top of file 2024-10-31 13:48:27 -07:00
Paul Gauthier (aider)
de65d86122 style: fix string quotes and line wrapping in error URL handling 2024-10-31 13:48:08 -07:00
Paul Gauthier (aider)
98bf9bd26d feat: add URL detection and viewer for error messages 2024-10-31 13:48:01 -07:00
Paul Gauthier
ade615c445 chore: Add TODO comment for URL handling in error messages 2024-10-31 13:48:00 -07:00
Paul Gauthier
d959e1c60d test: fix analytics disable test assertion for better clarity 2024-10-31 13:31:43 -07:00
Paul Gauthier (aider)
8d2f66fe34 test: add temp_data_dir fixture to all analytics tests 2024-10-31 13:28:31 -07:00
Paul Gauthier (aider)
66dc8dbccd style: remove unused MagicMock import 2024-10-31 13:22:59 -07:00
Paul Gauthier (aider)
b228bcab8c style: Fix linting issues in test_analytics.py 2024-10-31 13:22:50 -07:00
Paul Gauthier (aider)
ccbf1482c1 test: add comprehensive test suite for Analytics class 2024-10-31 13:22:47 -07:00
Paul Gauthier
f9a0946472 test: add basic analytics test suite 2024-10-31 13:22:45 -07:00
Paul Gauthier
faa80b7699 updated deps 2024-10-31 13:21:56 -07:00
Paul Gauthier
1eb2c724a5 copy 2024-10-31 13:15:33 -07:00
Paul Gauthier
c43e7f998e copy 2024-10-31 13:11:00 -07:00
Paul Gauthier
3e2454b84b cleanup 2024-10-31 11:49:17 -07:00
Paul Gauthier
2817766cf5 cleanup 2024-10-31 11:44:24 -07:00
Paul Gauthier
ba7656bc1c cleanup 2024-10-31 11:37:18 -07:00
Paul Gauthier
c14392a35a copy 2024-10-31 11:33:27 -07:00
Paul Gauthier
6bfb258473 copy 2024-10-31 11:31:32 -07:00
Paul Gauthier
1e872599fd copy 2024-10-31 11:02:04 -07:00
Paul Gauthier
c08b7f9c22 Merge branch 'main' into mixpanel 2024-10-31 10:09:36 -07:00
Paul Gauthier
6e4ccf8715 copy 2024-10-31 10:09:33 -07:00
Paul Gauthier (aider)
e4913669d4 refactor: simplify event method to use main_model attributes 2024-10-31 10:08:43 -07:00
Paul Gauthier
8e098752bd refactor: Use main_model attributes for weak and editor models in analytics 2024-10-31 10:08:41 -07:00
Paul Gauthier (aider)
6867dab89c style: remove trailing whitespace in analytics.py 2024-10-31 10:06:52 -07:00
Paul Gauthier (aider)
09a9fac91e refactor: extract model redaction logic and add model params 2024-10-31 10:05:10 -07:00
Paul Gauthier
2fd1681fab refactor: add weak_model and editor_model args to analytics event method 2024-10-31 10:05:08 -07:00
Paul Gauthier
ece91dc724 copy 2024-10-31 09:57:22 -07:00
Paul Gauthier
01bf154151 copy 2024-10-31 09:53:04 -07:00
Paul Gauthier
b5916981b3 copy 2024-10-30 20:19:47 -07:00
Paul Gauthier
a68b87272b copy 2024-10-30 20:19:08 -07:00
Paul Gauthier (aider)
88b55df1c6 chore: add privacy policy to update-docs script 2024-10-30 20:18:41 -07:00
Paul Gauthier (aider)
676c017eb1 feat: add git-based last updated date to privacy policy 2024-10-30 20:17:53 -07:00
Paul Gauthier
139b8a2d4a docs: add privacy policy document 2024-10-30 20:17:15 -07:00
Paul Gauthier
24c68928d6 feat: Add analytics tracking for model warnings 2024-10-30 14:34:27 -07:00
Paul Gauthier
f957111141 feat: Add model info manager import to analytics module 2024-10-30 14:30:14 -07:00
Paul Gauthier
e94e60b1d2 refactor: improve model name redaction in analytics and model info handling 2024-10-30 14:29:29 -07:00
Paul Gauthier (aider)
a565a63436 style: Fix import formatting in test_models.py 2024-10-30 13:21:47 -07:00
Paul Gauthier (aider)
a045bda171 refactor: update test to use ModelInfoManager instead of get_model_info 2024-10-30 13:21:43 -07:00
Paul Gauthier (aider)
a3d78e0944 style: split long URL string constant into multiple lines 2024-10-30 13:21:21 -07:00
Paul Gauthier
8082cbed98 refactor: rename get_model_flexible to get_model_from_cached_json_db 2024-10-30 13:21:19 -07:00
Paul Gauthier (aider)
aba8b5d00a style: fix linting issues and whitespace in models.py 2024-10-30 13:17:54 -07:00
Paul Gauthier (aider)
3d5a4d9303 refactor: encapsulate model info functionality into ModelInfoManager class 2024-10-30 13:17:49 -07:00
Paul Gauthier
a899b0e27e refactor: Extract model info handling into a dedicated class 2024-10-30 13:17:47 -07:00
Paul Gauthier
267872b7e4 feat: add opt-in analytics collection with privacy notice 2024-10-30 13:15:57 -07:00
Paul Gauthier (aider)
bd59a8debf refactor: extract analytics disable logic into dedicated method 2024-10-30 12:25:18 -07:00
Paul Gauthier
c0e137889c style: Update analytics refactoring comment with method name 2024-10-30 12:25:17 -07:00
Paul Gauthier
5b84b901b2 chore: add TODO comment for analytics refactoring 2024-10-30 12:24:39 -07:00
Paul Gauthier (aider)
059883abf7 feat: add asked_opt_in tracking to analytics 2024-10-30 12:17:17 -07:00
Paul Gauthier
0b622a6fd7 chore: add comment for analytics opt-in tracking implementation 2024-10-30 12:17:15 -07:00
Paul Gauthier
97989dd51a Merge branch 'main' into mixpanel 2024-10-30 12:06:38 -07:00
Paul Gauthier (aider)
d81c421bfe test: mock webbrowser.open in test setup 2024-10-30 12:04:43 -07:00
Paul Gauthier (aider)
bce586f510 fix: remove unused webbrowser import in test file 2024-10-30 12:00:12 -07:00
Paul Gauthier (aider)
a70b364842 style: fix import order and quote style in test file 2024-10-30 11:59:52 -07:00
Paul Gauthier (aider)
920e8da57c test: mock webbrowser.open in git index version test 2024-10-30 11:59:48 -07:00
Paul Gauthier (aider)
71a8b286dc style: fix linting issues in test_sanity_check_repo.py 2024-10-30 11:59:25 -07:00
Paul Gauthier (aider)
ee4decc50b fix: add missing urls import in test_sanity_check_repo.py 2024-10-30 11:59:21 -07:00
Paul Gauthier (aider)
63330aa833 style: fix line wrapping in test file 2024-10-30 11:59:08 -07:00
Paul Gauthier (aider)
15a0eb976f test: update git index version test to check confirm_ask call 2024-10-30 11:59:04 -07:00
Paul Gauthier
4f52ad385a copy 2024-10-30 11:52:09 -07:00
Paul Gauthier
cd1496f91b copy 2024-10-30 11:51:49 -07:00
Paul Gauthier (aider)
31babf39cd style: fix comment spacing in sanity_check_repo function 2024-10-30 11:42:50 -07:00
Paul Gauthier (aider)
fe3dbba1d9 feat: add browser URL launch with user confirmation prompt 2024-10-30 11:42:46 -07:00
Paul Gauthier
763724ed4e docs: add comment about prompting user for URL opening 2024-10-30 11:42:44 -07:00
Paul Gauthier
9e0e68caf9 copy 2024-10-30 11:41:39 -07:00
Paul Gauthier
52f697e513 style: remove extra blank line before main block 2024-10-30 11:41:11 -07:00
Paul Gauthier (aider)
aeca62bcf6 fix: remove unused import of urls module 2024-10-30 11:41:04 -07:00
Paul Gauthier
7e574bc214 refactor: improve documentation URL handling and error messages 2024-10-30 11:40:56 -07:00
Paul Gauthier (aider)
e9beb1336c style: fix line length in model warnings confirmation prompt 2024-10-30 11:34:24 -07:00
Paul Gauthier (aider)
4ac8386313 feat: add browser launch for model warnings documentation 2024-10-30 11:34:19 -07:00
Paul Gauthier
f0233455d2 feat: update model warning prompt to offer documentation link 2024-10-30 11:34:18 -07:00
Paul Gauthier
5c28dd039c pip compile 2024-10-30 09:41:57 -07:00
Paul Gauthier
26d1ab7a5f copy 2024-10-30 09:40:54 -07:00
Paul Gauthier
068fb38a5d Merge branch 'main' into mixpanel 2024-10-30 09:40:01 -07:00
Paul Gauthier
53e7eba00b copy 2024-10-30 06:39:48 -07:00
Paul Gauthier
854d908fe0 refactor: improve chat history file error handling and messaging 2024-10-30 06:37:59 -07:00
Paul Gauthier
ea3359fb4b test: adjust warning count assertion in model test 2024-10-30 06:33:31 -07:00
Paul Gauthier (aider)
55a2ba4bd6 style: Fix comment formatting in test_models.py 2024-10-30 06:32:22 -07:00
Paul Gauthier (aider)
20ca9c84c7 test: add warning message debug print in model test 2024-10-30 06:32:18 -07:00
Paul Gauthier
0d86124b15 test: add comment about tool warning args inspection 2024-10-30 06:32:17 -07:00
Paul Gauthier
554fa98c48 fix: simplify version check for dev mode 2024-10-30 06:30:11 -07:00
Paul Gauthier (aider)
eb92fa4f88 fix: handle TypeError when checking __version__ for dev mode 2024-10-30 06:26:50 -07:00
Paul Gauthier
0424e4b00a refactor: improve SQLite error handling and logging in tags cache 2024-10-29 15:09:22 -07:00
Paul Gauthier (aider)
adca062081 feat: improve SQLite error handling with original exception details 2024-10-29 15:05:16 -07:00
Paul Gauthier
ef0fcb8f38 refactor: Improve SQLite cache error handling and import organization 2024-10-29 15:04:00 -07:00
Paul Gauthier (aider)
0feed0047c style: fix whitespace and formatting in repomap.py 2024-10-29 14:59:55 -07:00
Paul Gauthier (aider)
7f027ff6e5 feat: add auto-recovery for corrupted tags cache 2024-10-29 14:59:50 -07:00
Paul Gauthier (aider)
e25a46c892 fix: wrap TAGS_CACHE length check in try/except block for SQLite errors 2024-10-29 14:58:00 -07:00
Paul Gauthier (aider)
68916b1186 feat: add error handling for SQLite tags cache operations 2024-10-29 14:55:43 -07:00
Paul Gauthier
e9771588e4 copy 2024-10-29 14:48:39 -07:00
Paul Gauthier
e1d55c82b1 refactor: Improve edit handling with dry run and path resolution 2024-10-29 14:31:12 -07:00
Paul Gauthier (aider)
5b6be29c1c chore: remove obsolete comment about path variable 2024-10-29 14:28:39 -07:00
Paul Gauthier
28d9f6f8da refactor: add dry run mode to apply_edits method 2024-10-29 14:28:38 -07:00
Paul Gauthier (aider)
3ccae4eff7 style: fix line length in test_commands.py 2024-10-29 14:19:53 -07:00
Paul Gauthier (aider)
3ad240a10e fix: normalize path separators in save/load tests for Windows compatibility 2024-10-29 14:19:47 -07:00
Paul Gauthier
87a31a583a refactor: remove unused comment in EditBlockCoder 2024-10-29 14:11:13 -07:00
Paul Gauthier (aider)
7553104433 refactor: handle updated edits array returned from apply_edits 2024-10-29 14:10:21 -07:00
Paul Gauthier
f9604633e6 fix: handle updated edits array in apply_edits return value 2024-10-29 14:10:19 -07:00
Paul Gauthier (aider)
eb9a73bdb0 fix: strip whitespace from file paths before resolving in test commands 2024-10-29 14:04:19 -07:00
Paul Gauthier (aider)
d75e75190d style: Fix regex string formatting in test commands 2024-10-29 14:03:46 -07:00
Paul Gauthier (aider)
94a49e601c refactor: use regex to normalize /add command spaces in tests 2024-10-29 14:03:40 -07:00
Paul Gauthier (aider)
3df3d86295 style: fix linting issues in test_commands.py 2024-10-29 14:02:43 -07:00
Paul Gauthier (aider)
63f8979f2b fix: normalize whitespace in command text assertions 2024-10-29 14:02:37 -07:00
Paul Gauthier
ad94e49ef5 test: fix failing test cases for save and load commands 2024-10-29 14:02:35 -07:00
Paul Gauthier
b40ff2a601 fix: improve o1 model detection with startswith check 2024-10-29 14:00:56 -07:00
Paul Gauthier
a4be01b474 refactor: move --load command execution before message processing 2024-10-29 13:59:41 -07:00
Paul Gauthier
c5dc44a73f style: simplify command execution output message 2024-10-29 13:59:04 -07:00
Paul Gauthier (aider)
358cbc9388 feat: add filename autocompletion to /load and /save commands 2024-10-29 13:58:25 -07:00
Paul Gauthier
2e5fa9dea4 style: align /add commands in history file for better readability 2024-10-29 13:58:23 -07:00
Paul Gauthier
717592463e feat: add --load option to execute commands from file on launch 2024-10-29 13:54:42 -07:00
Paul Gauthier (aider)
347a9f2a6d feat: add --load argument to execute commands from file 2024-10-29 13:53:19 -07:00
Paul Gauthier
d288122fab chore: add comment for load command implementation 2024-10-29 13:53:17 -07:00
Paul Gauthier (aider)
d1cf3d4600 refactor: conditionally set cursor shape only in vi mode 2024-10-29 13:50:40 -07:00
Paul Gauthier
5188872791 style: add comment about vi mode cursor config 2024-10-29 13:50:38 -07:00
Paul Gauthier
a57a06e8c7 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-29 13:49:50 -07:00
Paul Gauthier (aider)
347ad34038 fix: update file path comparison in commands test to handle macOS prefix 2024-10-29 13:48:16 -07:00
Paul Gauthier (aider)
ccdd333ba3 fix: update test to use os.path.samefile for path comparison 2024-10-29 13:45:03 -07:00
Paul Gauthier (aider)
56f3220d4c fix: handle macOS /private/ prefix in file path tests 2024-10-29 13:21:31 -07:00
Paul Gauthier (aider)
26a85c2047 style: fix line length in test_commands.py 2024-10-29 13:20:49 -07:00
Paul Gauthier (aider)
f800ce1e5a test: use os.path.samefile for file path comparison in save/load test 2024-10-29 13:20:44 -07:00
Paul Gauthier
d4103cc271 chore: Remove unused comment in test file 2024-10-29 13:20:42 -07:00
Paul Gauthier (aider)
c3ba3b6f48 style: fix whitespace and comment formatting in test_commands.py 2024-10-29 13:19:15 -07:00
Paul Gauthier (aider)
be54df4084 refactor: improve path comparison in command tests using os.path.samefile 2024-10-29 13:19:09 -07:00
Paul Gauthier
d06c6f8557 style: improve clarity of comment in test_commands.py 2024-10-29 13:18:53 -07:00
Paul Gauthier
a876561ea0 test: add comment about parsing text in session file test 2024-10-29 13:17:50 -07:00
Paul Gauthier (aider)
6dc0b8d853 fix: use absolute paths for read-only files outside repo root 2024-10-29 13:14:37 -07:00
Paul Gauthier (aider)
460311d49e style: fix line continuation formatting in test file 2024-10-29 13:11:50 -07:00
Paul Gauthier (aider)
94396070e8 test: add test for saving and loading multiple external files 2024-10-29 13:11:44 -07:00
Paul Gauthier (aider)
4a3cb8dc95 fix: use platform-agnostic paths in test_commands.py 2024-10-29 13:11:00 -07:00
Paul Gauthier
f9005451fa test: add comment about Windows path separator issue in test_commands.py 2024-10-29 13:10:58 -07:00
paul-gauthier
16e292b1fd Merge pull request #2180 from kAIto47802/fix-o1-system-prompt 2024-10-29 13:03:35 -07:00
Paul Gauthier (aider)
7d37793765 style: fix linting issues by removing extra blank line 2024-10-29 12:54:12 -07:00
Paul Gauthier (aider)
9e9c162a16 style: fix indentation in test_cmd_save_and_load_with_external_file 2024-10-29 12:54:05 -07:00
Paul Gauthier (aider)
8d6db81a40 style: fix linting issues in test_commands.py 2024-10-29 12:53:27 -07:00
Paul Gauthier (aider)
425bd8932b test: add save/load test with external read-only file 2024-10-29 12:53:22 -07:00
Paul Gauthier
38820701be test: add comment for read-only file test case 2024-10-29 12:53:20 -07:00
Paul Gauthier
1bc74676ff copy 2024-10-29 12:49:16 -07:00
Paul Gauthier (aider)
0c37f002c9 style: remove extra newlines and fix trailing comma 2024-10-29 12:48:21 -07:00
Paul Gauthier (aider)
18c41b6128 refactor: move test_cmd_save_and_load to test_commands.py 2024-10-29 12:48:11 -07:00
Paul Gauthier
5876af4e94 test: add test for cmd_save and cmd_load functionality 2024-10-29 12:48:08 -07:00
Paul Gauthier (aider)
e1d145013a style: remove trailing newline in test_commands.py 2024-10-29 12:46:37 -07:00
Paul Gauthier (aider)
143eeff4da test: add tests for cmd_save and cmd_load commands 2024-10-29 12:46:31 -07:00
Paul Gauthier
3a7e4bac34 test: add TODO comment for cmd_save and cmd_load test coverage 2024-10-29 12:46:29 -07:00
Paul Gauthier (aider)
f5ca162576 style: fix whitespace and comment formatting 2024-10-29 12:43:56 -07:00
Paul Gauthier (aider)
dbefa6b010 feat: add /save command to store chat session file list 2024-10-29 12:43:51 -07:00
Paul Gauthier
79cdff6163 feat: add /save command to persist added files for /load 2024-10-29 12:43:49 -07:00
Paul Gauthier (aider)
b111fc357c fix: use IO encoding and handle decode errors in cmd_load 2024-10-29 12:42:33 -07:00
Paul Gauthier
2af48e159c feat: add encoding hint for file loading in commands 2024-10-29 12:42:31 -07:00
Paul Gauthier (aider)
6cec44e402 style: fix string quotes and whitespace in commands.py 2024-10-29 12:41:10 -07:00
Paul Gauthier (aider)
fc6c01a9a5 feat: add command to load and execute commands from file 2024-10-29 12:41:01 -07:00
Paul Gauthier
01439875af feat: add comment for future cmd_load implementation 2024-10-29 12:40:57 -07:00
kAIto47802
fcdf998fac Fix o1 settings 2024-10-29 08:47:24 +09:00
Paul Gauthier
ed4ad45e3d copy 2024-10-28 15:12:06 -07:00
Paul Gauthier
907c1dbe2b refactor: split error and retry messages in simple_send_with_retries 2024-10-28 15:10:27 -07:00
Paul Gauthier (aider)
3baad86afd refactor: consolidate error and retry messages into single print statement 2024-10-28 15:09:22 -07:00
Paul Gauthier (aider)
0351924628 test: update print call count assertions in sendchat tests 2024-10-28 15:09:11 -07:00
Paul Gauthier
29250f82ed test: fix print call count assertions in sendchat tests 2024-10-28 15:07:50 -07:00
Paul Gauthier
a819bf1d64 test: fix assertion errors in sendchat retry tests 2024-10-28 15:07:11 -07:00
Paul Gauthier (aider)
bc515cf74a refactor: add retry loop to simple_send_with_retries function 2024-10-28 15:05:07 -07:00
Paul Gauthier
f9c45432e6 refactor: Move retry logic from base_coder to sendchat module 2024-10-28 15:05:06 -07:00
Paul Gauthier
54d55c857b refactor: update retry exceptions to use openai instead of litellm 2024-10-28 14:40:42 -07:00
Paul Gauthier
8e2a4b47d6 fix: update litellm exception imports and error handling 2024-10-28 14:29:42 -07:00
Paul Gauthier (aider)
513f06be46 refactor: move retry_exceptions import to top of test file 2024-10-28 14:28:49 -07:00
Paul Gauthier
0fb79917ff test: add test for retry_exceptions function call 2024-10-28 14:28:48 -07:00
Paul Gauthier (aider)
cd133f95ee style: fix linting issues with whitespace and line breaks 2024-10-28 14:27:26 -07:00
Paul Gauthier (aider)
3d66b53791 test: add basic test for retry_exceptions function 2024-10-28 14:27:20 -07:00
Paul Gauthier
bf63e7045b refactor: simplify litellm exception imports 2024-10-28 14:27:19 -07:00
Paul Gauthier
e2dff0a74b #2120 2024-10-25 15:47:30 -07:00
Paul Gauthier (aider)
bf60e58d5b fix: use os.path.join for cross-platform path handling in tests 2024-10-25 10:57:04 -07:00
Paul Gauthier
e3a3a55dd5 fix: make file paths portable for Windows compatibility in tests 2024-10-25 10:57:03 -07:00
Paul Gauthier
1ed2eefff4 copy 2024-10-25 09:38:10 -07:00
Paul Gauthier
df65e87ef3 test: update InputOutput initialization with fancy_input param in tests 2024-10-25 09:24:52 -07:00
Paul Gauthier
ddb876d2fe only glob, not rglob for /read 2024-10-25 09:22:50 -07:00
Paul Gauthier
a080581329 refactor: improve file path handling with glob and rglob 2024-10-25 07:49:19 -07:00
Paul Gauthier (aider)
f70a82791b fix: handle absolute paths and globs in cmd_read_only 2024-10-25 07:43:31 -07:00
Paul Gauthier
5d3a60228c fix: use Path.rglob instead of glob.glob for recursive file matching 2024-10-25 07:43:29 -07:00
Paul Gauthier
fd820dbfe2 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-25 07:41:02 -07:00
paul-gauthier
b911ceaa61 Merge pull request #2126 from webkonstantin/fix-read-only-from-working-dir
fix: Impossible to /read-only from another working directory
2024-10-25 07:40:57 -07:00
Paul Gauthier
9edf9b4186 refactor: extract get_rel_fname function for path resolution 2024-10-25 07:36:29 -07:00
Paul Gauthier
be74259df6 fix: add missing AnthropicError exception to retry list 2024-10-25 07:31:39 -07:00
Paul Gauthier
29293cc8ac fix: update import path for AnthropicError in retry_exceptions 2024-10-25 07:07:36 -07:00
Paul Gauthier
9e7995b730 bump deps 2024-10-25 06:55:47 -07:00
Konstantin L
ba9fdaa755 fix: Impossible to /read-only from another working directory 2024-10-25 10:59:23 +02:00
Paul Gauthier
dde2dee304 fix last test 2024-10-24 14:31:41 -07:00
Paul Gauthier (aider)
55a99143c2 test: set fancy_input=False in all InputOutput() test instances 2024-10-24 14:31:11 -07:00
Paul Gauthier
ba2bee61de test: fix confirm_ask_yes_no test by disabling fancy input 2024-10-24 14:31:09 -07:00
Paul Gauthier (aider)
5fd8fb15b9 fix: add fancy_input=False to all InputOutput test initializations 2024-10-24 14:27:53 -07:00
Paul Gauthier
8908a48b68 copy 2024-10-24 14:25:08 -07:00
Paul Gauthier (aider)
43fbda0faf feat: add --fancy-input flag to control input history and completion 2024-10-24 14:24:09 -07:00
Paul Gauthier (aider)
97a9c65125 feat: add fancy_input parameter to InputOutput class initialization 2024-10-24 14:23:24 -07:00
Paul Gauthier
8a63b1b3ce refactor: rename pretty flag to fancy_input for clarity 2024-10-24 14:23:22 -07:00
Paul Gauthier
3c658ac66f feat: set default reminder to "user" for gpt-4-1106-preview model 2024-10-24 14:08:51 -07:00
Paul Gauthier
055d529947 remove accepts_images 2024-10-24 14:08:06 -07:00
Paul Gauthier (aider)
9507f3c008 refactor: use main_model.info["supports_vision"] instead of accepts_images 2024-10-24 14:05:17 -07:00
Paul Gauthier
e0a1eefe0a copy 2024-10-24 14:01:00 -07:00
Paul Gauthier
ea37ba8346 set version to 0.60.2.dev 2024-10-24 13:59:43 -07:00
Paul Gauthier
8ea789c29d version bump to 0.60.1 2024-10-24 13:58:28 -07:00
Paul Gauthier
901e4397cb copy 2024-10-24 13:49:27 -07:00
Paul Gauthier (aider)
bcf781da73 feat: sort file lists alphabetically in format_files_for_input 2024-10-24 13:48:32 -07:00
Paul Gauthier
a68178fd1b refactor: sort files in format_files_for_input method 2024-10-24 13:48:31 -07:00
Paul Gauthier (aider)
e18b8b0a29 style: fix indentation in commands.py 2024-10-24 13:46:32 -07:00
Paul Gauthier (aider)
62ff822ee8 refactor: collect and sort expanded filenames before processing 2024-10-24 13:46:27 -07:00
Paul Gauthier
c9993dccc8 fix: remove stray comment and add sorting note in cmd_read 2024-10-24 13:46:25 -07:00
Paul Gauthier (aider)
6181fe5efa feat: sort filenames in cmd_read_only for consistent behavior 2024-10-24 13:44:52 -07:00
Paul Gauthier
dd6124fa64 refactor: sort filenames in cmd_read to match cmd_add behavior 2024-10-24 13:44:51 -07:00
Paul Gauthier (aider)
239302a219 feat: sort filenames before adding to chat 2024-10-24 13:43:01 -07:00
Paul Gauthier
e0949bff69 feat: sort filenames before adding them to chat 2024-10-24 13:42:59 -07:00
Paul Gauthier
e0c603c764 copy 2024-10-24 13:38:50 -07:00
Paul Gauthier
8f62f99db7 feat: add image support for Claude 3 models 2024-10-24 13:38:21 -07:00
Paul Gauthier (aider)
b46de7127d style: format Python code with black linter 2024-10-24 12:34:04 -07:00
Paul Gauthier (aider)
e9627cb3c6 feat: add --yes flag to auto-close duplicate issues without prompting 2024-10-24 12:34:01 -07:00
Paul Gauthier
eb8fdf483e feat: add --yes flag to issues script 2024-10-24 12:33:59 -07:00
Paul Gauthier
a6d5fa9cda copy 2024-10-22 14:40:14 -07:00
Paul Gauthier
1bef71f57a copy 2024-10-22 14:40:05 -07:00
Paul Gauthier
63c393e269 copy 2024-10-22 14:23:37 -07:00
Paul Gauthier
1efb0ba53e added new sonnet and o1 models to refac leaderboard 2024-10-22 14:17:36 -07:00
Paul Gauthier
4a3e6ef1e5 update sonnet model names since they are in litellm json now 2024-10-22 12:53:26 -07:00
Paul Gauthier (aider)
a800d219c7 feat: add ModelSettings for Claude 3.5 Sonnet v2 on Vertex AI 2024-10-22 12:51:21 -07:00
Paul Gauthier
7f962b5bb0 feat: add Claude 3.5 Sonnet model settings 2024-10-22 12:51:19 -07:00
Paul Gauthier
57642cf96c copy 2024-10-22 12:21:25 -07:00
Paul Gauthier
c2e49be096 set version to 0.60.1.dev 2024-10-22 11:35:38 -07:00
Paul Gauthier
c26b2e4859 version bump to 0.60.0 2024-10-22 11:34:28 -07:00
Paul Gauthier
9ce0757835 copy 2024-10-22 11:11:22 -07:00
Paul Gauthier
c80a032297 copy 2024-10-22 10:54:34 -07:00
Paul Gauthier
bd28d8f3fb corrected 1022 benchmark results 2024-10-22 10:52:35 -07:00
Paul Gauthier
748fd0cf12 copy 2024-10-22 10:49:29 -07:00
Paul Gauthier
ac6f495377 1022 should use 1022 as editor 2024-10-22 10:48:29 -07:00
Paul Gauthier
3b14eb98a5 copy 2024-10-22 10:43:08 -07:00
Paul Gauthier
914bf3d82b feat: add model metadata for Claude 3.5 Sonnet 2024-10-22 10:42:13 -07:00
Paul Gauthier
949b50bd69 fix 1122->1022 2024-10-22 10:36:30 -07:00
Paul Gauthier (aider)
d234d5e3ec feat: add resource model metadata to search path 2024-10-22 10:34:29 -07:00
Paul Gauthier
1b530f9200 copy 2024-10-22 10:10:09 -07:00
Paul Gauthier
3c4dad7eb4 use sonnet 1022 by default 2024-10-22 10:09:35 -07:00
Paul Gauthier
cfcb6656cb added claude-3-5-sonnet-20241022 benchmarks 2024-10-22 10:05:15 -07:00
Paul Gauthier
ae54ef57ae simplify format_files_for_input 2024-10-22 10:02:42 -07:00
Paul Gauthier
cb306b61cd added model settings for sonnet 1022 2024-10-22 09:38:32 -07:00
Paul Gauthier
46269f2e9b cleanup 2024-10-21 15:31:27 -07:00
Paul Gauthier
7c9f9be7d8 fix: remove trailing slash from index.md URLs in fname_to_url tests 2024-10-21 14:46:53 -07:00
Paul Gauthier (aider)
ef45fe1015 style: format code with black 2024-10-21 14:32:05 -07:00
Paul Gauthier (aider)
eaaf05d964 fix: handle Windows-style paths in fname_to_url function 2024-10-21 14:32:01 -07:00
Paul Gauthier (aider)
3ce1cfb908 refactor: remove unused imports in test_help.py 2024-10-21 14:28:50 -07:00
Paul Gauthier (aider)
9e0a9e919b style: apply linter formatting changes 2024-10-21 14:28:35 -07:00
Paul Gauthier (aider)
671f3078c1 test: add fname_to_url tests for Unix, Windows, and edge cases 2024-10-21 14:28:28 -07:00
Paul Gauthier (aider)
67d538a499 style: format code with linter 2024-10-21 14:23:11 -07:00
Paul Gauthier (aider)
b69d131810 refactor: improve robustness of fname_to_url function 2024-10-21 14:23:07 -07:00
Paul Gauthier
949b7ece36 chore: Add debug logging for filepath and node metadata 2024-10-21 14:23:05 -07:00
Paul Gauthier
d1e35bcdd1 refactor: update stale issue handling and edit block replacement logic 2024-10-21 12:02:29 -07:00
Paul Gauthier
34ec197199 copy 2024-10-21 10:46:15 -07:00
Paul Gauthier (aider)
5a1cf67ea3 ci: add permissions for stale issue workflow 2024-10-21 10:39:45 -07:00
Paul Gauthier
e427e2da05 do not stale prs 2024-10-21 10:37:43 -07:00
Paul Gauthier (aider)
2cfd4d719a feat: add manual trigger for stale issue closure workflow 2024-10-21 10:30:19 -07:00
Paul Gauthier
709633de72 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-21 10:27:26 -07:00
Paul Gauthier
bf46f6dc8b only stale questions 2024-10-21 10:26:55 -07:00
Paul Gauthier (aider)
259a18f3dd chore: update stale workflow to mark issues as stale after 14 days 2024-10-21 10:25:45 -07:00
Paul Gauthier (aider)
4c3aea4bfc feat: add stale issue and PR workflow 2024-10-21 10:04:26 -07:00
Paul Gauthier
6c595c261c chore: add GitHub action to close stale issues and PRs 2024-10-21 10:04:24 -07:00
paul-gauthier
ecaf1e674d Merge pull request #1982 from jbellis/minimal_fileids
add format_files_for_input and compute_minimal_fileids to beautify the shown session context
2024-10-21 09:55:21 -07:00
Paul Gauthier
e76704e261 copy 2024-10-16 10:32:41 -07:00
Paul Gauthier
e092081c56 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-16 10:17:42 -07:00
Paul Gauthier
4d6db0cb09 copy 2024-10-16 10:16:22 -07:00
Paul Gauthier
0729a725ad copy 2024-10-16 10:15:17 -07:00
Paul Gauthier
b7a884d81e feat: add Llama-3.1-Nemotron-70B model to edit leaderboard 2024-10-16 10:14:42 -07:00
Paul Gauthier
90e6941de5 slight tweak to wholefile prompt 2024-10-16 10:13:48 -07:00
paul-gauthier
c7a05d75fd Merge pull request #1927 from mbokinala/update-docs-pipx-boto3
docs: update instructions for AWS Bedrock pipx installation to include boto3 inject step
2024-10-15 13:21:34 -07:00
Manav Bokinala
ce253fec8f move pipx bedrock boto3 instructions to bedrock.md 2024-10-15 12:59:41 -07:00
Paul Gauthier
6bb9b2567f refactor: Centralize retry timeout and use consistent value 2024-10-15 12:25:05 -07:00
Paul Gauthier
26058c89fe fix pages deploy 2024-10-14 12:57:02 -07:00
Paul Gauthier
692f6a7b85 update linkchecker install 2024-10-14 11:22:05 -07:00
Paul Gauthier
163a29b026 copy 2024-10-14 11:01:00 -07:00
Paul Gauthier
06534fa91e copy 2024-10-14 10:59:42 -07:00
Paul Gauthier
bf45a14b30 feat: add Grok-2 and Grok-2-mini model results to leaderboard 2024-10-14 10:58:40 -07:00
Paul Gauthier
0a497b7fd7 copy 2024-10-10 19:19:54 -07:00
Paul Gauthier
e1f85aa19e copy 2024-10-10 15:24:41 -07:00
Paul Gauthier
2f307e46e2 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-10 15:24:04 -07:00
Paul Gauthier
22203124e9 copy 2024-10-10 15:23:46 -07:00
Paul Gauthier
7e881927d6 cleanup 2024-10-10 15:22:06 -07:00
Paul Gauthier
a4e359daf4 cleanup 2024-10-10 15:08:18 -07:00
paul-gauthier
ef2c165399 Merge pull request #2005 from strayer/strayer/add-azure-o1-model-settings 2024-10-10 06:29:00 -07:00
Sven Grunewaldt
deb27f8f27 feat: Add new model settings for azure/o1-preview
Fixes litellm exceptions and incorrect model settings when using
o1-preview on Azure OpenAI.
2024-10-10 12:05:04 +02:00
fry69
e51d8a403f Merge pull request #2002 from fry69/help-cleanup
Cleanup.
2024-10-10 06:49:02 +02:00
fry69
27ddf8aeab fix: remove unreachable return statements 2024-10-10 06:46:10 +02:00
Jonathan Ellis
b915b1834d remove unused imports 2024-10-09 14:37:22 -05:00
fry69
cd3e0ae914 Merge pull request #1990 from fry69/clipboard-fix
Another quick fix
2024-10-09 14:08:00 +02:00
fry69
e820fea289 doc: fix leftover /clipboard mention 2024-10-09 14:06:30 +02:00
fry69
fc63faa737 Merge pull request #1987 from fry69/openrouter-haiku-fix
Quick emergency fix
2024-10-09 13:04:30 +02:00
fry69
65b50cdaee fix: correct weak model names for Sonnet-3.5 on OpenRouter 2024-10-09 12:50:44 +02:00
Jonathan Ellis
464c3e29e1 add format_files_for_input and compute_minimal_fileids 2024-10-08 22:29:46 -05:00
Paul Gauthier
f65bf9aee7 indent 2024-10-08 10:47:44 -07:00
Paul Gauthier
80f7e56785 initial 2024-10-08 10:39:30 -07:00
Paul Gauthier
0cb05dd001 initial 2024-10-08 10:38:36 -07:00
paul-gauthier
0fe5247d4c Merge pull request #1967 from fry69/chat-history-fix-try2
doc: fix wrong encapsulation
2024-10-07 16:33:01 -07:00
fry69
91a013afb3 doc: fix wrong encapsulation 2024-10-08 01:22:50 +02:00
fry69
3bc056a107 doc: fix wrong encapsulation 2024-10-08 01:22:01 +02:00
paul-gauthier
456c163cb9 Merge pull request #1966 from fry69/chat-history-fix 2024-10-07 15:54:19 -07:00
fry69
f3ff24e35a doc: clarify soft limit for chat history tokens 2024-10-08 00:51:04 +02:00
Paul Gauthier
1d2a3f573c fixes #1941 2024-10-07 13:05:40 -07:00
Paul Gauthier
cbdabd3ae9 fixes #1944 2024-10-07 13:05:28 -07:00
Paul Gauthier
c24ec7f230 fix: Handle additional Git errors in repo check 2024-10-07 12:52:38 -07:00
Paul Gauthier
3146d285bf fix gitignore test 2024-10-07 12:29:39 -07:00
Paul Gauthier (aider)
bde93903de feat: add .env to gitignore check and update process 2024-10-07 12:26:45 -07:00
Paul Gauthier
e487351c8d copy 2024-10-05 14:40:05 -07:00
Paul Gauthier
10ecb4b97f copy 2024-10-05 14:38:01 -07:00
Paul Gauthier (aider)
04a2cbb494 refactor: update regex patterns to match complete lines with optional whitespace 2024-10-05 12:31:23 -07:00
Paul Gauthier
7729974253 set version to 0.59.2.dev 2024-10-05 12:30:48 -07:00
Paul Gauthier
27bfb3c662 version bump to 0.59.1 2024-10-05 12:29:27 -07:00
Paul Gauthier
3d5a7dce4f copy 2024-10-05 12:28:10 -07:00
Paul Gauthier
2d0de85976 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-05 11:40:19 -07:00
Paul Gauthier (aider)
ea4e58e509 refactor: improve error message matching flexibility 2024-10-05 11:37:15 -07:00
Paul Gauthier (aider)
48272449bb style: remove unused exception variable 2024-10-05 11:36:11 -07:00
Paul Gauthier
989e7c18fb refactor: Simplify config file check and error handling 2024-10-05 11:36:04 -07:00
Paul Gauthier (aider)
c6d1c45abc style: format code with black and adjust line breaks 2024-10-05 11:32:53 -07:00
Paul Gauthier (aider)
57efba2763 refactor: improve config file error handling and messaging 2024-10-05 11:32:48 -07:00
Paul Gauthier
e56df2391d refactor: Simplify error handling in main function 2024-10-05 11:32:47 -07:00
Paul Gauthier (aider)
28fab9548b style: format long lines in main.py 2024-10-05 11:30:46 -07:00
Paul Gauthier (aider)
7d117d05c5 fix: replace io.tool_output with print for early error handling 2024-10-05 11:30:42 -07:00
Paul Gauthier (aider)
a482ef9bfa feat: add error handling for 'yes:' config issue 2024-10-05 11:29:44 -07:00
Paul Gauthier (aider)
f82ab9cc6e feat: add error handling for 'yes:' config issue 2024-10-05 11:28:00 -07:00
paul-gauthier
13141fc733 Merge pull request #1934 from fry69/openrouter-beta-models-fix
fix: add OpenRouter Sonnet-3.5 beta/self-moderated model
2024-10-05 07:13:29 -07:00
fry69
3c7e285182 fix: add OpenRouter Sonnet-3.5 beta/self-moderated model 2024-10-05 16:12:34 +02:00
Manav Bokinala
30238dbbd5 docs: update instructions for pipx installation to include boto3 inject step 2024-10-04 20:05:33 -07:00
Paul Gauthier
96cdd95988 refactor: Reorganize charts and update HISTORY.md structure 2024-10-04 15:56:28 -07:00
Paul Gauthier
c10442087b copy 2024-10-04 15:40:43 -07:00
Paul Gauthier
06bd2ace69 set version to 0.59.1.dev 2024-10-04 15:28:29 -07:00
Paul Gauthier
3759340eb4 version bump to 0.59.0 2024-10-04 15:27:13 -07:00
Paul Gauthier
46e182004e copy 2024-10-04 15:25:43 -07:00
Paul Gauthier
e84de1fb5a Revert "test: add DummyInput and DummyOutput to TestHelp setup"
This reverts commit d098a4cd80.
2024-10-04 15:25:22 -07:00
Paul Gauthier
3b9af69dec copy 2024-10-04 15:19:19 -07:00
Paul Gauthier
d098a4cd80 test: add DummyInput and DummyOutput to TestHelp setup 2024-10-04 14:04:02 -07:00
Paul Gauthier
501a304d32 copy 2024-10-04 13:53:07 -07:00
Paul Gauthier
19b6e79719 copy 2024-10-04 13:47:43 -07:00
Paul Gauthier
d77ae7c2ac copy 2024-10-04 13:36:25 -07:00
Paul Gauthier
2b4206fd57 paul-gauthier -> Aider-AI 2024-10-04 13:06:38 -07:00
Paul Gauthier
4ef7022343 copy 2024-10-04 13:00:01 -07:00
Paul Gauthier
1c67ddcbff copy 2024-10-04 12:58:48 -07:00
Paul Gauthier
516e637c39 Update docs github.com/paul-gauthier -> github.com/Aider-AI 2024-10-04 12:53:45 -07:00
Paul Gauthier
d17bd6ebcc move import 2024-10-04 12:51:39 -07:00
Paul Gauthier (aider)
cde45d9fdf style: fix linting issues and add newline 2024-10-04 12:50:38 -07:00
Paul Gauthier (aider)
bfba7e8e73 refactor: move git index version URL to urls.py 2024-10-04 12:50:32 -07:00
Paul Gauthier
f8243b3632 refactor: Move reply_completed call before KeyboardInterrupt handling 2024-10-04 11:46:44 -07:00
Paul Gauthier
7ff2dc89b4 refactor: modify command parsing to use last word only 2024-10-04 11:20:55 -07:00
Paul Gauthier (aider)
0c743ce8e8 feat: sort completions in completions_raw_read_only method 2024-10-04 11:17:47 -07:00
Paul Gauthier
50f88a8d28 copy 2024-10-04 09:37:34 -07:00
Paul Gauthier
ff230554ce chore: Update edit leaderboard with latest model performance data 2024-10-04 09:35:28 -07:00
Paul Gauthier
af10953534 refactor: Improve completion matching for 'add' command 2024-10-03 11:00:18 -07:00
Paul Gauthier (aider)
6093a4c2bb feat: add 'add' command completions to /read-only command 2024-10-03 10:54:26 -07:00
Paul Gauthier
33b45b68e2 copy 2024-10-02 12:03:47 -07:00
Paul Gauthier (aider)
e33e9c44bb fix: import ANY from unittest.mock to resolve undefined name error 2024-10-02 11:21:28 -07:00
Paul Gauthier (aider)
b35bd06eb8 style: format code in test_models.py 2024-10-02 11:21:17 -07:00
Paul Gauthier (aider)
875fb3a178 test: update sanity_check_models_bogus_editor to expect two warnings 2024-10-02 11:21:13 -07:00
Paul Gauthier (aider)
97d6b68613 fix: add missing sanity_check_model import 2024-10-02 11:20:01 -07:00
Paul Gauthier (aider)
21adf405a0 fix: correct imports and model usage in test_models.py 2024-10-02 11:19:38 -07:00
Paul Gauthier (aider)
1a355cbf74 style: format code in test_models.py 2024-10-02 11:19:25 -07:00
Paul Gauthier (aider)
1a3e8b3375 test: update sanity check test to use real Model instances 2024-10-02 11:19:22 -07:00
Paul Gauthier (aider)
da9af264f8 fix: import sanity_check_models in test_models.py 2024-10-02 11:17:53 -07:00
Paul Gauthier (aider)
93cb615ffd test: add test for sanity check with bogus editor model 2024-10-02 11:15:27 -07:00
Paul Gauthier (aider)
7e55a8f684 style: Format code in test_models.py to improve readability 2024-10-02 11:15:09 -07:00
Paul Gauthier (aider)
433223a7fc test: add sanity check for bogus editor model 2024-10-02 11:15:05 -07:00
Paul Gauthier (aider)
1b58e1f6ad style: format code with linter 2024-10-02 11:13:49 -07:00
Paul Gauthier (aider)
03faad3110 refactor: improve sanity_check_models to include editor model check 2024-10-02 11:13:44 -07:00
Paul Gauthier
992600fcb7 fixes #1889 2024-10-02 11:06:19 -07:00
Paul Gauthier
99c3a1ec7f feat: Rename --yes to --yes-always and update config file syntax 2024-10-02 10:55:59 -07:00
Paul Gauthier
d4fe0b18ad rename --yes to --yes-always #767 2024-10-02 10:45:11 -07:00
Paul Gauthier
8dfda27151 copy 2024-10-02 09:30:35 -07:00
Paul Gauthier (aider)
70a509bbea style: Format error message assertion in test_commands.py 2024-10-02 09:21:23 -07:00
Paul Gauthier (aider)
8c45e25724 test: update cmd_read_only test with full path for nonexistent glob 2024-10-02 09:21:17 -07:00
Paul Gauthier (aider)
f12682a0c1 style: Format code and remove whitespace 2024-10-02 09:20:45 -07:00
Paul Gauthier (aider)
79350ab195 test: add glob functionality tests for cmd_read_only method 2024-10-02 09:20:39 -07:00
Paul Gauthier (aider)
ff0bacc984 style: reorder imports and remove whitespace 2024-10-02 09:18:58 -07:00
Paul Gauthier (aider)
d76f7a597e fix: handle tilde expansion in cmd_read_only for home directories 2024-10-02 09:18:53 -07:00
Paul Gauthier (aider)
9ad915f40e style: reorder imports alphabetically in commands.py 2024-10-02 09:16:13 -07:00
Paul Gauthier (aider)
e5b27355b7 feat: use glob for flexible file matching in cmd_read_only 2024-10-02 09:16:08 -07:00
Paul Gauthier (aider)
510fa24ade feat: add --skip-sanity-check-repo switch 2024-10-01 17:31:34 -07:00
Paul Gauthier
72cb5db530 refactor: remove debug print statement for commit_system 2024-10-01 14:25:35 -07:00
Paul Gauthier
8b6b558483 refactor: Optimize cache key generation in RepoMap class 2024-10-01 14:25:27 -07:00
Paul Gauthier
90e42045df copy 2024-10-01 14:23:16 -07:00
Paul Gauthier (aider)
1ff9157c95 style: Format code to comply with linter rules 2024-10-01 14:22:49 -07:00
Paul Gauthier (aider)
cf1e6e65c7 feat: add mentioned_fnames and mentioned_idents to cache key 2024-10-01 14:22:44 -07:00
Paul Gauthier
be5012db96 refactor: improve sorting of ranked definitions 2024-10-01 14:22:43 -07:00
Paul Gauthier
aec8550e56 Merge branch 'main' of github.com:paul-gauthier/aider 2024-10-01 14:20:30 -07:00
Paul Gauthier
1a4ef0f532 fix: Handle OSError when resolving config file path 2024-10-01 14:19:09 -07:00
paul-gauthier
20ab8eb90a Merge pull request #1876 from itlackey/benchmark/ollama-models
Benchmark/ollama models
2024-10-01 14:17:17 -07:00
itlackey
d621d16255 - Added hermes3 2024-10-01 16:06:15 -05:00
itlackey
61bc130464 - Added yi-coder:9b-chat-fp16 2024-10-01 16:06:15 -05:00
itlackey
aa911a847d - Added mistral-small 2024-10-01 16:06:15 -05:00
itlackey
268331d5c0 - Added hermes3:8b-llama3.1-fp16 2024-10-01 16:06:15 -05:00
itlackey
8d4dd5c9de - Added llama3.2:3b-instruct-fp16 2024-10-01 16:06:15 -05:00
itlackey
fb34af4362 - Added qwen2.5:32b 2024-10-01 16:06:15 -05:00
itlackey
e381260932 - Added mistral-nemo:12b-instruct-2407-q4_K_M 2024-10-01 16:06:15 -05:00
itlackey
e2d5f15aff - Added wojtek/opencodeinterpreter:6.7b 2024-10-01 16:06:15 -05:00
itlackey
d4cecf9fd0 - Added codegeex4 2024-10-01 16:06:15 -05:00
paul-gauthier
12578c0388 Merge pull request #1852 from fry69/commit-prompt-fix
fix: enhance commit prompt to ensure one-line with Haiku
2024-10-01 12:19:37 -07:00
Paul Gauthier
9b22d6248a fix: Swap the order of settings and announcements in the output 2024-10-01 11:56:01 -07:00
Paul Gauthier (aider)
729cad640f feat: Add announcements to /settings output 2024-10-01 11:54:28 -07:00
fry69
7a56be174e fix: enhance commit prompt to ensure one-line with Haiku 2024-10-01 10:09:20 +02:00
Paul Gauthier
9789668ca4 copy 2024-09-30 21:21:50 -07:00
Paul Gauthier
9f7aada9c5 copy 2024-09-30 21:21:40 -07:00
Paul Gauthier
51f46393c3 copy 2024-09-30 21:18:20 -07:00
Paul Gauthier
e1029a3858 copy 2024-09-30 21:17:27 -07:00
Paul Gauthier (aider)
51ba096916 feat: implement cog to fetch and process model data 2024-09-30 21:15:09 -07:00
Paul Gauthier
d9c159fe7a feat: Add documentation for infinite output 2024-09-30 21:15:08 -07:00
Paul Gauthier
8ebd519615 copy 2024-09-30 14:28:05 -07:00
Paul Gauthier
bfcba012fa set version to 0.58.2.dev 2024-09-30 14:25:39 -07:00
Paul Gauthier
8f48c68fc6 version bump to 0.58.1 2024-09-30 14:24:18 -07:00
Paul Gauthier
f2e1e17741 avoid stomping extra_params[max_tokens]=1 in cache warming, which causes loop of 1 token infinite-output responses with prefill models #1842 #1841 2024-09-30 14:22:11 -07:00
Paul Gauthier
8fb0362b47 copy 2024-09-30 09:37:47 -07:00
Paul Gauthier
a42587b8de copy 2024-09-30 09:31:50 -07:00
Paul Gauthier
474056a068 copy 2024-09-30 09:25:37 -07:00
Paul Gauthier
adde5e08d0 copy 2024-09-30 08:34:40 -07:00
Paul Gauthier
0aaa37f528 copy 2024-09-29 16:05:00 -07:00
Paul Gauthier
e5862ae81e Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-29 15:50:53 -07:00
Paul Gauthier
485bfa2492 copy 2024-09-29 15:46:32 -07:00
paul-gauthier
d5117921cf Merge pull request #1826 from mario7421/typo-fix 2024-09-29 12:43:51 -07:00
mario7421
98b3f5bbdb Fix typo in diff prompt 2024-09-29 21:07:20 +02:00
paul-gauthier
b73c518eb2 Merge pull request #1823 from fry69/architect-hot-fix 2024-09-29 09:33:55 -07:00
fry69
457b627b67 doc: hotfix for Full results table 2024-09-29 18:15:08 +02:00
Paul Gauthier
53ca83beea copy 2024-09-29 08:31:13 -07:00
Paul Gauthier
53a83734ca set version to 0.58.1.dev 2024-09-29 08:19:48 -07:00
Paul Gauthier
2bdd9360ab version bump to 0.58.0 2024-09-29 08:18:38 -07:00
Paul Gauthier
805e46a1df publish architect 2024-09-29 08:13:22 -07:00
Paul Gauthier
291ef5711d architect graphic 2024-09-29 08:12:30 -07:00
Paul Gauthier
00605e67fb copy 2024-09-29 08:10:13 -07:00
Paul Gauthier
6c6c6076eb copy 2024-09-29 08:09:50 -07:00
Paul Gauthier
b8ec4a5291 Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-29 08:09:18 -07:00
Paul Gauthier
387a9434f8 copy 2024-09-29 08:06:17 -07:00
paul-gauthier
cc01313500 Merge pull request #1807 from itlackey/benchmark/ollama-codestral 2024-09-28 15:49:49 -07:00
Paul Gauthier
0091ab004c fix: Update autocomplete test to handle partial file names 2024-09-28 15:29:54 -07:00
Paul Gauthier (aider)
d647ebf058 fix: remove unused import of Completion in test_io.py 2024-09-28 15:28:29 -07:00
Paul Gauthier (aider)
c2b48b5256 style: format code and improve readability in test_io.py 2024-09-28 15:28:14 -07:00
Paul Gauthier (aider)
d5b8a15410 test: add unit tests for AutoCompleter.get_command_completions method 2024-09-28 15:28:11 -07:00
Paul Gauthier
2139de76fb test: remove unused test for command completions in TestInputOutput class 2024-09-28 15:28:10 -07:00
Paul Gauthier (aider)
e832ee8450 style: format code and run linter on test_io.py 2024-09-28 15:24:18 -07:00
Paul Gauthier (aider)
37236aa907 fix: update test_get_command_completions to match new method signature with Document and CompleteEvent parameters 2024-09-28 15:24:14 -07:00
Paul Gauthier (aider)
4ea68efd0e test: Fix confirm_ask test to handle invalid input and verify call count 2024-09-28 15:19:19 -07:00
Paul Gauthier (aider)
843cc9ee4e style: run linter and fix whitespace in test_io.py 2024-09-28 15:16:59 -07:00
Paul Gauthier (aider)
ec10ead0c3 test: add unit tests for allow_never option in confirm_ask method 2024-09-28 15:16:56 -07:00
Paul Gauthier
b78d19c7a5 copy 2024-09-28 15:15:42 -07:00
Paul Gauthier
97ddcb2ae6 feat: Add autocomplete support for /read-only command 2024-09-28 15:14:35 -07:00
Paul Gauthier (aider)
d1ee3644ec style: run linter and format import statements in io.py 2024-09-28 15:02:37 -07:00
Paul Gauthier (aider)
b9fb59dc3e fix: remove unused import of PathCompleter from aider/io.py 2024-09-28 15:02:33 -07:00
Paul Gauthier (aider)
ad0497dfdf style: run linter and fix code formatting in io.py 2024-09-28 15:02:13 -07:00
Paul Gauthier (aider)
c1642b5eca feat: add "Never" option to confirm_ask and store user choices in never_prompts set 2024-09-28 15:02:09 -07:00
Paul Gauthier
f8746feaa1 fix: Improve warning message for unsupported streaming 2024-09-28 14:55:22 -07:00
Paul Gauthier
40588ccffa copy 2024-09-28 14:55:16 -07:00
Paul Gauthier (aider)
9884d838ea style: run linter and format test_commands.py for improved readability 2024-09-28 14:48:23 -07:00
Paul Gauthier (aider)
384391129d test: add unit test for /copy command with cur_messages present 2024-09-28 14:48:18 -07:00
Paul Gauthier
0819258e0f test: add unit test for handling bad glob in command add 2024-09-28 14:48:17 -07:00
Paul Gauthier (aider)
1e776863ac style: format code and improve linter compliance in test_commands.py 2024-09-28 14:44:04 -07:00
Paul Gauthier (aider)
202a219d82 test: add tests for the /copy command including success, no messages, and exception handling 2024-09-28 14:44:00 -07:00
Paul Gauthier
817530ccb7 fixed regression allowing non-repo files to move from /read to /add 2024-09-28 14:42:07 -07:00
Paul Gauthier
ffd7364410 Merge branch 'main' into path-completer 2024-09-28 14:33:58 -07:00
Paul Gauthier
bebffee3dd Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-28 14:33:25 -07:00
Paul Gauthier
8cb3e523a5 copy 2024-09-28 14:31:49 -07:00
itlackey
228ae24834 added ollama/codestral benchmark 2024-09-28 16:08:49 -05:00
paul-gauthier
ffc7d35145 Merge pull request #1796 from fry69/git-doc-fix 2024-09-28 07:21:38 -07:00
fry69
010f921c53 doc: fix /paste entry in commands.html spilling into new line 2024-09-28 15:11:26 +02:00
fry69
d7d87847a6 doc: small fixes 2024-09-28 08:31:50 +02:00
Paul Gauthier
91307ecfc4 fix: Remove unnecessary call to dump() in InputOutput.read_style() 2024-09-27 19:50:45 -07:00
Paul Gauthier (aider)
1a75b79c81 fix: change default values for completion menu arguments to None in InputOutput.__init__ method 2024-09-27 19:49:53 -07:00
Paul Gauthier
3ff5f280bb fix: add dump function call to style dictionary processing in InputOutput class 2024-09-27 19:49:52 -07:00
Paul Gauthier (aider)
e465cda5c8 fix: change default values for completion menu arguments from "default" to None in aider/args.py 2024-09-27 19:49:17 -07:00
Paul Gauthier (aider)
2d5db0dc23 style: format code with linter adjustments 2024-09-27 19:47:45 -07:00
Paul Gauthier (aider)
537f5a1f98 fix: update _get_style method to conditionally add completion menu styles based on non-null values 2024-09-27 19:47:41 -07:00
Paul Gauthier
ede3cbb372 refactor: simplify _get_style method in InputOutput class 2024-09-27 19:47:40 -07:00
Paul Gauthier (aider)
d3908ca971 fix: update style dictionary and simplify style retrieval in get_input method 2024-09-27 19:45:14 -07:00
Paul Gauthier (aider)
725b5f7063 feat: centralize pygments.literal.string style configuration in _get_style method and simplify calling code 2024-09-27 19:45:04 -07:00
Paul Gauthier (aider)
fd9dc9e8d2 style: format linter adjustments in io.py for better readability 2024-09-27 19:44:23 -07:00
Paul Gauthier (aider)
c5fb25eec3 fix: correct SEARCH/REPLACE block in aider/io.py to match existing lines exactly 2024-09-27 19:44:20 -07:00
Paul Gauthier (aider)
d2e0d3c06d refactor: ensure _get_style always returns a dictionary and simplify calling code 2024-09-27 19:44:14 -07:00
Paul Gauthier (aider)
1cd5b11b5c style: fix linter issues in io.py 2024-09-27 19:43:34 -07:00
Paul Gauthier (aider)
b16050211c fix: fix line length issue in _get_style method by breaking long string into multiple lines 2024-09-27 19:43:30 -07:00
Paul Gauthier (aider)
0a558682d8 style: format linter adjustments in io.py for better readability 2024-09-27 19:43:16 -07:00
Paul Gauthier (aider)
bff1b3de9c refactor: centralize completion menu styles in _get_style method to reduce code duplication 2024-09-27 19:43:12 -07:00
Paul Gauthier (aider)
cf46d9cdd0 style: run linter and format completion menu style definitions 2024-09-27 19:41:56 -07:00
Paul Gauthier (aider)
2c084d65d9 refactor: centralize style creation logic by introducing _get_style method in InputOutput class 2024-09-27 19:41:51 -07:00
Paul Gauthier (aider)
41d5b284e3 fix: resolve syntax errors in commands.py and improve file handling logic 2024-09-27 19:31:43 -07:00
Paul Gauthier (aider)
45d94b1c7c fix: handle file status correctly in /add and _add_read_only_file commands 2024-09-27 19:30:20 -07:00
Paul Gauthier (aider)
2509f0704f style: Fix formatting in commands.py 2024-09-27 17:10:10 -07:00
Paul Gauthier (aider)
1f56118c99 feat: Simplify completions_raw_read_only method 2024-09-27 17:10:05 -07:00
Paul Gauthier
38d03bca09 fix: Rename _old_completions_add to completions_add 2024-09-27 17:10:04 -07:00
Paul Gauthier (aider)
731f312731 fix: remove unused import of 'shlex' 2024-09-27 17:06:32 -07:00
Paul Gauthier
635a800032 fix: Quote file names with spaces in completions 2024-09-27 17:06:27 -07:00
Paul Gauthier (aider)
87da3a7132 fix: adjust start_position for quoted filename completions in completions_raw_read_only method 2024-09-27 16:53:15 -07:00
Paul Gauthier
eef97e4938 fix: remove redundant import of shlex in commands.py 2024-09-27 16:53:14 -07:00
Paul Gauthier (aider)
36bc8f90db fix: properly quote filenames with spaces and special characters using shlex.quote() 2024-09-27 16:52:06 -07:00
Paul Gauthier (aider)
c4e766a4c4 style: run linter and reorder import statements in commands.py 2024-09-27 16:51:01 -07:00
Paul Gauthier (aider)
8bb9bbef19 feat: modify PathCompleter to quote filenames with spaces in completions 2024-09-27 16:50:57 -07:00
Paul Gauthier
2a79723336 refactor: rename completions_add method to _old_completions_add for clarity 2024-09-27 16:50:57 -07:00
Paul Gauthier
542afbeb74 fix: Use self.coder.root instead of self.root in get_paths function 2024-09-27 16:48:55 -07:00
Paul Gauthier (aider)
9644546a65 feat: add get_paths function to PathCompleter for starting from self.root if not None 2024-09-27 16:47:47 -07:00
Paul Gauthier
79e0b80f34 Merge branch 'main' into path-completer 2024-09-27 16:46:24 -07:00
Paul Gauthier
7e4e6782d1 fix: set max_tokens to 1 for cache warming 2024-09-27 16:46:03 -07:00
Paul Gauthier (aider)
aab01086a2 style: fix formatting in base_coder.py 2024-09-27 16:43:24 -07:00
Paul Gauthier (aider)
f7818c6994 feat: Use **kwargs for extra_params in warm_cache_worker 2024-09-27 16:43:18 -07:00
Paul Gauthier
22c60cad1a refactor: Replace extra_params with extra_headers in cache warming request 2024-09-27 16:43:17 -07:00
Paul Gauthier
237ee1c5a1 Merge branch 'main' into path-completer 2024-09-27 16:40:53 -07:00
Paul Gauthier (aider)
87e4010b8b style: Run linter 2024-09-27 16:39:42 -07:00
Paul Gauthier (aider)
7830dadccf fix: Remove unused imports in aider/commands.py 2024-09-27 16:39:37 -07:00
Paul Gauthier (aider)
6287bf37e5 feat: Implement partial prefix matching for /read-only command in completions_raw_read_only method 2024-09-27 16:39:26 -07:00
Paul Gauthier
369310a7c3 fix: Remove commented-out code in PathCompleter configuration 2024-09-27 16:39:25 -07:00
Paul Gauthier (aider)
7e1497e114 style: Run linter and fix code formatting issues in commands.py 2024-09-27 16:35:27 -07:00
Paul Gauthier (aider)
57257b7c15 fix: correct indentation error in completions_raw_read_only method in aider/commands.py 2024-09-27 16:35:22 -07:00
Paul Gauthier (aider)
68c4817c14 fix: adjust completions_raw_read_only to process only file path input for correct path completions 2024-09-27 16:34:55 -07:00
Paul Gauthier (aider)
c35a41466b fix: correct completions_raw_read_only method to yield all path completions without unnecessary filtering 2024-09-27 16:25:39 -07:00
Paul Gauthier
bb740f3004 refactor: Replace extra_headers with extra_params in cache warming request 2024-09-27 16:22:17 -07:00
Paul Gauthier
c745d0dc38 wip 2024-09-27 16:21:18 -07:00
Paul Gauthier (aider)
9c5ef0b41a style: run linter 2024-09-27 16:17:41 -07:00
Paul Gauthier (aider)
2d3605156e feat: Implement file path completion for read-only command 2024-09-27 16:17:37 -07:00
Paul Gauthier
8e276939a7 feat: Implement completions_raw_read_only method
diff --git a/aider/commands.py b/aider/commands.py
index 80dd81dd..d4d4d4d1 100644
--- a/aider/commands.py
+++ b/aider/commands.py
@@ -580,7 +580,31 @@ class Commands:
         return fname

     def completions_raw_read_only(self, document, complete_event):
-        pass
+        # Extract the part of the input after the command
+        text = document.text[len("/read-only") :].lstrip()
+
+        # Create a PathCompleter
+        path_completer = PathCompleter(
+            only_directories=False,
+            expanduser=True,
+            get_paths=lambda: [self.coder.root],
+        )
+
+        # Create a new Document object with the modified text
+        new_document = Document(text, cursor_position=len(text))
+
+        # Get completions from the PathCompleter
+        completions = path_completer.get_completions(new_document, complete_event)
+
+        # Yield the completions
+        for completion in completions:
+            # Adjust the start position to account for the command
+            yield Completion(
+                completion.text,
+                start_position=completion.start_position - len(document.text) + len(text),
+                display=completion.display,
+                display_meta=completion.display_meta,
+            )

     def completions_add(self):
         files = set(self.coder.get_all_relative_files())
2024-09-27 16:17:35 -07:00
Paul Gauthier (aider)
c2afdcfdb9 fix: Create new Document object for path completion in completions_raw_read_only 2024-09-27 16:10:16 -07:00
Paul Gauthier
8e02cadfbc fix: Ensure command starts with slash before retrieving raw completions 2024-09-27 16:10:14 -07:00
Paul Gauthier (aider)
0a77b6cfac feat: Add Completion import to aider/commands.py 2024-09-27 16:07:35 -07:00
Paul Gauthier (aider)
f8390a889b style: Ran the linter 2024-09-27 16:06:44 -07:00
Paul Gauthier (aider)
b930a1db40 feat: Add raw completer for cmd_read_only command 2024-09-27 16:06:39 -07:00
Paul Gauthier (aider)
ee4de6bd1c feat: Add get_raw_completions method to Commands class 2024-09-27 16:05:40 -07:00
Paul Gauthier (aider)
6c2c3942bf feat: Add document and complete_event parameters to get_command_completions 2024-09-27 16:04:17 -07:00
Paul Gauthier
3ec0861727 fix: Add support for raw completers in AutoCompleter 2024-09-27 16:04:16 -07:00
Paul Gauthier (aider)
37b512e4fc feat: Update get_command_completions and get_completions methods 2024-09-27 15:59:56 -07:00
Paul Gauthier
01437fa58c copy 2024-09-27 14:29:35 -07:00
Paul Gauthier
927d03cc37 copy 2024-09-27 14:28:53 -07:00
Paul Gauthier (aider)
114fb2a889 style: Improve code formatting and readability 2024-09-27 14:26:56 -07:00
Paul Gauthier (aider)
f95c4626cf fix: Handle clipboard copy errors in cmd_copy 2024-09-27 14:26:50 -07:00
Paul Gauthier (aider)
11db5d95a0 feat: Add /copy command to copy last assistant message 2024-09-27 14:25:22 -07:00
Paul Gauthier (aider)
7d79dd00af style: Improve code formatting and readability 2024-09-27 14:21:43 -07:00
Paul Gauthier (aider)
0c470662bb feat: Add /copy command to copy last assistant message to clipboard 2024-09-27 14:21:37 -07:00
Paul Gauthier
7c1318274e Revert "feat: include non-repo files for completing /read"
This reverts commit d2fbc92507.
2024-09-27 13:17:36 -07:00
Paul Gauthier
a766395651 Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-27 13:16:15 -07:00
paul-gauthier
2dfc47f5c6 Merge pull request #1757 from jbellis/read-nonrepo
feat: include non-repo files for completing /read
2024-09-27 13:15:23 -07:00
Paul Gauthier
48bd616092 copy 2024-09-27 13:10:41 -07:00
Paul Gauthier
810aeccf94 fix: Replace extra_headers and extra_body with extra_params in Coder, ChatSummary, and GitRepo 2024-09-27 13:09:43 -07:00
Paul Gauthier (aider)
c24e947b18 style: Run linter 2024-09-27 13:02:47 -07:00
Paul Gauthier (aider)
74f615bbb4 feat: Consolidate extra parameters in sendchat.py 2024-09-27 13:02:44 -07:00
Paul Gauthier (aider)
eb0331baed feat: wrap max_tokens in extra_params for ModelSettings 2024-09-27 13:01:20 -07:00
Paul Gauthier (aider)
c3e44b498d feat: update ModelSettings in aider/models.py 2024-09-27 12:58:45 -07:00
Paul Gauthier (aider)
58c856505b feat: Add extra_params field to ModelSettings class and update instances 2024-09-27 12:58:21 -07:00
Paul Gauthier
932aaea845 copy 2024-09-27 12:56:47 -07:00
Paul Gauthier
d50d97ab26 Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-27 12:32:09 -07:00
Paul Gauthier
3c8f15f924 copy 2024-09-27 12:32:03 -07:00
paul-gauthier
c2c4dbd2a8 Merge pull request #1595 from jbellis/paste
feat: rename /clipboard to /paste
2024-09-27 12:31:53 -07:00
paul-gauthier
04d6fc5ef4 Merge pull request #1742 from rti/fix-apply-tool-warning-color
fix(InputOutput): apply tool warning color
2024-09-27 12:29:49 -07:00
Paul Gauthier (aider)
b2549a78bd fix: Move imports to top of file 2024-09-27 12:25:10 -07:00
Paul Gauthier
3b9f561956 fix: Refactor code to handle exceptions more gracefully 2024-09-27 12:25:02 -07:00
Paul Gauthier (aider)
6ab1fdfe36 fix: fix indentation error in get_index function in aider/help.py 2024-09-27 12:23:09 -07:00
Paul Gauthier (aider)
8b0314ae77 style: run linter and fix formatting issues in aider/help.py 2024-09-27 12:22:12 -07:00
Paul Gauthier (aider)
cb1f6f2e3a fix: handle exceptions during index loading and recreate cache if necessary in aider/help.py 2024-09-27 12:22:09 -07:00
Paul Gauthier
a230fa10b3 feat: Add option to show announcements only when verbose mode is enabled 2024-09-27 12:12:35 -07:00
Paul Gauthier
1971285345 copy 2024-09-27 11:56:52 -07:00
Paul Gauthier
e1c2dd53cf copy 2024-09-27 11:54:23 -07:00
Paul Gauthier
cfbf943eb1 copy 2024-09-27 11:48:38 -07:00
Paul Gauthier (aider)
57b832fed1 style: add minimal border to table 2024-09-27 11:31:26 -07:00
Paul Gauthier (aider)
da3e0f6ec8 style: Implement responsive table design 2024-09-27 11:28:52 -07:00
Paul Gauthier
9575f4e5ea feat: Increase font size of chart title 2024-09-27 11:28:51 -07:00
Paul Gauthier (aider)
6e0f981689 fix: Update legend colors to match bar colors in chart 2024-09-27 11:23:41 -07:00
Paul Gauthier (aider)
04978a232b feat: Add gpt-4o-mini to chart configuration 2024-09-27 11:22:16 -07:00
Paul Gauthier
44b61fc370 fix: Update label format in architect post 2024-09-27 11:22:15 -07:00
Paul Gauthier
0bd8058589 copy 2024-09-27 11:09:44 -07:00
Paul Gauthier
ad38339f74 Bring commit hashes back from editor_coder, to allow /undo 2024-09-27 11:06:37 -07:00
Paul Gauthier
2f951cde0a copy 2024-09-27 10:54:48 -07:00
Paul Gauthier
84eca42ca8 feat: Add upgrade-strategy option to pip install command 2024-09-27 10:43:55 -07:00
Paul Gauthier
1df67b0650 copy 2024-09-27 10:36:38 -07:00
Paul Gauthier
8eed1b6ca5 fix: Update pip install command to use --upgrade-strategy only-if-needed 2024-09-27 10:34:09 -07:00
Paul Gauthier
0d55a51033 copy 2024-09-27 10:27:33 -07:00
Paul Gauthier
31e33ec8ef Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-27 10:27:18 -07:00
Paul Gauthier
b16027e500 copy 2024-09-27 10:27:01 -07:00
Paul Gauthier
1acb4da8d0 copy 2024-09-27 10:26:48 -07:00
Paul Gauthier (aider)
f38ea0c8e2 feat: Add cmd_architect method to aider/commands.py 2024-09-27 10:25:50 -07:00
paul-gauthier
9d55197cd8 Merge pull request #1776 from fry69/junior-rename 2024-09-27 05:38:01 -07:00
fry69
667a58052e feat: change edit format from "senior" to "architect" 2024-09-27 09:03:42 +02:00
fry69
e3e0d57512 chore: update parameter names in args and benchmark 2024-09-27 08:57:22 +02:00
Paul Gauthier
c742642df2 copy 2024-09-26 19:06:01 -07:00
Paul Gauthier
c063bdb039 copy 2024-09-26 19:03:48 -07:00
Paul Gauthier
6230060d6a feat: Adjust chart settings for different screen sizes 2024-09-26 19:02:46 -07:00
Paul Gauthier (aider)
2b03b58018 feat: Add x-axis label rotation and adjust chart height 2024-09-26 18:58:02 -07:00
Paul Gauthier
f0c55a949c fix: update chart settings based on screen width 2024-09-26 18:58:01 -07:00
Paul Gauthier (aider)
d9e5d66957 feat: Introduce responsive font sizes based on screen width 2024-09-26 18:55:56 -07:00
Paul Gauthier
5ac71d8b6d copy 2024-09-26 17:46:52 -07:00
Paul Gauthier (aider)
1099cda9e4 feat: Add responsive options to the Chart.js configuration 2024-09-26 17:44:50 -07:00
Paul Gauthier
d1dd640577 cleanup 2024-09-26 17:43:05 -07:00
Paul Gauthier (aider)
9bc7c8f3b0 feat: Add title to chart legend 2024-09-26 17:43:01 -07:00
Paul Gauthier
7027b7b724 feat: Add new blog post for 'architect' 2024-09-26 17:40:31 -07:00
Paul Gauthier
87c6c636d1 Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-26 17:39:03 -07:00
Paul Gauthier
0ab5b40f52 copy 2024-09-26 17:29:45 -07:00
Paul Gauthier (aider)
6f8fe44fd6 feat: Move "Previous SOTA" label to the left side of the graph 2024-09-26 17:28:39 -07:00
Paul Gauthier (aider)
7c8f0ea7b6 feat: Reverse order of bars and legend in chart 2024-09-26 17:28:04 -07:00
Paul Gauthier
6c946006e8 rename 2024-09-26 17:27:04 -07:00
Paul Gauthier
edab00064d architect/editor copy 2024-09-26 16:17:24 -07:00
Paul Gauthier
d6cf8377f1 rename files architect/editor 2024-09-26 16:16:05 -07:00
Paul Gauthier
eb21cf2830 architect/editor 2024-09-26 16:10:19 -07:00
paul-gauthier
17108c4328 Merge pull request #1762 from fry69/git-history-tip 2024-09-26 14:44:07 -07:00
fry69
0e9f384732 feat: add section on including git history in aider context 2024-09-26 23:03:13 +02:00
fry69
162afd0cdd doc: Add tips for including git history in Aider chat context 2024-09-26 22:59:46 +02:00
Paul Gauthier
b551e29de3 copy 2024-09-26 13:34:29 -07:00
Paul Gauthier
51bf028860 copy 2024-09-26 13:03:40 -07:00
Paul Gauthier
fadd362dbd copy 2024-09-26 12:54:35 -07:00
Paul Gauthier
7a12ca90d4 copy 2024-09-26 12:53:04 -07:00
Paul Gauthier
0b6c3f1c28 copy 2024-09-26 12:41:00 -07:00
Paul Gauthier
6d5575c705 copy 2024-09-26 12:24:10 -07:00
Paul Gauthier (aider)
857cc787a5 fix: Overlay stripe pattern on existing background color 2024-09-26 12:12:39 -07:00
Paul Gauthier (aider)
6b85e29ea7 fix: Update condition to check for empty item.junior_model 2024-09-26 12:11:53 -07:00
Paul Gauthier (aider)
bb50e1a959 feat: add thin stripes to all the "No Junior" columns in the graph 2024-09-26 12:10:59 -07:00
Paul Gauthier
bb8b0e32f2 feat: Increase font sizes in chart elements 2024-09-26 12:10:06 -07:00
Paul Gauthier (aider)
74a5ef51d4 feat: increase font sizes in graph 2024-09-26 12:04:36 -07:00
Paul Gauthier
f5cdaa06c8 feat: Separate code reasoning and editing 2024-09-26 12:04:35 -07:00
Paul Gauthier
7fe3518c8c copy 2024-09-26 11:57:55 -07:00
Paul Gauthier
e2d5545b48 copy 2024-09-26 11:52:47 -07:00
Paul Gauthier
862968ed20 copy 2024-09-26 11:50:25 -07:00
Paul Gauthier
50fb95c8b1 force pip to install aider's deps 2024-09-26 11:47:05 -07:00
Paul Gauthier
6b6f682a94 pip install -> pip install -U 2024-09-26 11:40:48 -07:00
Paul Gauthier
5e419ef8a6 copy 2024-09-26 11:36:40 -07:00
Paul Gauthier
c3b9d34e24 copy 2024-09-26 11:35:33 -07:00
Paul Gauthier (aider)
5a78e7d1b8 chore: Run the linter 2024-09-26 11:35:13 -07:00
Paul Gauthier (aider)
1c05192b69 fix: Only record junior_model and junior_edit_format in the results array if edit_format is "senior" 2024-09-26 11:35:09 -07:00
Paul Gauthier
068ff01cee restor 2024-09-26 11:34:02 -07:00
Paul Gauthier
7feaccd35a cleanup 2024-09-26 11:29:39 -07:00
Paul Gauthier (aider)
bf015e27d6 feat: Add --senior switch as alias for --edit-format senior 2024-09-26 11:27:55 -07:00
Paul Gauthier (aider)
3fe3e0f700 feat: Add --o1-mini and --o1-preview aliases for model selection 2024-09-26 11:27:14 -07:00
Paul Gauthier
b3e3a5a401 better 2024-09-26 11:21:35 -07:00
Paul Gauthier
d375103b64 data 2024-09-26 11:20:22 -07:00
Paul Gauthier (aider)
b7ddd74631 fix: Remove stripes and dots from color patches in legends 2024-09-26 11:19:02 -07:00
Paul Gauthier (aider)
4b6dd92f73 feat: Add polka dot pattern to Deepseek diff bars 2024-09-26 11:17:45 -07:00
Paul Gauthier
aa7949467c feat: Reduce height of pass rate chart to 300px 2024-09-26 11:17:43 -07:00
Paul Gauthier (aider)
0cb8c891d9 feat: Add striped pattern to Deepseek whole bars 2024-09-26 11:16:39 -07:00
Paul Gauthier
1d454c1729 feat: Increase height of pass rate chart to 400px 2024-09-26 11:16:38 -07:00
Paul Gauthier
b867c04354 feat: Implement Senior/Junior approach for code editing 2024-09-26 11:14:19 -07:00
Paul Gauthier (aider)
b4bd5ffb69 feat: add horizontal dashed line at y=79.7 labeled "Previous SOTA" 2024-09-26 10:21:24 -07:00
Paul Gauthier
337b5f1f7a feat: Add new blog post on senior and junior developers 2024-09-26 10:21:23 -07:00
Paul Gauthier (aider)
2d5962ef2f fix: Properly nest x-axis title within x-axis configuration 2024-09-26 10:19:08 -07:00
Paul Gauthier
4f32da2bf0 feat: Add y-axis title to chart in senior-junior blog post 2024-09-26 10:19:07 -07:00
Paul Gauthier (aider)
5378171ed1 feat: add x-axis label to chart 2024-09-26 10:18:04 -07:00
Paul Gauthier
975f35dfbc feat: Add support for using two models to complete each coding task 2024-09-26 10:18:03 -07:00
Paul Gauthier (aider)
a4df572cfe feat: add legend for senior models 2024-09-26 10:12:19 -07:00
Paul Gauthier (aider)
e83c285d4f feat: color each bar based on the Senior model 2024-09-26 10:11:28 -07:00
Paul Gauthier (aider)
10eb25f5f5 feat: add bar graph of pass rate data 2024-09-26 10:10:32 -07:00
Paul Gauthier
04cc9d03e9 feat: Add senior/junior code editing benchmark chart 2024-09-26 10:07:59 -07:00
Paul Gauthier (aider)
c7e2255570 refactor: Change chart type from stacked to grouped bars 2024-09-26 09:43:14 -07:00
Paul Gauthier (aider)
d699f3025d feat: Increase chart height and improve title and axis label readability 2024-09-26 09:42:01 -07:00
Paul Gauthier (aider)
c33dd0ee7b fix: Avoid declaring dataset variable multiple times 2024-09-26 09:40:04 -07:00
Paul Gauthier (aider)
63a4ce0fe2 feat: Add a graph that displays the Pass Rate for each Senior/Junior/EditFormat 2024-09-26 09:39:16 -07:00
Paul Gauthier
222b9cff09 feat: Add support for using two models to complete coding tasks 2024-09-26 09:39:14 -07:00
Paul Gauthier (aider)
89aa385613 style: right-align cost entries in table 2024-09-26 08:31:26 -07:00
Paul Gauthier
ab8672574a fix: Update formatting for seconds per case and total cost in blog post 2024-09-26 08:31:25 -07:00
Paul Gauthier (aider)
034e65912e style: Format cost column to show two decimal places 2024-09-26 08:29:15 -07:00
Paul Gauthier
40bf3a1e58 feat: Update table formatting in blog post 2024-09-26 08:29:14 -07:00
Jonathan Ellis
d2fbc92507 feat: include non-repo files for completing /read 2024-09-26 10:28:03 -05:00
Paul Gauthier (aider)
fb9ffca9ea style: format cost column with two decimal places 2024-09-26 08:27:47 -07:00
Paul Gauthier
fbe0aa2a7b fix: Update table formatting for total_cost column 2024-09-26 08:27:46 -07:00
Paul Gauthier (aider)
3661c2c08a feat: Display cost with two decimal places 2024-09-26 08:26:41 -07:00
Paul Gauthier (aider)
8d22cadd30 style: format cost column as standard money 2024-09-26 08:26:11 -07:00
Paul Gauthier
f691878390 feat: Add edit format column to senior-junior benchmark table 2024-09-26 08:26:09 -07:00
Paul Gauthier (aider)
50570c4762 fix: Display edit_format if junior_edit_format is not available 2024-09-26 08:24:51 -07:00
Paul Gauthier
8ca92cdec0 fix: Update table styles in blog post 2024-09-26 08:24:51 -07:00
Paul Gauthier (aider)
bc1559fbc9 style: Enhance table styling to improve visual distinction of shaded rows 2024-09-26 08:12:19 -07:00
Paul Gauthier (aider)
ac9d46c1f7 feat: Shade every second group of Seniors 2024-09-26 08:11:07 -07:00
Paul Gauthier
fb2e59cf08 fix: Remove unnecessary horizontal rule from table 2024-09-26 08:11:06 -07:00
Paul Gauthier (aider)
e93744c990 style: replace markdown table with HTML <table> 2024-09-26 08:09:39 -07:00
Paul Gauthier (aider)
2698d80c63 refactor: Simplify sorting and grouping of data in senior-junior.md 2024-09-26 08:08:46 -07:00
Paul Gauthier (aider)
4d7d7ecd2b feat: Generate table from YAML data with dynamic sorting and grouping 2024-09-26 08:07:37 -07:00
Paul Gauthier
46f8b6dfe4 feat: Update benchmark data table in senior-junior blog post 2024-09-26 08:07:36 -07:00
Paul Gauthier (aider)
1676653ffb feat: Add dividers between blocks of same senior model in benchmark data table 2024-09-26 08:02:41 -07:00
Paul Gauthier
98e28642f9 feat: Update benchmark data table in senior-junior blog post 2024-09-26 08:02:28 -07:00
Paul Gauthier (aider)
f21c35c42a feat: Add benchmark data table 2024-09-26 07:58:26 -07:00
Paul Gauthier
3602dc4819 feat: Add new blog post on senior vs junior engineers 2024-09-26 07:58:25 -07:00
rti
6ccb8e3a13 fix(InputOutput): apply tool warning color 2024-09-26 08:41:13 +02:00
Paul Gauthier
e682eb8669 fix: Add junior model and junior edit format to benchmark results 2024-09-25 16:31:40 -07:00
Paul Gauthier (aider)
9f3cd92b18 feat: add junior_edit_format="junior-diff" to gpt-4o model settings 2024-09-25 14:33:20 -07:00
Paul Gauthier
25e833bbd4 fix: Rename JuniorWholeFileCoder and JuniorWholeFilePrompts classes 2024-09-25 14:25:16 -07:00
Paul Gauthier (aider)
3f682ed908 feat: Update 'openai/o1-mini' settings to include junior model information 2024-09-25 14:23:54 -07:00
Paul Gauthier
6568cd71d4 feat: add junior model settings to the model configuration 2024-09-25 14:23:54 -07:00
Paul Gauthier (aider)
c18d6a8960 chore: Run linter 2024-09-25 14:14:48 -07:00
Paul Gauthier (aider)
2ff5e4969e feat: Add JuniorEditBlockCoder and JuniorWholeFileCoder to __init__.py 2024-09-25 14:14:44 -07:00
Paul Gauthier (aider)
b3ae2c878f feat: Update junior_edit_format to use "junior-diff" instead of "diff" 2024-09-25 14:13:54 -07:00
Paul Gauthier
d1d043d924 fix: Simplify junior model assignment logic 2024-09-25 14:09:44 -07:00
Paul Gauthier
839ebe5a7c fix: Add missing attributes to junior coder 2024-09-25 14:03:24 -07:00
Paul Gauthier (aider)
ed7503dbbe feat: optimize find_latest_benchmark_dir to check only .md files and limit to one file per subtree 2024-09-25 12:20:45 -07:00
Paul Gauthier (aider)
e21cdafb15 style: run linter and fix code formatting issues 2024-09-25 12:18:43 -07:00
Paul Gauthier (aider)
8d90df1ebc feat: implement automatic selection of the most recently updated benchmark directory when using --stats without dirnames 2024-09-25 12:18:39 -07:00
Paul Gauthier
e6c938c489 feat: Add default junior edit format if not set 2024-09-25 12:03:25 -07:00
Paul Gauthier (aider)
24c959af2d feat: Add --junior-model and --junior-edit-format flags to the benchmark 2024-09-25 11:44:34 -07:00
Paul Gauthier
15cc709322 feat: Improve senior coder's edit format handling 2024-09-25 11:42:09 -07:00
Paul Gauthier (aider)
856d617610 feat: update all the claude 3.5 sonnet ModelSettings to use the appropriate junior_model_name and junior_edit_format=diff 2024-09-25 11:38:48 -07:00
Paul Gauthier
24c15db8d7 feat: add junior_edit_format parameter to get_junior_model method 2024-09-25 11:37:41 -07:00
Paul Gauthier (aider)
0ded63cd31 feat: Reorder Junior and Weak Model announcements 2024-09-25 11:18:17 -07:00
Paul Gauthier (aider)
f0d02f2c76 style: Improve formatting of long string 2024-09-25 11:17:39 -07:00
Paul Gauthier (aider)
f8cef655f0 feat: Add junior model information to announcement for senior edit format 2024-09-25 11:17:34 -07:00
Paul Gauthier (aider)
0a7e5f313f style: Run linter 2024-09-25 11:10:06 -07:00
Paul Gauthier (aider)
888d60d472 feat: Add --junior-edit-format argument and plumb it into Model() 2024-09-25 11:09:56 -07:00
Paul Gauthier (aider)
6d19abf7ec fix: Remove unused import of Model from aider/coders/senior_coder.py 2024-09-25 11:04:48 -07:00
Paul Gauthier (aider)
e718b43fc8 style: Fix formatting in senior_coder.py 2024-09-25 11:04:39 -07:00
Paul Gauthier (aider)
a4aa88a440 feat: Adapt SeniorCoder to use Model.junior_model 2024-09-25 11:04:34 -07:00
Paul Gauthier (aider)
e74e76e51c style: run linter 2024-09-25 11:03:25 -07:00
Paul Gauthier (aider)
926b3c9240 feat: Add --junior-model argument and plumb it into Model() 2024-09-25 11:03:15 -07:00
Paul Gauthier
11cdc4175f feat: Update model settings for claude-3-5-sonnet-20240620 2024-09-25 11:03:13 -07:00
Paul Gauthier
df8f57b628 feat: create a new junior coder with updated kwargs 2024-09-25 10:55:16 -07:00
Paul Gauthier
7bd1d49f23 feat: update model settings to include junior model and edit format 2024-09-25 10:47:31 -07:00
Paul Gauthier
130c6f7308 fix: Prompt user to confirm file edits before proceeding 2024-09-25 10:29:58 -07:00
Paul Gauthier
26745426ae fix: Update SeniorCoder class to configure and run JuniorCoder with appropriate settings 2024-09-25 10:27:27 -07:00
Paul Gauthier
087dbb40a3 feat: Add SeniorCoder and update prompts 2024-09-25 10:23:31 -07:00
Paul Gauthier (aider)
095bae6513 fix: Remove unused import and fix undefined name in senior_coder.py 2024-09-25 09:54:54 -07:00
Paul Gauthier (aider)
95c70951fd fix: Remove unused import and import correct base class 2024-09-25 09:54:39 -07:00
Paul Gauthier (aider)
58c27e401e style: Fix import order in junior_whole_coder.py 2024-09-25 09:54:27 -07:00
Paul Gauthier (aider)
f2d60528f7 fix: Remove unused import and fix undefined name 2024-09-25 09:54:23 -07:00
Paul Gauthier
65e57df7ea feat: Implement changes to handle files content in Coder and prompts 2024-09-25 09:54:16 -07:00
Paul Gauthier
075bc828f6 stand alone junior message 2024-09-25 08:41:49 -07:00
Paul Gauthier
c912982747 senior-junior 2024-09-25 08:25:11 -07:00
Paul Gauthier
a9e9f9cdbe Merge branch 'main' into ask-plan-simple 2024-09-25 07:46:15 -07:00
Paul Gauthier
75e1d519da fix: Handle all exceptions when loading parser in linter 2024-09-24 16:49:29 -07:00
Paul Gauthier
3c87e3670c copy 2024-09-24 14:05:49 -07:00
Paul Gauthier (aider)
ee3bf2311c fix: Resolve flake8 line length errors in aider/io.py 2024-09-24 14:03:30 -07:00
Paul Gauthier
6c570b1847 feat: Add modal cursor shape configuration 2024-09-24 14:03:20 -07:00
paul-gauthier
bbfafed372 Merge pull request #1634 from smh/customize-completion-menu-colors
style: completion menu colors customizable
2024-09-24 13:19:34 -07:00
paul-gauthier
0adb7e0fd3 Merge pull request #1590 from hypn4/main
feat: add `extra_body`field and use in model settings.
2024-09-24 13:16:38 -07:00
Paul Gauthier
486c5ab224 build: don't login to docker hub for docker build test 2024-09-24 13:02:31 -07:00
Paul Gauthier
99bf23c5ff fix: Set AIDER_CHECK_UPDATE environment variable to false in test setup 2024-09-24 12:42:37 -07:00
Paul Gauthier
82ebb7713a Return True to indicate successful install even if no module 2024-09-24 12:28:54 -07:00
Paul Gauthier
117ff96c76 fix: Properly refactor mdstream from Coder into IO 2024-09-24 11:53:05 -07:00
Paul Gauthier
46ab701782 copy 2024-09-24 09:52:17 -07:00
Paul Gauthier
ba6ef29896 feat: Add new leaderboard entry for gemini/gemini-1.5-flash-8b-exp-0924 model 2024-09-24 09:46:56 -07:00
Paul Gauthier
eff68a669d copy 2024-09-24 09:45:45 -07:00
Paul Gauthier
d8dd7a259b feat: Add new Gemini model configurations 2024-09-24 09:45:36 -07:00
Paul Gauthier
7569dea73c restore dynamic graph 2024-09-24 09:36:16 -07:00
Paul Gauthier
3edcd71a44 fix: move pydub import to avoid warnings 2024-09-24 09:29:00 -07:00
Paul Gauthier (aider)
ab786279e6 style: Fix linter warnings 2024-09-24 09:28:31 -07:00
Paul Gauthier (aider)
e267dc13af fix: Move imports to top of file 2024-09-24 09:28:28 -07:00
Paul Gauthier (aider)
d0e6dc2c1e style: Wrap long lines in voice.py 2024-09-24 09:28:16 -07:00
Paul Gauthier (aider)
da752bb00c fix: Suppress warning about missing ffmpeg or avconv 2024-09-24 09:28:13 -07:00
Paul Gauthier (aider)
6b5fe9bee3 style: Run linter on scripts/issues.py 2024-09-24 08:25:31 -07:00
Paul Gauthier (aider)
8422441f74 fix: Skip processing open issues that have been closed and re-opened 2024-09-24 08:25:28 -07:00
Paul Gauthier
86faaa65ff copy 2024-09-23 12:53:10 -07:00
Paul Gauthier
543437dd28 copy 2024-09-23 12:48:00 -07:00
Paul Gauthier (aider)
3e594877d7 style: Run linter on Python script 2024-09-23 12:27:13 -07:00
Paul Gauthier (aider)
c2a35fef05 refactor: Modify script to only show versions compatible with Python 3.8 or lower 2024-09-23 12:27:10 -07:00
Paul Gauthier (aider)
bbeb4749cb style: Run linter 2024-09-23 12:26:23 -07:00
Paul Gauthier (aider)
00662aef54 feat: Add Python version support information to yank-old-versions.py 2024-09-23 12:26:20 -07:00
Paul Gauthier (aider)
7a0196e039 style: Run linter on Python script 2024-09-23 12:24:55 -07:00
Paul Gauthier (aider)
ee6cbddf65 feat: Add script to enumerate PyPI versions supporting Python 3.8 or lower 2024-09-23 12:24:52 -07:00
Paul Gauthier
7016ccc150 chore: Add script to yank old versions 2024-09-23 12:24:51 -07:00
Paul Gauthier
a4b79127b0 fix: Handle ZeroDivisionError in PageRank calculation 2024-09-23 11:49:44 -07:00
Paul Gauthier (aider)
ed1eb38c5f fix: Split long comment line in aider/repo.py 2024-09-23 11:41:34 -07:00
Paul Gauthier
8f583ca119 fix: Handle ValueError when getting relative path in ignored_file_raw 2024-09-23 11:41:28 -07:00
Paul Gauthier (aider)
1fe2be4633 fix: ignore unicode errors in append_chat_history 2024-09-23 11:38:51 -07:00
Paul Gauthier
d063be23c9 fix: Improve error handling in load_dotenv_files function 2024-09-23 11:36:49 -07:00
Paul Gauthier (aider)
25c3a959dd fix: Handle OSError when loading dotenv files 2024-09-23 11:35:27 -07:00
Paul Gauthier
924eeb43de fix: Update test assertions for API key checks 2024-09-23 11:34:49 -07:00
Paul Gauthier
d518493bb9 fix: Update model sanity check output format 2024-09-23 11:32:52 -07:00
Paul Gauthier
ba0a328196 fix: Disable SSL verification for LiteLLM client sessions 2024-09-23 11:28:17 -07:00
Paul Gauthier
1de8c13974 copy 2024-09-23 10:30:22 -07:00
Paul Gauthier (aider)
f2397bb0cc chore: Reorganize command-line arguments in aider/args.py 2024-09-23 09:08:07 -07:00
Paul Gauthier (aider)
5779006db0 feat: Add Voice Settings section 2024-09-23 09:06:57 -07:00
Paul Gauthier (aider)
39b2f7bdee feat: Add Cache Settings section 2024-09-23 09:06:31 -07:00
Paul Gauthier (aider)
5e9a4e01f9 feat: Move map-tokens, map-refresh and map-multiplier into a new Repomap Setting section 2024-09-23 09:04:46 -07:00
Paul Gauthier
9c47f26052 copy 2024-09-23 09:03:02 -07:00
Paul Gauthier (aider)
b03d5d1099 style: Wrap long help text in args.py 2024-09-23 09:02:49 -07:00
Paul Gauthier (aider)
c9ac01f474 docs: update help message for --map-refresh option 2024-09-23 09:02:45 -07:00
paul-gauthier
c5245d3d8b Merge pull request #1660 from fry69/bad_ver-fix
fix: add missing variable initialization
2024-09-23 07:14:27 -07:00
hypn4
a4044f4175 feat: add .venv directory 2024-09-23 20:37:10 +09:00
hypn4
6dc846d41b fix: added missing parameters.
added missing parameters in `simple_send_with_retries` function.
2024-09-23 20:37:10 +09:00
hypn4
d0bce02c00 feat: add extra_bodyfield and use in model settings.
resolved: #1583

The `extra_body` field is a parameter used by the `openai` provider.

Since `litellm` also uses this field to additionally transmit `request body`, I added a function so that `aider` can also utilize the `extra_body` field.

The `openrouter` provider also supports various functions through the additional field of `request body`, so we added the function.

The following is how to use it in model settings.
```yaml
# .aider.model.settings.yml
- name: "openrouter/<YOUR_MODEL>"
  edit_format: "whole"
  use_repo_map: true
  extra_body:
    provider:
      order:
      - Azure
      allow_fallbacks: false
```
2024-09-23 20:37:10 +09:00
fry69
7a5947fc49 feat: add tests for sanity_check_repo function 2024-09-23 07:55:45 +02:00
fry69
a695c6c46e fix: add missing variable initialization 2024-09-23 07:02:33 +02:00
Paul Gauthier
ca4141564f copy 2024-09-22 17:03:43 -07:00
Paul Gauthier
6cc0f96e33 Merge remote-tracking branch 'refs/remotes/origin/main' 2024-09-22 17:03:04 -07:00
Paul Gauthier
a1bd0c97ee copy 2024-09-22 17:01:47 -07:00
Paul Gauthier (aider)
6a733f8e76 refactor: Rename print_model_settings_as_yaml to get_model_settings_as_yaml 2024-09-22 16:55:58 -07:00
Paul Gauthier (aider)
60082d0d16 style: format code using linter 2024-09-22 16:54:56 -07:00
Paul Gauthier (aider)
ea72ad61fe feat: add function to print model settings as YAML 2024-09-22 16:54:51 -07:00
paul-gauthier
a4f608f3dd Merge pull request #1543 from fry69/ctrl-space-fix 2024-09-22 13:42:34 -07:00
paul-gauthier
737ccdec11 Merge pull request #1639 from curran/patch-1 2024-09-22 13:34:31 -07:00
Paul Gauthier
129afd0396 copy 2024-09-22 13:06:52 -07:00
paul-gauthier
62f4dc2097 Merge pull request #1640 from mbailey/feature-voice-compression
feat: Option to compress audio files by ~90%
2024-09-22 13:05:18 -07:00
Stein Martin Hustad
ef75ba9495 style: completion menu colorization (additional location) 2024-09-22 22:59:57 +04:00
Paul Gauthier
cee0bb7135 add test for hash filenames 2024-09-22 08:24:55 -07:00
Paul Gauthier
54cfbc4142 handle ### filename.ext in whole format 2024-09-22 08:21:15 -07:00
Curran Kelleher
330fa863c8 Add benchmark results for Codestral-22B 2024-09-22 08:26:04 -04:00
Mike Bailey
1cc30a22f9 feat: Option to compress audio files by ~90%
Add option to reduce bandwidth (and potentially latency) by converting
voice recordings (wav) into a compressed audio format (webm or mp3).

Default behaviour is unchanged.

> File uploads are currently limited to 25 MB and the following input file
> types are supported: mp3, mp4, mpeg, mpga, m4a, wav, and webm.
>
> - https://platform.openai.com/docs/guides/speech-to-text
2024-09-22 22:20:07 +10:00
Stein Martin Hustad
a91d3fed01 style: completion menu colors customizable 2024-09-22 10:45:00 +04:00
Paul Gauthier
edf8fc6327 fix: Remove progress bar when closing duplicate issues 2024-09-21 19:06:08 -07:00
Paul Gauthier
12f1bf643a fix: Add ValueError to ANY_GIT_ERROR tuple 2024-09-21 19:02:35 -07:00
Paul Gauthier
2314179b83 fix: Add default encoding to load_dotenv_files function 2024-09-21 19:01:24 -07:00
Paul Gauthier (aider)
516a3a6647 style: Fix formatting in load_dotenv_files function 2024-09-21 18:58:48 -07:00
Paul Gauthier (aider)
07a95deaba fix: Use args.encoding when loading .env files 2024-09-21 18:58:43 -07:00
Paul Gauthier
212e22b2b7 fix: Handle file read errors in linter 2024-09-21 18:55:24 -07:00
Paul Gauthier (aider)
3a96a10d06 style: Format code with black 2024-09-21 18:46:24 -07:00
Paul Gauthier (aider)
3dfc63ce79 feat: Add support for following redirects in httpx-based scraping 2024-09-21 18:46:21 -07:00
Paul Gauthier
a77c8ccfa9 copy 2024-09-21 18:43:02 -07:00
Paul Gauthier (aider)
eff9325f2b style: Fix formatting in issue comment 2024-09-21 18:38:03 -07:00
Paul Gauthier (aider)
0101ae76d1 refactor: Move comment_body to a global multiline string 2024-09-21 18:37:59 -07:00
Paul Gauthier
26f9a10324 fix: Add greeting to comment when closing duplicate issue 2024-09-21 18:36:33 -07:00
Paul Gauthier (aider)
6731815251 style: Fix formatting in issues.py 2024-09-21 18:30:39 -07:00
Paul Gauthier (aider)
b4fdb72a3a fix: Only print Oldest issue #{oldest_issue['number']} left open if it is open 2024-09-21 18:30:35 -07:00
Jonathan Ellis
dca9b18871 feat: rename /clipboard to /paste 2024-09-19 09:45:59 -05:00
fry69
baddc0b63c fix: add keybinding to insert space on Ctrl+Space 2024-09-15 15:18:09 +02:00
Paul Gauthier
8cb83afcc4 ask transient whole, o1-preview deep 2024-09-12 17:21:35 -07:00
Paul Gauthier
83662b7470 Merge branch 'main' into ask-plan-simple 2024-09-12 17:19:14 -07:00
Paul Gauthier
5408dcb185 wip 2024-09-11 09:32:14 -07:00
Paul Gauthier
39ae106bb3 wip 2024-09-10 15:21:54 -07:00
Paul Gauthier
abd484bfa7 wip 2024-09-06 12:01:51 -07:00
Paul Gauthier
cc15909629 clean diff edit format 2024-09-06 11:25:20 -07:00
Paul Gauthier
5b584db90c sonnet-sonnet gets 60.2/84.2 2024-09-06 09:49:01 -07:00
Paul Gauthier
05dcbeecac noop 2024-09-05 14:25:09 -07:00
Paul Gauthier
ff3a75413b sonnet+deep got 60.9/82.0 2024-09-05 13:30:25 -07:00
Paul Gauthier
0aad7b46f6 cleaner logic for load/save analytics.json 2024-08-16 11:28:13 -07:00
Paul Gauthier
62d8190733 copy 2024-08-16 11:04:54 -07:00
Paul Gauthier
4759297b67 disabled -> permanently_disabled 2024-08-16 11:03:14 -07:00
Paul Gauthier
607a9a8c86 track -> enable 2024-08-16 10:59:44 -07:00
Paul Gauthier
96b67ab26c copy 2024-08-16 10:45:14 -07:00
Paul Gauthier
93b8cb9cec Merge branch 'main' into mixpanel 2024-08-16 10:42:55 -07:00
Paul Gauthier (aider)
7b6ad16fdb fix: Preserve existing UUID when marking analytics as disabled 2024-08-13 14:22:39 -07:00
Paul Gauthier (aider)
b722572a28 style: format analytics.py file 2024-08-13 13:03:54 -07:00
Paul Gauthier (aider)
46489f1a46 feat: Add PostHog analytics integration 2024-08-13 13:03:51 -07:00
Paul Gauthier
d7a29c42b7 Merge branch 'main' into mixpanel 2024-08-13 13:01:43 -07:00
Paul Gauthier (aider)
1ebe5f8bd5 feat: add edit_format to event() call 2024-08-13 10:04:28 -07:00
Paul Gauthier
26fe63b7ac cleanup 2024-08-13 10:04:05 -07:00
Paul Gauthier
d2435c2e00 copy 2024-08-13 10:02:54 -07:00
Paul Gauthier
4d04a35e73 Merge branch 'main' into mixpanel 2024-08-13 09:52:50 -07:00
Paul Gauthier
cabad84521 tweak 2024-08-13 08:12:23 -07:00
Paul Gauthier
aeadf2f139 fix: Disable analytics by default and provide option to enable 2024-08-13 08:08:05 -07:00
Paul Gauthier
4ebbfa01b7 share last 1k analytics logs 2024-08-13 07:50:28 -07:00
Paul Gauthier
960b456e70 cleanup 2024-08-13 07:50:06 -07:00
Paul Gauthier (aider)
329514289d fix: Initialize Analytics instance with track=False if analytics is None 2024-08-13 07:45:35 -07:00
Paul Gauthier (aider)
03f14dfe47 feat: Create Analytics instance with track=False if analytics is None 2024-08-13 07:45:19 -07:00
Paul Gauthier (aider)
1c321df457 feat: Move analytics arguments to their own section 2024-08-13 07:23:46 -07:00
Paul Gauthier
8a21eb7804 handle new vars that accumulate tokens/costs for infinite output 2024-08-13 07:23:01 -07:00
Paul Gauthier
c1d4adbebf added mixpanel dep 2024-08-13 07:18:26 -07:00
Paul Gauthier
ef933c207b Merge branch 'main' into mixpanel 2024-08-13 07:17:13 -07:00
Paul Gauthier
08aaae4d36 initial 2024-08-13 07:16:35 -07:00
Paul Gauthier
f52265362f Merge branch 'main' into mixpanel 2024-08-13 07:09:34 -07:00
Paul Gauthier (aider)
00aa43d964 fix: Move imports to the top of the file in aider/analytics.py 2024-08-12 20:44:56 -07:00
Paul Gauthier (aider)
84489f16b5 refactor: Refactor data file name and mkdir operations 2024-08-12 20:44:42 -07:00
Paul Gauthier
e07194bbeb fix: Rename uuid_file to data_file for consistency 2024-08-12 20:44:41 -07:00
Paul Gauthier (aider)
1567d3e3d1 fix: Remove duplicate get_or_create_uuid method 2024-08-12 20:41:59 -07:00
Paul Gauthier (aider)
eca7a57138 style: Format code with linter 2024-08-12 20:41:17 -07:00
Paul Gauthier (aider)
64df0ad590 feat: Add --analytics-disable option to disable analytics tracking 2024-08-12 20:41:10 -07:00
Paul Gauthier
5a28d499a8 fix: Update the path for the Mixpanel UUID file 2024-08-12 20:41:09 -07:00
Paul Gauthier
4bad876f66 fix: Add event tracking for interactive help command 2024-08-12 20:36:51 -07:00
Paul Gauthier (aider)
1a8763d989 feat: Add --analytics-log argument and pass it to Analytics 2024-08-12 18:27:40 -07:00
Paul Gauthier (aider)
13eaf5e5ce style: Fix formatting in analytics.py 2024-08-12 18:26:11 -07:00
Paul Gauthier (aider)
82250db8af feat: Add logfile support to Analytics class 2024-08-12 18:26:08 -07:00
Paul Gauthier
85fa78f5a6 fix: Correct command execution logic 2024-08-12 18:23:51 -07:00
Paul Gauthier (aider)
9ed732959e fix: Remove unnecessary slice from event name in Commands.run 2024-08-12 18:22:51 -07:00
Paul Gauthier (aider)
860a36fe6c refactor: Extract command name from matching_commands[0][1:] 2024-08-12 18:22:36 -07:00
Paul Gauthier (aider)
01a9a8ffc4 feat: add event logging for command usage 2024-08-12 18:22:05 -07:00
Paul Gauthier
aa840f0e28 be careful logging main_models that are not in the model db 2024-08-12 18:20:35 -07:00
Paul Gauthier (aider)
a7a626423c fix: Remove properties argument from event method in Analytics class 2024-08-12 18:08:02 -07:00
Paul Gauthier
c2c9b60ea6 feat: Add main_model parameter to event method in analytics.py 2024-08-12 18:08:01 -07:00
Paul Gauthier (aider)
a6282818db fix: Add early return if self.mp is not set 2024-08-12 16:23:12 -07:00
Paul Gauthier (aider)
f563544761 style: Fix linter issues in analytics.py 2024-08-12 16:21:49 -07:00
Paul Gauthier (aider)
48a344bc6d feat: Add system information to all events 2024-08-12 16:21:46 -07:00
Paul Gauthier
f110e8c8db fix: Update Mixpanel project token 2024-08-12 16:21:45 -07:00
Paul Gauthier (aider)
65c0608d5c style: format code 2024-08-12 16:17:17 -07:00
Paul Gauthier (aider)
57ce0dca67 feat: add self.event() to calculate_and_show_tokens_and_cost 2024-08-12 16:17:11 -07:00
Paul Gauthier
4129065d6c fix: Add event attribute to Coder class 2024-08-12 16:17:10 -07:00
Paul Gauthier (aider)
d59fd508c2 style: Apply linter formatting to analytics.py 2024-08-12 16:16:42 -07:00
Paul Gauthier (aider)
62a5cf8dee feat: Handle numeric values in event properties 2024-08-12 16:16:39 -07:00
Paul Gauthier (aider)
6ec4e60058 feat: Add kwargs support to event() method 2024-08-12 16:14:11 -07:00
Paul Gauthier
087b3d4ffb feat: Rename track_event to event in aider/analytics.py 2024-08-12 16:14:10 -07:00
Paul Gauthier (aider)
7d3585bafe style: Fix formatting and linting issues in analytics.py 2024-08-12 16:11:23 -07:00
Paul Gauthier (aider)
1a49974f98 feat: add aider version number to all events 2024-08-12 16:11:20 -07:00
Paul Gauthier
b11c17dbd4 feat: Add optional analytics tracking 2024-08-12 16:10:20 -07:00
Paul Gauthier
474ac62391 feat: Add analytics field to Coder class 2024-08-12 16:08:58 -07:00
Paul Gauthier (aider)
6ee8a74d47 style: format code with linter 2024-08-12 16:07:15 -07:00
Paul Gauthier (aider)
121dd908a6 feat: Add Mixpanel project token to Analytics class 2024-08-12 16:07:12 -07:00
Paul Gauthier
2e1ac25ce2 feat: Add analytics module with Mixpanel integration 2024-08-12 16:07:11 -07:00
Paul Gauthier
b49ee06f23 feat: Add analytics.py module 2024-08-12 16:05:06 -07:00
140 changed files with 9771 additions and 1016 deletions

View File

@@ -27,17 +27,9 @@ jobs:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
dockerhub_username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub_password: ${{ secrets.DOCKERHUB_PASSWORD }}
if: ${{ env.dockerhub_username }} && ${{ env.dockerhub_password }}
- name: Build Docker standard image
uses: docker/build-push-action@v5

View File

@@ -70,15 +70,15 @@ jobs:
id: deployment
uses: actions/deploy-pages@v2
- name: Set up Python ${{ matrix.python-version }}
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
python-version: '3.12'
- name: Install linkchecker
run: |
python -m pip install --upgrade pip
pip install linkchecker
python -m pip install linkchecker
- name: Run linkchecker
run: |

1
.gitignore vendored
View File

@@ -11,3 +11,4 @@ _site
.jekyll-cache/
.jekyll-metadata
aider/__version__.py
.venv/

View File

@@ -17,10 +17,10 @@ Contributions of
[LLM benchmark results](https://aider.chat/docs/leaderboards/)
are welcome!
See the
[benchmark README](https://github.com/paul-gauthier/aider/blob/main/benchmark/README.md)
[benchmark README](https://github.com/Aider-AI/aider/blob/main/benchmark/README.md)
for information on running aider's code editing benchmarks.
Submit results by opening a PR with edits to the
[benchmark results data files](https://github.com/paul-gauthier/aider/blob/main/aider/website/_data/).
[benchmark results data files](https://github.com/Aider-AI/aider/blob/main/aider/website/_data/).
## Pull Requests
@@ -33,19 +33,16 @@ ensure that your contributions can be integrated smoothly.
## Licensing
By contributing to this project, you agree that your contributions
will be licensed under the Apache License 2.0. Additionally, you
understand and agree that contributions may be subject to a different
license, should the project maintainers decide to change the licensing
terms.
Before contributing a PR, please review our
[Individual Contributor License Agreement](https://aider.chat/docs/legal/contributor-agreement.html).
All contributors will be asked to complete the agreement as part of the PR process.
## Setting up a Development Environment
### Clone the Repository
```
git clone https://github.com/paul-gauthier/aider.git
git clone https://github.com/Aider-AI/aider.git
cd aider
```
@@ -154,6 +151,10 @@ The project's documentation is built using Jekyll and hosted on GitHub Pages. To
```
bundle exec jekyll build
```
5. Preview the website while editing (optional):
```
bundle exec jekyll serve
```
The built documentation will be available in the `aider/website/_site` directory.

View File

@@ -1,6 +1,119 @@
# Release history
### Aider v0.63.0
- Support for Qwen 2.5 Coder 32B.
- `/web` command just adds the page to the chat, without triggering an LLM response.
- Improved prompting for the user's preferred chat language.
- Improved handling of LiteLLM exceptions.
- Bugfix for double-counting tokens when reporting cache stats.
- Bugfix for the LLM creating new files.
- Other small bug fixes.
- Aider wrote 55% of the code in this release.
### Aider v0.62.0
- Full support for Claude 3.5 Haiku
- Scored 75% on [aider's code editing leaderboard](https://aider.chat/docs/leaderboards/).
- Almost as good as Sonnet at much lower cost.
- Launch with `--haiku` to use it.
- Easily apply file edits from ChatGPT, Claude or other web apps
- Chat with ChatGPT or Claude via their web app.
- Give it your source files and ask for the changes you want.
- Use the web app's "copy response" button to copy the entire reply from the LLM.
- Run `aider --apply-clipboard-edits file-to-edit.js`.
- Aider will edit your file with the LLM's changes.
- Bugfix for creating new files.
- Aider wrote 84% of the code in this release.
### Aider v0.61.0
- Load and save aider slash-commands to files:
- `/save <fname>` command will make a file of `/add` and `/read-only` commands that recreate the current file context in the chat.
- `/load <fname>` will replay the commands in the file.
- You can use `/load` to run any arbitrary set of slash-commands, not just `/add` and `/read-only`.
- Use `--load <fname>` to run a list of commands on launch, before the interactive chat begins.
- Anonymous, opt-in [analytics](https://aider.chat/docs/more/analytics.html) with no personal data sharing.
- Aider follows litellm's `supports_vision` attribute to enable image support for models.
- Bugfix for when diff mode flexibly handles the model using the wrong filename.
- Displays filenames in sorted order for `/add` and `/read-only`.
- New `--no-fancy-input` switch disables prompt toolkit input, now still available with `--no-pretty`.
- Override browser config with `--no-browser` or `--no-gui`.
- Offer to open documentation URLs when errors occur.
- Properly support all o1 models, regardless of provider.
- Improved layout of filenames above input prompt.
- Better handle corrupted repomap tags cache.
- Improved handling of API errors, especially when accessing the weak model.
- Aider wrote 68% of the code in this release.
### Aider v0.60.1
- Enable image support for Sonnet 10/22.
- Display filenames in sorted order.
### Aider v0.60.0
- Full support for Sonnet 10/22, the new SOTA model on aider's code editing benchmark.
- Aider uses Sonnet 10/22 by default.
- Improved formatting of added and read-only files above chat prompt, by @jbellis.
- Improved support for o1 models by more flexibly parsing their nonconforming code edit replies.
- Corrected diff edit format prompt that only the first match is replaced.
- Stronger whole edit format prompt asking for clean file names.
- Now offers to add `.env` to the `.gitignore` file.
- Ships with a small model metadata json file to handle models not yet updated in litellm.
- Model settings for o1 models on azure.
- Bugfix to properly include URLs in `/help` RAG results.
- Aider wrote 49% of the code in this release.
### Aider v0.59.1
- Check for obsolete `yes: true` in yaml config, show helpful error.
- Model settings for openrouter/anthropic/claude-3.5-sonnet:beta
### Aider v0.59.0
- Improvements to `/read-only`:
- Now supports shell-style auto-complete of the full file system.
- Still auto-completes the full paths of the repo files like `/add`.
- Now supports globs like `src/**/*.py`
- Renamed `--yes` to `--yes-always`.
- Now uses `AIDER_YES_ALWAYS` env var and `yes-always:` yaml key.
- Existing YAML and .env files will need to be updated.
- Can still abbreviate to `--yes` on the command line.
- Config file now uses standard YAML list syntax with ` - list entries`, one per line.
- `/settings` now includes the same announcement lines that would print at launch.
- Sanity checks the `--editor-model` on launch now, same as main and weak models.
- Added `--skip-sanity-check-repo` switch to speedup launch in large repos.
- Bugfix so architect mode handles Control-C properly.
- Repo-map is deterministic now, with improved caching logic.
- Improved commit message prompt.
- Aider wrote 77% of the code in this release.
### Aider v0.58.1
- Fixed bug where cache warming pings caused subsequent user messages to trigger a tight loop of LLM requests.
### Aider v0.58.0
- [Use a pair of Architect/Editor models for improved coding](https://aider.chat/2024/09/26/architect.html)
- Use a strong reasoning model like o1-preview as your Architect.
- Use a cheaper, faster model like gpt-4o as your Editor.
- New `--o1-preview` and `--o1-mini` shortcuts.
- Support for new Gemini 002 models.
- Better support for Qwen 2.5 models.
- Many confirmation questions can be skipped for the rest of the session with "(D)on't ask again" response.
- Autocomplete for `/read-only` supports the entire filesystem.
- New settings for completion menu colors.
- New `/copy` command to copy the last LLM response to the clipboard.
- Renamed `/clipboard` to `/paste`.
- Will now follow HTTP redirects when scraping urls.
- New `--voice-format` switch to send voice audio as wav/mp3/webm, by @mbailey.
- ModelSettings takes `extra_params` dict to specify any extras to pass to `litellm.completion()`.
- Support for cursor shapes when in vim mode.
- Numerous bug fixes.
- Aider wrote 53% of the code in this release.
### Aider v0.57.1
- Fixed dependency conflict between aider-chat[help] and [playwright].
@@ -665,7 +778,7 @@
### Aider v0.14.0
- [Support for Claude2 and other LLMs via OpenRouter](https://aider.chat/docs/faq.html#accessing-other-llms-with-openrouter) by @joshuavial
- Documentation for [running the aider benchmarking suite](https://github.com/paul-gauthier/aider/tree/main/benchmark)
- Documentation for [running the aider benchmarking suite](https://github.com/Aider-AI/aider/tree/main/benchmark)
- Aider now requires Python >= 3.9

View File

@@ -46,7 +46,7 @@ cog.out(open("aider/website/_includes/get-started.md").read())
You can get started quickly like this:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
# Change directory into a git repo
cd /to/your/git/repo
@@ -107,7 +107,7 @@ projects like django, scikitlearn, matplotlib, etc.
- [Configuration](https://aider.chat/docs/config.html)
- [Troubleshooting](https://aider.chat/docs/troubleshooting.html)
- [LLM Leaderboards](https://aider.chat/docs/leaderboards/)
- [GitHub](https://github.com/paul-gauthier/aider)
- [GitHub](https://github.com/Aider-AI/aider)
- [Discord](https://discord.gg/Tv2uQnR88V)
- [Blog](https://aider.chat/blog/)
@@ -118,14 +118,14 @@ projects like django, scikitlearn, matplotlib, etc.
- *The best AI coding assistant so far.* -- [Matthew Berman](https://www.youtube.com/watch?v=df8afeb1FY8)
- *Aider ... has easily quadrupled my coding productivity.* -- [SOLAR_FIELDS](https://news.ycombinator.com/item?id=36212100)
- *It's a cool workflow... Aider's ergonomics are perfect for me.* -- [qup](https://news.ycombinator.com/item?id=38185326)
- *It's really like having your senior developer live right in your Git repo - truly amazing!* -- [rappster](https://github.com/paul-gauthier/aider/issues/124)
- *What an amazing tool. It's incredible.* -- [valyagolev](https://github.com/paul-gauthier/aider/issues/6#issue-1722897858)
- *Aider is such an astounding thing!* -- [cgrothaus](https://github.com/paul-gauthier/aider/issues/82#issuecomment-1631876700)
- *It's really like having your senior developer live right in your Git repo - truly amazing!* -- [rappster](https://github.com/Aider-AI/aider/issues/124)
- *What an amazing tool. It's incredible.* -- [valyagolev](https://github.com/Aider-AI/aider/issues/6#issue-1722897858)
- *Aider is such an astounding thing!* -- [cgrothaus](https://github.com/Aider-AI/aider/issues/82#issuecomment-1631876700)
- *It was WAY faster than I would be getting off the ground and making the first few working versions.* -- [Daniel Feldman](https://twitter.com/d_feldman/status/1662295077387923456)
- *THANK YOU for Aider! It really feels like a glimpse into the future of coding.* -- [derwiki](https://news.ycombinator.com/item?id=38205643)
- *It's just amazing. It is freeing me to do things I felt were out my comfort zone before.* -- [Dougie](https://discord.com/channels/1131200896827654144/1174002618058678323/1174084556257775656)
- *This project is stellar.* -- [funkytaco](https://github.com/paul-gauthier/aider/issues/112#issuecomment-1637429008)
- *Amazing project, definitely the best AI coding assistant I've used.* -- [joshuavial](https://github.com/paul-gauthier/aider/issues/84)
- *This project is stellar.* -- [funkytaco](https://github.com/Aider-AI/aider/issues/112#issuecomment-1637429008)
- *Amazing project, definitely the best AI coding assistant I've used.* -- [joshuavial](https://github.com/Aider-AI/aider/issues/84)
- *I absolutely love using Aider ... It makes software development feel so much lighter as an experience.* -- [principalideal0](https://discord.com/channels/1131200896827654144/1133421607499595858/1229689636012691468)
- *I have been recovering from multiple shoulder surgeries ... and have used aider extensively. It has allowed me to continue productivity.* -- [codeninja](https://www.reddit.com/r/OpenAI/s/nmNwkHy1zG)
- *I am an aider addict. I'm getting so much more work done, but in less time.* -- [dandandan](https://discord.com/channels/1131200896827654144/1131200896827654149/1135913253483069470)

View File

@@ -1,6 +1,6 @@
try:
from aider.__version__ import __version__
except Exception:
__version__ = "0.57.2.dev"
__version__ = "0.63.2.dev"
__all__ = [__version__]

164
aider/analytics.py Normal file
View File

@@ -0,0 +1,164 @@
import json
import platform
import sys
import time
import uuid
from pathlib import Path
from mixpanel import Mixpanel
from posthog import Posthog
from aider import __version__
from aider.dump import dump # noqa: F401
from aider.models import model_info_manager
mixpanel_project_token = "6da9a43058a5d1b9f3353153921fb04d"
posthog_project_api_key = "phc_99T7muzafUMMZX15H8XePbMSreEUzahHbtWjy3l5Qbv"
posthog_host = "https://us.i.posthog.com"
class Analytics:
# providers
mp = None
ph = None
# saved
user_id = None
permanently_disable = None
asked_opt_in = None
# ephemeral
logfile = None
def __init__(self, logfile=None, permanently_disable=False):
self.logfile = logfile
self.get_or_create_uuid()
if self.permanently_disable or permanently_disable or not self.asked_opt_in:
self.disable(permanently_disable)
def enable(self):
if not self.user_id:
self.disable(False)
return
if self.permanently_disable:
self.disable(True)
return
if not self.asked_opt_in:
self.disable(False)
return
self.mp = Mixpanel(mixpanel_project_token)
self.ph = Posthog(project_api_key=posthog_project_api_key, host=posthog_host)
def disable(self, permanently):
self.mp = None
self.ph = None
if permanently:
self.asked_opt_in = True
self.permanently_disable = True
self.save_data()
def need_to_ask(self):
return not self.asked_opt_in and not self.permanently_disable
def get_data_file_path(self):
data_file = Path.home() / ".aider" / "analytics.json"
data_file.parent.mkdir(parents=True, exist_ok=True)
return data_file
def get_or_create_uuid(self):
self.load_data()
if self.user_id:
return
self.user_id = str(uuid.uuid4())
self.save_data()
def load_data(self):
data_file = self.get_data_file_path()
if data_file.exists():
try:
data = json.loads(data_file.read_text())
self.permanently_disable = data.get("permanently_disable")
self.user_id = data.get("uuid")
self.asked_opt_in = data.get("asked_opt_in", False)
except (json.decoder.JSONDecodeError, OSError):
self.disable(permanently=False)
def save_data(self):
data_file = self.get_data_file_path()
data = dict(
uuid=self.user_id,
permanently_disable=self.permanently_disable,
asked_opt_in=self.asked_opt_in,
)
# Allow exceptions; crash if we can't record permanently_disabled=True, etc
data_file.write_text(json.dumps(data, indent=4))
def get_system_info(self):
return {
"python_version": sys.version.split()[0],
"os_platform": platform.system(),
"os_release": platform.release(),
"machine": platform.machine(),
}
def _redact_model_name(self, model):
if not model:
return None
info = model_info_manager.get_model_from_cached_json_db(model.name)
if info:
return model.name
elif "/" in model.name:
return model.name.split("/")[0] + "/REDACTED"
return None
def event(self, event_name, main_model=None, **kwargs):
if not (self.mp or self.ph) and not self.logfile:
return
properties = {}
if main_model:
properties["main_model"] = self._redact_model_name(main_model)
properties["weak_model"] = self._redact_model_name(main_model.weak_model)
properties["editor_model"] = self._redact_model_name(main_model.editor_model)
properties.update(kwargs)
properties.update(self.get_system_info()) # Add system info to all events
# Handle numeric values
for key, value in properties.items():
if isinstance(value, (int, float)):
properties[key] = value
else:
properties[key] = str(value)
properties["aider_version"] = __version__
if self.mp:
self.mp.track(self.user_id, event_name, dict(properties))
if self.ph:
self.ph.capture(self.user_id, event_name, dict(properties))
if self.logfile:
log_entry = {
"event": event_name,
"properties": properties,
"user_id": self.user_id,
"time": int(time.time()),
}
with open(self.logfile, "a") as f:
json.dump(log_entry, f)
f.write("\n")
def __del__(self):
if self.ph:
self.ph.shutdown()

View File

@@ -25,6 +25,7 @@ def get_parser(default_config_files, git_root):
description="aider is AI pair programming in your terminal",
add_config_file_help=True,
default_config_files=default_config_files,
config_file_parser_class=configargparse.YAMLConfigFileParser,
auto_env_var_prefix="AIDER_",
)
group = parser.add_argument_group("Main")
@@ -57,7 +58,7 @@ def get_parser(default_config_files, git_root):
const=opus_model,
help=f"Use {opus_model} model for the main chat",
)
sonnet_model = "claude-3-5-sonnet-20240620"
sonnet_model = "claude-3-5-sonnet-20241022"
group.add_argument(
"--sonnet",
action="store_const",
@@ -65,6 +66,14 @@ def get_parser(default_config_files, git_root):
const=sonnet_model,
help=f"Use {sonnet_model} model for the main chat",
)
haiku_model = "claude-3-5-haiku-20241022"
group.add_argument(
"--haiku",
action="store_const",
dest="model",
const=haiku_model,
help=f"Use {haiku_model} model for the main chat",
)
gpt_4_model = "gpt-4-0613"
group.add_argument(
"--4",
@@ -117,6 +126,22 @@ def get_parser(default_config_files, git_root):
const=deepseek_model,
help=f"Use {deepseek_model} model for the main chat",
)
o1_mini_model = "o1-mini"
group.add_argument(
"--o1-mini",
action="store_const",
dest="model",
const=o1_mini_model,
help=f"Use {o1_mini_model} model for the main chat",
)
o1_preview_model = "o1-preview"
group.add_argument(
"--o1-preview",
action="store_const",
dest="model",
const=o1_preview_model,
help=f"Use {o1_preview_model} model for the main chat",
)
##########
group = parser.add_argument_group("Model Settings")
@@ -181,6 +206,13 @@ def get_parser(default_config_files, git_root):
default=None,
help="Specify what edit format the LLM should use (default depends on model)",
)
group.add_argument(
"--architect",
action="store_const",
dest="edit_format",
const="architect",
help="Use architect edit format for the main chat",
)
group.add_argument(
"--weak-model",
metavar="WEAK_MODEL",
@@ -190,6 +222,18 @@ def get_parser(default_config_files, git_root):
" depends on --model)"
),
)
group.add_argument(
"--editor-model",
metavar="EDITOR_MODEL",
default=None,
help="Specify the model to use for editor tasks (default depends on --model)",
)
group.add_argument(
"--editor-edit-format",
metavar="EDITOR_EDIT_FORMAT",
default=None,
help="Specify the edit format for the editor model (default: depends on editor model)",
)
group.add_argument(
"--show-model-warnings",
action=argparse.BooleanOptionalAction,
@@ -197,17 +241,25 @@ def get_parser(default_config_files, git_root):
help="Only work with models that have meta-data available (default: True)",
)
group.add_argument(
"--map-tokens",
"--max-chat-history-tokens",
type=int,
default=None,
help="Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)",
help=(
"Soft limit on tokens for chat history, after which summarization begins."
" If unspecified, defaults to the model's max_chat_history_tokens."
),
)
# This is a duplicate of the argument in the preparser and is a no-op by this time of
# argument parsing, but it's here so that the help is displayed as expected.
group.add_argument(
"--map-refresh",
choices=["auto", "always", "files", "manual"],
default="auto",
help="Control how often the repo map is refreshed (default: auto)",
"--env-file",
metavar="ENV_FILE",
default=default_env_file(git_root),
help="Specify the .env file to load (default: .env in git root)",
)
##########
group = parser.add_argument_group("Cache Settings")
group.add_argument(
"--cache-prompts",
action=argparse.BooleanOptionalAction,
@@ -220,29 +272,30 @@ def get_parser(default_config_files, git_root):
default=0,
help="Number of times to ping at 5min intervals to keep prompt cache warm (default: 0)",
)
##########
group = parser.add_argument_group("Repomap Settings")
group.add_argument(
"--map-tokens",
type=int,
default=None,
help="Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)",
)
group.add_argument(
"--map-refresh",
choices=["auto", "always", "files", "manual"],
default="auto",
help=(
"Control how often the repo map is refreshed. Options: auto, always, files, manual"
" (default: auto)"
),
)
group.add_argument(
"--map-multiplier-no-files",
type=float,
default=2,
help="Multiplier for map tokens when no files are specified (default: 2)",
)
group.add_argument(
"--max-chat-history-tokens",
type=int,
default=None,
help=(
"Maximum number of tokens to use for chat history. If not specified, uses the model's"
" max_chat_history_tokens."
),
)
# This is a duplicate of the argument in the preparser and is a no-op by this time of
# argument parsing, but it's here so that the help is displayed as expected.
group.add_argument(
"--env-file",
metavar="ENV_FILE",
default=default_env_file(git_root),
help="Specify the .env file to load (default: .env in git root)",
)
##########
group = parser.add_argument_group("History Files")
@@ -328,6 +381,39 @@ def get_parser(default_config_files, git_root):
default="#0088ff",
help="Set the color for assistant output (default: #0088ff)",
)
group.add_argument(
"--completion-menu-color",
metavar="COLOR",
default=None,
help="Set the color for the completion menu (default: terminal's default text color)",
)
group.add_argument(
"--completion-menu-bg-color",
metavar="COLOR",
default=None,
help=(
"Set the background color for the completion menu (default: terminal's default"
" background color)"
),
)
group.add_argument(
"--completion-menu-current-color",
metavar="COLOR",
default=None,
help=(
"Set the color for the current item in the completion menu (default: terminal's default"
" background color)"
),
)
group.add_argument(
"--completion-menu-current-bg-color",
metavar="COLOR",
default=None,
help=(
"Set the background color for the current item in the completion menu (default:"
" terminal's default text color)"
),
)
group.add_argument(
"--code-theme",
default="default",
@@ -425,6 +511,12 @@ def get_parser(default_config_files, git_root):
default=False,
help="Perform a dry run without modifying files (default: False)",
)
group.add_argument(
"--skip-sanity-check-repo",
action="store_true",
help="Skip the sanity check for the git repository (default: False)",
default=False,
)
group = parser.add_argument_group("Fixing and committing")
group.add_argument(
"--lint",
@@ -466,6 +558,25 @@ def get_parser(default_config_files, git_root):
)
##########
group = parser.add_argument_group("Analytics")
group.add_argument(
"--analytics",
action=argparse.BooleanOptionalAction,
default=False,
help="Enable/disable analytics for one session (default: False)",
)
group.add_argument(
"--analytics-log",
metavar="ANALYTICS_LOG_FILE",
help="Specify a file to log analytics events",
)
group.add_argument(
"--analytics-disable",
action="store_true",
help="Permanently disable analytics",
default=False,
)
group = parser.add_argument_group("Other Settings")
group.add_argument(
"--file",
@@ -485,12 +596,6 @@ def get_parser(default_config_files, git_root):
help="Use VI editing mode in the terminal (default: False)",
default=False,
)
group.add_argument(
"--voice-language",
metavar="VOICE_LANGUAGE",
default="en",
help="Specify the language for voice using ISO 639-1 code (default: auto)",
)
group.add_argument(
"--chat-language",
metavar="CHAT_LANGUAGE",
@@ -534,7 +639,13 @@ def get_parser(default_config_files, git_root):
help="Apply the changes from the given file instead of running the chat (debug)",
)
group.add_argument(
"--yes",
"--apply-clipboard-edits",
action="store_true",
help="Apply clipboard contents as edits using the main model's editor format",
default=False,
)
group.add_argument(
"--yes-always",
action="store_true",
help="Always say yes to every confirmation",
default=None,
@@ -582,6 +693,11 @@ def get_parser(default_config_files, git_root):
" (disables chat mode)"
),
)
group.add_argument(
"--load",
metavar="LOAD_FILE",
help="Load and execute /commands from a file on launch",
)
group.add_argument(
"--encoding",
default="utf-8",
@@ -600,8 +716,8 @@ def get_parser(default_config_files, git_root):
group.add_argument(
"--gui",
"--browser",
action="store_true",
help="Run aider in your browser",
action=argparse.BooleanOptionalAction,
help="Run aider in your browser (default: False)",
default=False,
)
group.add_argument(
@@ -610,6 +726,28 @@ def get_parser(default_config_files, git_root):
default=True,
help="Enable/disable suggesting shell commands (default: True)",
)
group.add_argument(
"--fancy-input",
action=argparse.BooleanOptionalAction,
default=True,
help="Enable/disable fancy input with history and completion (default: True)",
)
##########
group = parser.add_argument_group("Voice Settings")
group.add_argument(
"--voice-format",
metavar="VOICE_FORMAT",
default="wav",
choices=["wav", "mp3", "webm"],
help="Audio format for voice recording (default: wav). webm and mp3 require ffmpeg",
)
group.add_argument(
"--voice-language",
metavar="VOICE_LANGUAGE",
default="en",
help="Specify the language for voice using ISO 639-1 code (default: auto)",
)
return parser
@@ -625,7 +763,6 @@ def get_md_help():
parser.formatter_class = MarkdownHelpFormatter
return argparse.ArgumentParser.format_help(parser)
return parser.format_help()
def get_sample_yaml():
@@ -639,7 +776,6 @@ def get_sample_yaml():
parser.formatter_class = YamlHelpFormatter
return argparse.ArgumentParser.format_help(parser)
return parser.format_help()
def get_sample_dotenv():
@@ -653,7 +789,6 @@ def get_sample_dotenv():
parser.formatter_class = DotEnvFormatter
return argparse.ArgumentParser.format_help(parser)
return parser.format_help()
def main():

View File

@@ -147,7 +147,10 @@ class YamlHelpFormatter(argparse.HelpFormatter):
elif action.nargs in ("*", "+") or isinstance(action, argparse._AppendAction):
parts.append(f"#{switch}: xxx")
parts.append("## Specify multiple values like this:")
parts.append(f"#{switch}: [xxx,yyyy,zzz]\n")
parts.append(f"#{switch}:")
parts.append(f"# - xxx")
parts.append(f"# - yyy")
parts.append(f"# - zzz")
else:
parts.append(f"#{switch}: xxx\n")

View File

@@ -1,13 +1,16 @@
from .architect_coder import ArchitectCoder
from .ask_coder import AskCoder
from .base_coder import Coder
from .editblock_coder import EditBlockCoder
from .editblock_fenced_coder import EditBlockFencedCoder
from .editor_editblock_coder import EditorEditBlockCoder
from .editor_whole_coder import EditorWholeFileCoder
from .help_coder import HelpCoder
# from .single_wholefile_func_coder import SingleWholeFileFunctionCoder
from .udiff_coder import UnifiedDiffCoder
from .wholefile_coder import WholeFileCoder
# from .single_wholefile_func_coder import SingleWholeFileFunctionCoder
__all__ = [
HelpCoder,
AskCoder,
@@ -17,4 +20,7 @@ __all__ = [
WholeFileCoder,
UnifiedDiffCoder,
# SingleWholeFileFunctionCoder,
ArchitectCoder,
EditorEditBlockCoder,
EditorWholeFileCoder,
]

View File

@@ -0,0 +1,47 @@
from .architect_prompts import ArchitectPrompts
from .ask_coder import AskCoder
from .base_coder import Coder
class ArchitectCoder(AskCoder):
edit_format = "architect"
gpt_prompts = ArchitectPrompts()
def reply_completed(self):
content = self.partial_response_content
if not content or not content.strip():
return
if not self.io.confirm_ask("Edit the files?"):
return
kwargs = dict()
# Use the editor_model from the main_model if it exists, otherwise use the main_model itself
editor_model = self.main_model.editor_model or self.main_model
kwargs["main_model"] = editor_model
kwargs["edit_format"] = self.main_model.editor_edit_format
kwargs["suggest_shell_commands"] = False
kwargs["map_tokens"] = 0
kwargs["total_cost"] = self.total_cost
kwargs["cache_prompts"] = False
kwargs["num_cache_warming_pings"] = 0
kwargs["summarize_from_coder"] = False
new_kwargs = dict(io=self.io, from_coder=self)
new_kwargs.update(kwargs)
editor_coder = Coder.create(**new_kwargs)
editor_coder.cur_messages = []
editor_coder.done_messages = []
if self.verbose:
editor_coder.show_announcements()
editor_coder.run(with_message=content, preproc=False)
self.move_back_cur_messages("I made those changes to the files.")
self.total_cost = editor_coder.total_cost
self.aider_commit_hashes = editor_coder.aider_commit_hashes

View File

@@ -0,0 +1,40 @@
# flake8: noqa: E501
from .base_prompts import CoderPrompts
class ArchitectPrompts(CoderPrompts):
main_system = """Act as an expert architect engineer and provide direction to your editor engineer.
Study the change request and the current code.
Describe how to modify the code to complete the request.
The editor engineer will rely solely on your instructions, so make them unambiguous and complete.
Explain all needed code changes clearly and completely, but concisely.
Just show the changes needed.
DO NOT show the entire updated function/file/etc!
Always reply to the user in {language}.
"""
example_messages = []
files_content_prefix = """I have *added these files to the chat* so you see all of their contents.
*Trust this message as the true contents of the files!*
Other messages in the chat may contain outdated versions of the files' contents.
""" # noqa: E501
files_content_assistant_reply = (
"Ok, I will use that as the true, current contents of the files."
)
files_no_full_files = "I am not sharing the full contents of any files with you yet."
files_no_full_files_with_repo_map = ""
files_no_full_files_with_repo_map_reply = ""
repo_content_prefix = """I am working with you on code in a git repository.
Here are summaries of some files present in my git repo.
If you need to see the full contents of any files to answer my questions, ask me to *add them to the chat*.
"""
system_reminder = ""

View File

@@ -6,8 +6,7 @@ from .base_prompts import CoderPrompts
class AskPrompts(CoderPrompts):
main_system = """Act as an expert code analyst.
Answer questions about the supplied code.
Always reply to the user in the same language they are using.
Always reply to the user in {language}.
"""
example_messages = []
@@ -17,6 +16,10 @@ Always reply to the user in the same language they are using.
Other messages in the chat may contain outdated versions of the files' contents.
""" # noqa: E501
files_content_assistant_reply = (
"Ok, I will use that as the true, current contents of the files."
)
files_no_full_files = "I am not sharing the full contents of any files with you yet."
files_no_full_files_with_repo_map = ""

View File

@@ -17,9 +17,12 @@ from collections import defaultdict
from datetime import datetime
from json.decoder import JSONDecodeError
from pathlib import Path
from typing import List
from aider import __version__, models, prompts, urls, utils
from aider.analytics import Analytics
from aider.commands import Commands
from aider.exceptions import LiteLLMExceptions
from aider.history import ChatSummary
from aider.io import ConfirmGroup, InputOutput
from aider.linter import Linter
@@ -27,7 +30,7 @@ from aider.llm import litellm
from aider.repo import ANY_GIT_ERROR, GitRepo
from aider.repomap import RepoMap
from aider.run_cmd import run_cmd
from aider.sendchat import retry_exceptions, send_completion
from aider.sendchat import RETRY_TIMEOUT, send_completion
from aider.utils import format_content, format_messages, format_tokens, is_image_file
from ..dump import dump # noqa: F401
@@ -180,6 +183,13 @@ class Coder:
output += ", infinite output"
lines.append(output)
if self.edit_format == "architect":
output = (
f"Editor model: {main_model.editor_model.name} with"
f" {main_model.editor_edit_format} edit format"
)
lines.append(output)
if weak_model is not main_model:
output = f"Weak model: {weak_model.name}"
lines.append(output)
@@ -251,12 +261,17 @@ class Coder:
commands=None,
summarizer=None,
total_cost=0.0,
analytics=None,
map_refresh="auto",
cache_prompts=False,
num_cache_warming_pings=0,
suggest_shell_commands=True,
chat_language=None,
):
# Fill in a dummy Analytics if needed, but it is never .enable()'d
self.analytics = analytics if analytics is not None else Analytics()
self.event = self.analytics.event
self.chat_language = chat_language
self.commit_before_message = []
self.aider_commit_hashes = set()
@@ -340,6 +355,9 @@ class Coder:
for fname in fnames:
fname = Path(fname)
if self.repo and self.repo.git_ignored_file(fname):
self.io.tool_warning(f"Skipping {fname} that matches gitignore spec.")
if self.repo and self.repo.ignored_file(fname):
self.io.tool_warning(f"Skipping {fname} that matches aiderignore spec.")
continue
@@ -648,7 +666,7 @@ class Coder:
if self.abs_fnames:
files_content = self.gpt_prompts.files_content_prefix
files_content += self.get_files_content()
files_reply = "Ok, any changes I propose will be to those files."
files_reply = self.gpt_prompts.files_content_assistant_reply
elif self.get_repo_map() and self.gpt_prompts.files_no_full_files_with_repo_map:
files_content = self.gpt_prompts.files_no_full_files_with_repo_map
files_reply = self.gpt_prompts.files_no_full_files_with_repo_map_reply
@@ -672,7 +690,7 @@ class Coder:
return chat_files_messages
def get_images_message(self):
if not self.main_model.accepts_images:
if not self.main_model.info.get("supports_vision"):
return None
image_messages = []
@@ -775,16 +793,37 @@ class Coder:
self.num_reflections += 1
message = self.reflected_message
def check_for_urls(self, inp):
def check_and_open_urls(self, exc, friendly_msg=None):
"""Check exception for URLs, offer to open in a browser, with user-friendly error msgs."""
text = str(exc)
if friendly_msg:
self.io.tool_warning(text)
self.io.tool_error(f"{friendly_msg}")
else:
self.io.tool_error(text)
url_pattern = re.compile(r"(https?://[^\s/$.?#].[^\s]*)")
urls = list(set(url_pattern.findall(text))) # Use set to remove duplicates
for url in urls:
url = url.rstrip(".',\"")
self.io.offer_url(url)
return urls
def check_for_urls(self, inp: str) -> List[str]:
"""Check input for URLs and offer to add them to the chat."""
url_pattern = re.compile(r"(https?://[^\s/$.?#].[^\s]*[^\s,.])")
urls = list(set(url_pattern.findall(inp))) # Use set to remove duplicates
added_urls = []
group = ConfirmGroup(urls)
for url in urls:
if url not in self.rejected_urls:
if self.io.confirm_ask("Add URL to the chat?", subject=url, group=group):
url = url.rstrip(".',\"")
if self.io.confirm_ask(
"Add URL to the chat?", subject=url, group=group, allow_never=True
):
inp += "\n\n"
inp += self.commands.cmd_web(url)
inp += self.commands.cmd_web(url, return_content=True)
added_urls.append(url)
else:
self.rejected_urls.add(url)
@@ -920,12 +959,18 @@ class Coder:
platform=platform_text
)
if self.chat_language:
language = self.chat_language
else:
language = "in the same language they are using"
prompt = prompt.format(
fence=self.fence,
lazy_prompt=lazy_prompt,
platform=platform_text,
shell_cmd_prompt=shell_cmd_prompt,
shell_cmd_reminder=shell_cmd_reminder,
language=language,
)
return prompt
@@ -1064,13 +1109,15 @@ class Coder:
self.warming_pings_left -= 1
self.next_cache_warm = time.time() + delay
kwargs = dict(self.main_model.extra_params) or dict()
kwargs["max_tokens"] = 1
try:
completion = litellm.completion(
model=self.main_model.name,
messages=self.cache_warming_chunks.cacheable_messages(),
stream=False,
max_tokens=1,
extra_headers=self.main_model.extra_headers,
**kwargs,
)
except Exception as err:
self.io.tool_warning(f"Cache warming error: {str(err)}")
@@ -1102,10 +1149,15 @@ class Coder:
utils.show_messages(messages, functions=self.functions)
self.multi_response_content = ""
self.mdstream = self.io.assistant_output("", self.stream)
if self.show_pretty() and self.stream:
self.mdstream = self.io.get_assistant_mdstream()
else:
self.mdstream = None
retry_delay = 0.125
litellm_ex = LiteLLMExceptions()
self.usage_report = None
exhausted = False
interrupted = False
@@ -1114,24 +1166,37 @@ class Coder:
try:
yield from self.send(messages, functions=self.functions)
break
except retry_exceptions() as err:
self.io.tool_warning(str(err))
retry_delay *= 2
if retry_delay > 60:
except litellm_ex.exceptions_tuple() as err:
ex_info = litellm_ex.get_ex_info(err)
if ex_info.name == "ContextWindowExceededError":
exhausted = True
break
should_retry = ex_info.retry
if should_retry:
retry_delay *= 2
if retry_delay > RETRY_TIMEOUT:
should_retry = False
if not should_retry:
self.mdstream = None
self.check_and_open_urls(err, ex_info.description)
break
err_msg = str(err)
if ex_info.description:
self.io.tool_warning(err_msg)
self.io.tool_error(ex_info.description)
else:
self.io.tool_error(err_msg)
self.io.tool_output(f"Retrying in {retry_delay:.1f} seconds...")
time.sleep(retry_delay)
continue
except KeyboardInterrupt:
interrupted = True
break
except litellm.ContextWindowExceededError:
# The input is overflowing the context window!
exhausted = True
break
except litellm.exceptions.BadRequestError as br_err:
self.io.tool_error(f"BadRequestError: {br_err}")
return
except FinishReasonLength:
# We hit the output limit!
if not self.main_model.info.get("supports_assistant_prefill"):
@@ -1147,9 +1212,10 @@ class Coder:
dict(role="assistant", content=self.multi_response_content, prefix=True)
)
except Exception as err:
self.io.tool_error(f"Unexpected error: {err}")
self.mdstream = None
lines = traceback.format_exception(type(err), err, err.__traceback__)
self.io.tool_error("".join(lines))
self.io.tool_warning("".join(lines))
self.io.tool_error(str(err))
return
finally:
if self.mdstream:
@@ -1179,6 +1245,11 @@ class Coder:
else:
content = ""
try:
self.reply_completed()
except KeyboardInterrupt:
interrupted = True
if interrupted:
content += "\n^C KeyboardInterrupt"
self.cur_messages += [dict(role="assistant", content=content)]
@@ -1235,6 +1306,9 @@ class Coder:
else:
self.reflected_message = add_rel_files_message
def reply_completed(self):
pass
def show_exhausted_error(self):
output_tokens = 0
if self.partial_response_content:
@@ -1286,11 +1360,9 @@ class Coder:
res.append("- Use /clear to clear the chat history.")
res.append("- Break your code into smaller source files.")
res.append("")
res.append(f"For more info: {urls.token_limits}")
res = "".join([line + "\n" for line in res])
self.io.tool_error(res)
self.io.offer_url(urls.token_limits)
def lint_edited(self, fnames):
res = ""
@@ -1364,7 +1436,7 @@ class Coder:
added_fnames = []
group = ConfirmGroup(new_mentions)
for rel_fname in sorted(new_mentions):
if self.io.confirm_ask(f"Add {rel_fname} to the chat?", group=group):
if self.io.confirm_ask(f"Add {rel_fname} to the chat?", group=group, allow_never=True):
self.add_rel_fname(rel_fname)
added_fnames.append(rel_fname)
else:
@@ -1395,8 +1467,7 @@ class Coder:
functions,
self.stream,
temp,
extra_headers=model.extra_headers,
max_tokens=model.max_tokens,
extra_params=model.extra_params,
)
self.chat_completion_call_hashes.append(hash_object.hexdigest())
@@ -1459,7 +1530,7 @@ class Coder:
raise Exception("No data found in LLM response!")
show_resp = self.render_incremental_response(True)
self.io.assistant_output(show_resp)
self.io.assistant_output(show_resp, pretty=self.show_pretty())
if (
hasattr(completion.choices[0], "finish_reason")
@@ -1535,7 +1606,6 @@ class Coder:
completion.usage, "cache_creation_input_tokens"
):
self.message_tokens_sent += prompt_tokens
self.message_tokens_sent += cache_hit_tokens
self.message_tokens_sent += cache_write_tokens
else:
self.message_tokens_sent += prompt_tokens
@@ -1617,11 +1687,27 @@ class Coder:
self.usage_report = tokens_report + sep + cost_report
def show_usage_report(self):
if self.usage_report:
self.io.tool_output(self.usage_report)
self.message_cost = 0.0
self.message_tokens_sent = 0
self.message_tokens_received = 0
if not self.usage_report:
return
self.io.tool_output(self.usage_report)
prompt_tokens = self.message_tokens_sent
completion_tokens = self.message_tokens_received
self.event(
"message_send",
main_model=self.main_model,
edit_format=self.edit_format,
prompt_tokens=prompt_tokens,
completion_tokens=completion_tokens,
total_tokens=prompt_tokens + completion_tokens,
cost=self.message_cost,
total_cost=self.total_cost,
)
self.message_cost = 0.0
self.message_tokens_sent = 0
self.message_tokens_received = 0
def get_multi_response_content(self, final=False):
cur = self.multi_response_content or ""
@@ -1696,6 +1782,10 @@ class Coder:
self.check_for_dirty_commit(path)
return True
if self.repo and self.repo.git_ignored_file(path):
self.io.tool_warning(f"Skipping edits to {path} that matches gitignore spec.")
return
if not Path(full_path).exists():
if not self.io.confirm_ask("Create new file?", subject=path):
self.io.tool_output(f"Skipping edits to {path}")
@@ -1790,8 +1880,10 @@ class Coder:
edited = set()
try:
edits = self.get_edits()
edits = self.apply_edits_dry_run(edits)
edits = self.prepare_to_edit(edits)
edited = set(edit[0] for edit in edits)
self.apply_edits(edits)
except ValueError as err:
self.num_malformed_responses += 1
@@ -1919,6 +2011,9 @@ class Coder:
def apply_edits(self, edits):
return
def apply_edits_dry_run(self, edits):
return edits
def run_shell_commands(self):
if not self.suggest_shell_commands:
return ""
@@ -1942,7 +2037,11 @@ class Coder:
)
prompt = "Run shell command?" if command_count == 1 else "Run shell commands?"
if not self.io.confirm_ask(
prompt, subject="\n".join(commands), explicit_yes_required=True, group=group
prompt,
subject="\n".join(commands),
explicit_yes_required=True,
group=group,
allow_never=True,
):
return
@@ -1961,7 +2060,7 @@ class Coder:
accumulated_output += f"Output from {command}\n{output}\n"
if accumulated_output.strip() and not self.io.confirm_ask(
"Add command output to the chat?"
"Add command output to the chat?", allow_never=True
):
accumulated_output = ""

View File

@@ -22,6 +22,8 @@ You always COMPLETELY IMPLEMENT the needed code!
Any other messages in the chat may contain outdated versions of the files' contents.
""" # noqa: E501
files_content_assistant_reply = "Ok, any changes I propose will be to those files."
files_no_full_files = "I am not sharing any files that you can edit yet."
files_no_full_files_with_repo_map = """Don't try and edit any existing code without asking me to add the files to the chat!

View File

@@ -35,29 +35,47 @@ class EditBlockCoder(Coder):
return edits
def apply_edits(self, edits):
def apply_edits_dry_run(self, edits):
return self.apply_edits(edits, dry_run=True)
def apply_edits(self, edits, dry_run=False):
failed = []
passed = []
updated_edits = []
for edit in edits:
path, original, updated = edit
full_path = self.abs_root_path(path)
content = self.io.read_text(full_path)
new_content = do_replace(full_path, content, original, updated, self.fence)
if not new_content:
new_content = None
if Path(full_path).exists():
content = self.io.read_text(full_path)
new_content = do_replace(full_path, content, original, updated, self.fence)
# If the edit failed, and
# this is not a "create a new file" with an empty original...
# https://github.com/Aider-AI/aider/issues/2258
if not new_content and original.strip():
# try patching any of the other files in the chat
for full_path in self.abs_fnames:
content = self.io.read_text(full_path)
new_content = do_replace(full_path, content, original, updated, self.fence)
if new_content:
path = self.get_rel_fname(full_path)
break
updated_edits.append((path, original, updated))
if new_content:
self.io.write_text(full_path, new_content)
if not dry_run:
self.io.write_text(full_path, new_content)
passed.append(edit)
else:
failed.append(edit)
if dry_run:
return updated_edits
if not failed:
return
@@ -365,9 +383,9 @@ def do_replace(fname, content, before_text, after_text, fence=None):
return new_content
HEAD = r"<{5,9} SEARCH"
DIVIDER = r"={5,9}"
UPDATED = r">{5,9} REPLACE"
HEAD = r"^<{5,9} SEARCH\s*$"
DIVIDER = r"^={5,9}\s*$"
UPDATED = r"^>{5,9} REPLACE\s*$"
HEAD_ERR = "<<<<<<< SEARCH"
DIVIDER_ERR = "======="
@@ -400,7 +418,7 @@ def strip_filename(filename, fence):
filename = filename.strip("`")
filename = filename.strip("*")
# https://github.com/paul-gauthier/aider/issues/1158
# https://github.com/Aider-AI/aider/issues/1158
# filename = filename.replace("\\_", "_")
return filename

View File

@@ -11,7 +11,7 @@ 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 the same language they are using.
Always reply to the user in {language}.
Once you understand the request you MUST:
@@ -34,7 +34,7 @@ ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!
4. *Concisely* suggest any shell commands the user might want to run in ```bash blocks.
Just suggest shell commands this way, not example code.
Only suggest complete shell commands that area ready to execute, without placeholders.
Only suggest complete shell commands that are ready to execute, without placeholders.
Only suggest at most a few shell commands at a time, not more than 1-3.
Use the appropriate shell based on the user's system info:
@@ -159,8 +159,9 @@ Use the *FULL* file path, as shown to you by the user.
Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.
If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.
*SEARCH/REPLACE* blocks will replace *all* matching occurrences.
Include enough lines to make the SEARCH blocks uniquely match the lines to change.
*SEARCH/REPLACE* blocks will *only* replace the first match occurrence.
Including multiple unique *SEARCH/REPLACE* blocks if needed.
Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.
Keep *SEARCH/REPLACE* blocks concise.
Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.

View File

@@ -0,0 +1,7 @@
from .editblock_coder import EditBlockCoder
from .editor_editblock_prompts import EditorEditBlockPrompts
class EditorEditBlockCoder(EditBlockCoder):
edit_format = "editor-diff"
gpt_prompts = EditorEditBlockPrompts()

View File

@@ -0,0 +1,16 @@
# flake8: noqa: E501
from .editblock_prompts import EditBlockPrompts
class EditorEditBlockPrompts(EditBlockPrompts):
main_system = """Act as an expert software developer who edits source code.
{lazy_prompt}
Describe each change with a *SEARCH/REPLACE block* per the examples below.
All changes to files must use this *SEARCH/REPLACE block* format.
ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!
"""
shell_cmd_prompt = ""
no_shell_cmd_prompt = ""
shell_cmd_reminder = ""

View File

@@ -0,0 +1,7 @@
from .editor_whole_prompts import EditorWholeFilePrompts
from .wholefile_coder import WholeFileCoder
class EditorWholeFileCoder(WholeFileCoder):
edit_format = "editor-whole"
gpt_prompts = EditorWholeFilePrompts()

View File

@@ -0,0 +1,10 @@
# flake8: noqa: E501
from .wholefile_prompts import WholeFilePrompts
class EditorWholeFilePrompts(WholeFilePrompts):
main_system = """Act as an expert software developer and make changes to source code.
{lazy_prompt}
Output a copy of each file that needs changes.
"""

View File

@@ -12,7 +12,7 @@ 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 the same language they are using.
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

@@ -58,6 +58,8 @@ class WholeFileCoder(Coder):
fname = fname.strip("*") # handle **filename.py**
fname = fname.rstrip(":")
fname = fname.strip("`")
fname = fname.lstrip("#")
fname = fname.strip()
# Issue #1232
if len(fname) > 250:

View File

@@ -8,7 +8,7 @@ class WholeFilePrompts(CoderPrompts):
Take requests for changes to the supplied code.
If the request is ambiguous, ask questions.
Always reply to the user in the same language they are using.
Always reply to the user in {language}.
{lazy_prompt}
Once you understand the request you MUST:
@@ -52,7 +52,7 @@ path/to/filename.js
{fence[1]}
Every *file listing* MUST use this format:
- First line: the filename with any originally provided path
- First line: the filename with any originally provided path; no extra markup, punctuation, comments, etc. **JUST** the filename with path.
- Second line: opening {fence[0]}
- ... entire content of the file ...
- Final line: closing {fence[1]}

View File

@@ -1,13 +1,17 @@
import glob
import os
import re
import subprocess
import sys
import tempfile
from collections import OrderedDict
from os.path import expanduser
from pathlib import Path
import pyperclip
from PIL import Image, ImageGrab
from prompt_toolkit.completion import Completion, PathCompleter
from prompt_toolkit.document import Document
from aider import models, prompts, voice
from aider.format_settings import format_settings
@@ -135,7 +139,7 @@ class Commands:
else:
self.io.tool_output("Please provide a partial model name to search for.")
def cmd_web(self, args):
def cmd_web(self, args, return_content=False):
"Scrape a webpage, convert to markdown and send in a message"
url = args.strip()
@@ -154,15 +158,28 @@ class Commands:
)
content = self.scraper.scrape(url) or ""
content = f"{url}:\n\n" + content
content = f"Here is the content of {url}:\n\n" + content
if return_content:
return content
self.io.tool_output("... done.")
self.io.tool_output("... added to chat.")
return content
self.coder.cur_messages += [
dict(role="user", content=content),
dict(role="assistant", content="Ok."),
]
def is_command(self, inp):
return inp[0] in "/!"
def get_raw_completions(self, cmd):
assert cmd.startswith("/")
cmd = cmd[1:]
cmd = cmd.replace("-", "_")
raw_completer = getattr(self, f"completions_raw_{cmd}", None)
return raw_completer
def get_completions(self, cmd):
assert cmd.startswith("/")
cmd = cmd[1:]
@@ -211,6 +228,7 @@ class Commands:
def run(self, inp):
if inp.startswith("!"):
self.coder.event("command_run")
return self.do_run("run", inp[1:])
res = self.matching_commands(inp)
@@ -218,9 +236,13 @@ class Commands:
return
matching_commands, first_word, rest_inp = res
if len(matching_commands) == 1:
return self.do_run(matching_commands[0][1:], rest_inp)
command = matching_commands[0][1:]
self.coder.event(f"command_{command}")
return self.do_run(command, rest_inp)
elif first_word in matching_commands:
return self.do_run(first_word[1:], rest_inp)
command = first_word[1:]
self.coder.event(f"command_{command}")
return self.do_run(command, rest_inp)
elif len(matching_commands) > 1:
self.io.tool_error(f"Ambiguous command: {', '.join(matching_commands)}")
else:
@@ -569,8 +591,62 @@ class Commands:
fname = f'"{fname}"'
return fname
def completions_read_only(self):
return self.completions_add()
def completions_raw_read_only(self, document, complete_event):
# Get the text before the cursor
text = document.text_before_cursor
# Skip the first word and the space after it
after_command = text.split()[-1]
# Create a new Document object with the text after the command
new_document = Document(after_command, cursor_position=len(after_command))
def get_paths():
return [self.coder.root] if self.coder.root else None
path_completer = PathCompleter(
get_paths=get_paths,
only_directories=False,
expanduser=True,
)
# Adjust the start_position to replace all of 'after_command'
adjusted_start_position = -len(after_command)
# Collect all completions
all_completions = []
# Iterate over the completions and modify them
for completion in path_completer.get_completions(new_document, complete_event):
quoted_text = self.quote_fname(after_command + completion.text)
all_completions.append(
Completion(
text=quoted_text,
start_position=adjusted_start_position,
display=completion.display,
style=completion.style,
selected_style=completion.selected_style,
)
)
# Add completions from the 'add' command
add_completions = self.completions_add()
for completion in add_completions:
if after_command in completion:
all_completions.append(
Completion(
text=completion,
start_position=adjusted_start_position,
display=completion,
)
)
# Sort all completions based on their text
sorted_completions = sorted(all_completions, key=lambda c: c.text)
# Yield the sorted completions
for completion in sorted_completions:
yield completion
def completions_add(self):
files = set(self.coder.get_all_relative_files())
@@ -588,7 +664,7 @@ class Commands:
else:
try:
raw_matched_files = list(Path(self.coder.root).glob(pattern))
except IndexError:
except (IndexError, AttributeError):
raw_matched_files = []
except ValueError as err:
self.io.tool_error(f"Error matching {pattern}: {err}")
@@ -658,7 +734,7 @@ class Commands:
except OSError as e:
self.io.tool_error(f"Error creating file {fname}: {e}")
for matched_file in all_matched_files:
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):
@@ -667,8 +743,13 @@ class Commands:
)
continue
if self.coder.repo and self.coder.repo.git_ignored_file(matched_file):
self.io.tool_error(f"Can't add {matched_file} which is in gitignore")
continue
if abs_file_path in self.coder.abs_fnames:
self.io.tool_warning(f"{matched_file} is already in the chat")
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):
self.coder.abs_read_only_fnames.remove(abs_file_path)
@@ -681,7 +762,9 @@ class Commands:
f"Cannot add {matched_file} as it's not part of the repository"
)
else:
if is_image_file(matched_file) and not self.coder.main_model.accepts_images:
if is_image_file(matched_file) and not self.coder.main_model.info.get(
"supports_vision"
):
self.io.tool_error(
f"Cannot add image file {matched_file} as the"
f" {self.coder.main_model.name} does not support images."
@@ -735,7 +818,7 @@ class Commands:
self.io.tool_output(f"Removed {matched_file} from the chat")
def cmd_git(self, args):
"Run a git command"
"Run a git command (output excluded from chat)"
combined_output = None
try:
args = "git " + args
@@ -894,6 +977,7 @@ class Commands:
self.basic_help()
return
self.coder.event("interactive help")
from aider.coders import Coder
if not self.help:
@@ -945,6 +1029,10 @@ class Commands:
"Ask for changes to your code"
return self._generic_chat_command(args, self.coder.main_model.edit_format)
def cmd_architect(self, args):
"Enter architect mode to discuss high-level design and architecture"
return self._generic_chat_command(args, "architect")
def _generic_chat_command(self, args, edit_format):
if not args.strip():
self.io.tool_error(f"Please provide a question or topic for the {edit_format} chat.")
@@ -997,7 +1085,7 @@ class Commands:
self.io.tool_error("To use /voice you must provide an OpenAI API key.")
return
try:
self.voice = voice.Voice()
self.voice = voice.Voice(audio_format=self.args.voice_format)
except voice.SoundDeviceError:
self.io.tool_error(
"Unable to import `sounddevice` and/or `soundfile`, is portaudio installed?"
@@ -1035,8 +1123,9 @@ class Commands:
return text
def cmd_clipboard(self, args):
"Add image/text from the clipboard to the chat (optionally provide a name for the image)"
def cmd_paste(self, args):
"""Paste image/text from the clipboard into the chat.\
Optionally provide a name for the image."""
try:
# Check for image first
image = ImageGrab.grabclipboard()
@@ -1091,27 +1180,50 @@ class Commands:
return
filenames = parse_quoted_filenames(args)
for word in filenames:
# Expand the home directory if the path starts with "~"
expanded_path = os.path.expanduser(word)
abs_path = self.coder.abs_root_path(expanded_path)
all_paths = []
if not os.path.exists(abs_path):
self.io.tool_error(f"Path not found: {abs_path}")
continue
# First collect all expanded paths
for pattern in filenames:
expanded_pattern = expanduser(pattern)
if os.path.isabs(expanded_pattern):
# For absolute paths, glob it
matches = list(glob.glob(expanded_pattern))
else:
# For relative paths and globs, use glob from the root directory
matches = list(Path(self.coder.root).glob(expanded_pattern))
if not matches:
self.io.tool_error(f"No matches found for: {pattern}")
else:
all_paths.extend(matches)
# Then process them in sorted order
for path in sorted(all_paths):
abs_path = self.coder.abs_root_path(path)
if os.path.isfile(abs_path):
self._add_read_only_file(abs_path, word)
self._add_read_only_file(abs_path, path)
elif os.path.isdir(abs_path):
self._add_read_only_directory(abs_path, word)
self._add_read_only_directory(abs_path, path)
else:
self.io.tool_error(f"Not a file or directory: {abs_path}")
def _add_read_only_file(self, abs_path, original_name):
if abs_path in self.coder.abs_fnames:
self.io.tool_error(f"{original_name} is already in the chat as an editable file")
elif abs_path in self.coder.abs_read_only_fnames:
if is_image_file(original_name) and not self.coder.main_model.info.get("supports_vision"):
self.io.tool_error(
f"Cannot add image file {original_name} as the"
f" {self.coder.main_model.name} does not support images."
)
return
if abs_path in self.coder.abs_read_only_fnames:
self.io.tool_error(f"{original_name} is already in the chat as a read-only file")
return
elif abs_path in self.coder.abs_fnames:
self.coder.abs_fnames.remove(abs_path)
self.coder.abs_read_only_fnames.add(abs_path)
self.io.tool_output(
f"Moved {original_name} from editable to read-only files in the chat"
)
else:
self.coder.abs_read_only_fnames.add(abs_path)
self.io.tool_output(f"Added {original_name} to read-only files.")
@@ -1152,7 +1264,93 @@ class Commands:
def cmd_settings(self, args):
"Print out the current settings"
settings = format_settings(self.parser, self.args)
self.io.tool_output(settings)
announcements = "\n".join(self.coder.get_announcements())
output = f"{announcements}\n{settings}"
self.io.tool_output(output)
def completions_raw_load(self, document, complete_event):
return self.completions_raw_read_only(document, complete_event)
def cmd_load(self, args):
"Load and execute commands from a file"
if not args.strip():
self.io.tool_error("Please provide a filename containing commands to load.")
return
try:
with open(args.strip(), "r", encoding=self.io.encoding, errors="replace") as f:
commands = f.readlines()
except FileNotFoundError:
self.io.tool_error(f"File not found: {args}")
return
except Exception as e:
self.io.tool_error(f"Error reading file: {e}")
return
for cmd in commands:
cmd = cmd.strip()
if not cmd or cmd.startswith("#"):
continue
self.io.tool_output(f"\nExecuting: {cmd}")
self.run(cmd)
def completions_raw_save(self, document, complete_event):
return self.completions_raw_read_only(document, complete_event)
def cmd_save(self, args):
"Save commands to a file that can reconstruct the current chat session's files"
if not args.strip():
self.io.tool_error("Please provide a filename to save the commands to.")
return
try:
with open(args.strip(), "w", encoding=self.io.encoding) as f:
f.write("/drop\n")
# Write commands to add editable files
for fname in sorted(self.coder.abs_fnames):
rel_fname = self.coder.get_rel_fname(fname)
f.write(f"/add {rel_fname}\n")
# Write commands to add read-only files
for fname in sorted(self.coder.abs_read_only_fnames):
# Use absolute path for files outside repo root, relative path for files inside
if Path(fname).is_relative_to(self.coder.root):
rel_fname = self.coder.get_rel_fname(fname)
f.write(f"/read-only {rel_fname}\n")
else:
f.write(f"/read-only {fname}\n")
self.io.tool_output(f"Saved commands to {args.strip()}")
except Exception as e:
self.io.tool_error(f"Error saving commands to file: {e}")
def cmd_copy(self, args):
"Copy the last assistant message to the clipboard"
all_messages = self.coder.done_messages + self.coder.cur_messages
assistant_messages = [msg for msg in reversed(all_messages) if msg["role"] == "assistant"]
if not assistant_messages:
self.io.tool_error("No assistant messages found to copy.")
return
last_assistant_message = assistant_messages[0]["content"]
try:
pyperclip.copy(last_assistant_message)
preview = (
last_assistant_message[:50] + "..."
if len(last_assistant_message) > 50
else last_assistant_message
)
self.io.tool_output(f"Copied last assistant message to clipboard. Preview: {preview}")
except pyperclip.PyperclipException as e:
self.io.tool_error(f"Failed to copy to clipboard: {str(e)}")
self.io.tool_output(
"You may need to install xclip or xsel on Linux, or pbcopy on macOS."
)
except Exception as e:
self.io.tool_error(f"An unexpected error occurred while copying to clipboard: {str(e)}")
def cmd_report(self, args):
"Report a problem by opening a GitHub Issue"

76
aider/exceptions.py Normal file
View File

@@ -0,0 +1,76 @@
from dataclasses import dataclass
@dataclass
class ExInfo:
name: str
retry: bool
description: str
EXCEPTIONS = [
ExInfo("APIConnectionError", True, None),
ExInfo("APIError", True, None),
ExInfo("APIResponseValidationError", True, None),
ExInfo(
"AuthenticationError",
False,
"The API provider is not able to authenticate you. Check your API key.",
),
ExInfo("AzureOpenAIError", True, None),
ExInfo("BadRequestError", False, None),
ExInfo("BudgetExceededError", True, None),
ExInfo(
"ContentPolicyViolationError",
True,
"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("InternalServerError", True, "The API provider's servers are down or overloaded."),
ExInfo("InvalidRequestError", True, None),
ExInfo("JSONSchemaValidationError", True, None),
ExInfo("NotFoundError", False, None),
ExInfo("OpenAIError", True, None),
ExInfo(
"RateLimitError",
True,
"The API provider has rate limited you. Try again later or check your quotas.",
),
ExInfo("RouterRateLimitError", True, None),
ExInfo("ServiceUnavailableError", True, "The API provider's servers are down or overloaded."),
ExInfo("UnprocessableEntityError", True, None),
ExInfo("UnsupportedParamsError", True, None),
]
class LiteLLMExceptions:
exceptions = dict()
def __init__(self):
self._load()
def _load(self, strict=False):
import litellm
for var in dir(litellm):
if not var.endswith("Error"):
continue
ex_info = None
for exi in EXCEPTIONS:
if var == exi.name:
ex_info = exi
break
if strict and not ex_info:
raise ValueError(f"{var} is in litellm but not in aider's exceptions list")
ex = getattr(litellm, var)
self.exceptions[ex] = ex_info
def exceptions_tuple(self):
return tuple(self.exceptions)
def get_ex_info(self, ex):
"""Return the ExInfo for a given exception instance"""
return self.exceptions.get(ex.__class__, ExInfo(None, None, None))

View File

@@ -160,7 +160,7 @@ class GUI:
st.warning(
"This browser version of aider is experimental. Please share feedback in [GitHub"
" issues](https://github.com/paul-gauthier/aider/issues)."
" issues](https://github.com/Aider-AI/aider/issues)."
)
def do_settings_tab(self):
@@ -528,7 +528,7 @@ def gui_main():
page_icon=urls.favicon,
menu_items={
"Get Help": urls.website,
"Report a bug": "https://github.com/paul-gauthier/aider/issues",
"Report a bug": "https://github.com/Aider-AI/aider/issues",
"About": "# Aider\nAI pair programming in your browser.",
},
)

View File

@@ -1,6 +1,8 @@
#!/usr/bin/env python
import json
import os
import shutil
import warnings
from pathlib import Path
@@ -38,24 +40,45 @@ def get_package_files():
def fname_to_url(filepath):
website = "website/"
index = "/index.md"
website = "website"
index = "index.md"
md = ".md"
docid = ""
if filepath.startswith("website/_includes/"):
pass
elif filepath.startswith(website):
docid = filepath[len(website) :]
# Convert backslashes to forward slashes for consistency
filepath = filepath.replace("\\", "/")
if filepath.endswith(index):
filepath = filepath[: -len(index)] + "/"
elif filepath.endswith(md):
filepath = filepath[: -len(md)] + ".html"
# Convert to Path object for easier manipulation
path = Path(filepath)
docid = "https://aider.chat/" + filepath
# Split the path into parts
parts = path.parts
return docid
# Find the 'website' part in the path
try:
website_index = [p.lower() for p in parts].index(website.lower())
except ValueError:
return "" # 'website' not found in the path
# Extract the part of the path starting from 'website'
relevant_parts = parts[website_index + 1 :]
# Handle _includes directory
if relevant_parts and relevant_parts[0].lower() == "_includes":
return ""
# Join the remaining parts
url_path = "/".join(relevant_parts)
# Handle index.md and other .md files
if url_path.lower().endswith(index.lower()):
url_path = url_path[: -len(index)]
elif url_path.lower().endswith(md.lower()):
url_path = url_path[: -len(md)] + ".html"
# Ensure the URL starts and ends with '/'
url_path = url_path.strip("/")
return f"https://aider.chat/{url_path}"
def get_index():
@@ -69,12 +92,17 @@ def get_index():
dname = Path.home() / ".aider" / "caches" / ("help." + __version__)
if dname.exists():
storage_context = StorageContext.from_defaults(
persist_dir=dname,
)
index = load_index_from_storage(storage_context)
else:
index = None
try:
if dname.exists():
storage_context = StorageContext.from_defaults(
persist_dir=dname,
)
index = load_index_from_storage(storage_context)
except (OSError, json.JSONDecodeError):
shutil.rmtree(dname)
if index is None:
parser = MarkdownNodeParser()
nodes = []

View File

@@ -109,7 +109,7 @@ class ChatSummary:
for model in self.models:
try:
summary = simple_send_with_retries(
model.name, summarize_messages, extra_headers=model.extra_headers
model.name, summarize_messages, extra_params=model.extra_params
)
if summary is not None:
summary = prompts.summary_prefix + summary

View File

@@ -1,11 +1,14 @@
import base64
import os
import webbrowser
from collections import defaultdict
from dataclasses import dataclass
from datetime import datetime
from io import StringIO
from pathlib import Path
from prompt_toolkit.completion import Completer, Completion, ThreadedCompleter
from prompt_toolkit.cursor_shapes import ModalCursorShapeConfig
from prompt_toolkit.enums import EditingMode
from prompt_toolkit.history import FileHistory
from prompt_toolkit.key_binding import KeyBindings
@@ -14,10 +17,12 @@ from prompt_toolkit.shortcuts import CompleteStyle, PromptSession
from prompt_toolkit.styles import Style
from pygments.lexers import MarkdownLexer, guess_lexer_for_filename
from pygments.token import Token
from rich.columns import Columns
from rich.console import Console
from rich.markdown import Markdown
from rich.style import Style as RichStyle
from rich.text import Text
from rich.markdown import Markdown
from aider.mdstream import MarkdownStream
from .dump import dump # noqa: F401
@@ -91,17 +96,16 @@ class AutoCompleter(Completer):
(token[1], f"`{token[1]}`") for token in tokens if token[0] in Token.Name
)
def get_command_completions(self, text, words):
candidates = []
def get_command_completions(self, document, complete_event, text, words):
if len(words) == 1 and not text[-1].isspace():
partial = words[0].lower()
candidates = [cmd for cmd in self.command_names if cmd.startswith(partial)]
return candidates
for candidate in sorted(candidates):
yield Completion(candidate, start_position=-len(words[-1]))
return
if len(words) <= 1:
return []
if text[-1].isspace():
return []
if len(words) <= 1 or text[-1].isspace():
return
cmd = words[0]
partial = words[-1].lower()
@@ -112,6 +116,11 @@ class AutoCompleter(Completer):
elif cmd not in matches:
return
raw_completer = self.commands.get_raw_completions(cmd)
if raw_completer:
yield from raw_completer(document, complete_event)
return
if cmd not in self.command_completions:
candidates = self.commands.get_completions(cmd)
self.command_completions[cmd] = candidates
@@ -122,7 +131,8 @@ class AutoCompleter(Completer):
return
candidates = [word for word in candidates if partial in word.lower()]
return candidates
for candidate in sorted(candidates):
yield Completion(candidate, start_position=-len(words[-1]))
def get_completions(self, document, complete_event):
self.tokenize()
@@ -137,11 +147,8 @@ class AutoCompleter(Completer):
return
if text[0] == "/":
candidates = self.get_command_completions(text, words)
if candidates is not None:
for candidate in sorted(candidates):
yield Completion(candidate, start_position=-len(words[-1]))
return
yield from self.get_command_completions(document, complete_event, text, words)
return
candidates = self.words
candidates.update(set(self.fname_to_rel_fnames))
@@ -179,12 +186,18 @@ class InputOutput:
tool_error_color="red",
tool_warning_color="#FFA500",
assistant_output_color="blue",
completion_menu_color=None,
completion_menu_bg_color=None,
completion_menu_current_color=None,
completion_menu_current_bg_color=None,
code_theme="default",
encoding="utf-8",
dry_run=False,
llm_history_file=None,
editingmode=EditingMode.EMACS,
fancy_input=True,
):
self.never_prompts = set()
self.editingmode = editingmode
no_color = os.environ.get("NO_COLOR")
if no_color is not None and no_color != "":
@@ -195,6 +208,11 @@ class InputOutput:
self.tool_error_color = tool_error_color if pretty else None
self.tool_warning_color = tool_warning_color if pretty else None
self.assistant_output_color = assistant_output_color
self.completion_menu_color = completion_menu_color if pretty else None
self.completion_menu_bg_color = completion_menu_bg_color if pretty else None
self.completion_menu_current_color = completion_menu_current_color if pretty else None
self.completion_menu_current_bg_color = completion_menu_current_bg_color if pretty else None
self.code_theme = code_theme
self.input = input
@@ -220,7 +238,7 @@ class InputOutput:
self.append_chat_history(f"\n# aider chat started at {current_time}\n\n")
self.prompt_session = None
if self.pretty:
if fancy_input:
# Initialize PromptSession
session_kwargs = {
"input": self.input,
@@ -228,6 +246,8 @@ class InputOutput:
"lexer": PygmentsLexer(MarkdownLexer),
"editing_mode": self.editingmode,
}
if self.editingmode == EditingMode.VI:
session_kwargs["cursor"] = ModalCursorShapeConfig()
if self.input_history_file is not None:
session_kwargs["history"] = FileHistory(self.input_history_file)
try:
@@ -239,6 +259,41 @@ class InputOutput:
else:
self.console = Console(force_terminal=False, no_color=True) # non-pretty
def _get_style(self):
style_dict = {}
if not self.pretty:
return Style.from_dict(style_dict)
if self.user_input_color:
style_dict.setdefault("", self.user_input_color)
style_dict.update(
{
"pygments.literal.string": f"bold italic {self.user_input_color}",
}
)
# Conditionally add 'completion-menu' style
completion_menu_style = []
if self.completion_menu_bg_color:
completion_menu_style.append(f"bg:{self.completion_menu_bg_color}")
if self.completion_menu_color:
completion_menu_style.append(self.completion_menu_color)
if completion_menu_style:
style_dict["completion-menu"] = " ".join(completion_menu_style)
# Conditionally add 'completion-menu.completion.current' style
completion_menu_current_style = []
if self.completion_menu_current_bg_color:
completion_menu_current_style.append(f"bg:{self.completion_menu_current_bg_color}")
if self.completion_menu_current_color:
completion_menu_current_style.append(self.completion_menu_current_color)
if completion_menu_current_style:
style_dict["completion-menu.completion.current"] = " ".join(
completion_menu_current_style
)
return Style.from_dict(style_dict)
def read_image(self, filename):
try:
with open(str(filename), "rb") as image_file:
@@ -308,7 +363,10 @@ class InputOutput:
rel_fnames = list(rel_fnames)
show = ""
if rel_fnames:
show = " ".join(rel_fnames) + "\n"
rel_read_only_fnames = [
get_rel_fname(fname, root) for fname in (abs_read_only_fnames or [])
]
show = self.format_files_for_input(rel_fnames, rel_read_only_fnames)
if edit_format:
show += edit_format
show += "> "
@@ -316,15 +374,7 @@ class InputOutput:
inp = ""
multiline_input = False
if self.user_input_color and self.pretty:
style = Style.from_dict(
{
"": self.user_input_color,
"pygments.literal.string": f"bold italic {self.user_input_color}",
}
)
else:
style = None
style = self._get_style()
completer_instance = ThreadedCompleter(
AutoCompleter(
@@ -339,6 +389,11 @@ class InputOutput:
kb = KeyBindings()
@kb.add("c-space")
def _(event):
"Ignore Ctrl when pressing space bar"
event.current_buffer.insert_text(" ")
@kb.add("escape", "c-m", eager=True)
def _(event):
event.current_buffer.insert_text("\n")
@@ -430,13 +485,35 @@ class InputOutput:
hist = "\n" + content.strip() + "\n\n"
self.append_chat_history(hist)
def offer_url(self, url, prompt="Open URL for more info?"):
"""Offer to open a URL in the browser, returns True if opened."""
if url in self.never_prompts:
return False
if self.confirm_ask(prompt, subject=url, allow_never=True):
webbrowser.open(url)
return True
return False
def confirm_ask(
self, question, default="y", subject=None, explicit_yes_required=False, group=None
self,
question,
default="y",
subject=None,
explicit_yes_required=False,
group=None,
allow_never=False,
):
self.num_user_asks += 1
question_id = (question, subject)
if question_id in self.never_prompts:
return False
if group and not group.show_group:
group = None
if group:
allow_never = True
valid_responses = ["yes", "no"]
options = " (Y)es/(N)o"
@@ -446,6 +523,10 @@ class InputOutput:
valid_responses.append("all")
options += "/(S)kip all"
valid_responses.append("skip")
if allow_never:
options += "/(D)on't ask again"
valid_responses.append("don't")
question += options + " [Yes]: "
if subject:
@@ -459,10 +540,7 @@ class InputOutput:
else:
self.tool_output(subject, bold=True)
if self.pretty and self.user_input_color:
style = {"": self.user_input_color}
else:
style = dict()
style = self._get_style()
def is_valid_response(text):
if not text:
@@ -481,7 +559,7 @@ class InputOutput:
if self.prompt_session:
res = self.prompt_session.prompt(
question,
style=Style.from_dict(style),
style=style,
)
else:
res = input(question)
@@ -499,6 +577,12 @@ class InputOutput:
res = res.lower()[0]
if res == "d" and allow_never:
self.never_prompts.add(question_id)
hist = f"{question.strip()} {res}"
self.append_chat_history(hist, linebreak=True, blockquote=True)
return False
if explicit_yes_required:
is_yes = res == "y"
else:
@@ -525,10 +609,7 @@ class InputOutput:
self.tool_output()
self.tool_output(subject, bold=True)
if self.pretty and self.user_input_color:
style = Style.from_dict({"": self.user_input_color})
else:
style = None
style = self._get_style()
if self.yes is True:
res = "yes"
@@ -586,27 +667,30 @@ class InputOutput:
style = RichStyle(**style)
self.console.print(*messages, style=style)
def assistant_output(self, message, stream=False):
mdStream = None
def get_assistant_mdstream(self):
mdargs = dict(style=self.assistant_output_color, code_theme=self.code_theme)
mdStream = MarkdownStream(mdargs=mdargs)
return mdStream
def assistant_output(self, message, pretty=None):
show_resp = message
if self.pretty:
if stream:
mdargs = dict(style=self.assistant_output_color, code_theme=self.code_theme)
mdStream = MarkdownStream(mdargs=mdargs)
else:
show_resp = Markdown(
message, style=self.assistant_output_color, code_theme=self.code_theme
)
# Coder will force pretty off if fence is not triple-backticks
if pretty is None:
pretty = self.pretty
if pretty:
show_resp = Markdown(
message, style=self.assistant_output_color, code_theme=self.code_theme
)
else:
show_resp = Text(message or "<no response>")
self.console.print(show_resp)
return mdStream
def print(self, message=""):
print(message)
def append_chat_history(self, text, linebreak=False, blockquote=False, strip=True):
if blockquote:
if strip:
@@ -620,11 +704,57 @@ class InputOutput:
text += "\n"
if self.chat_history_file is not None:
try:
with self.chat_history_file.open("a", encoding=self.encoding) as f:
with self.chat_history_file.open("a", encoding=self.encoding, errors="ignore") as f:
f.write(text)
except (PermissionError, OSError):
self.tool_error(
f"Warning: Unable to write to chat history file {self.chat_history_file}."
" Permission denied."
)
except (PermissionError, OSError) as err:
print(f"Warning: Unable to write to chat history file {self.chat_history_file}.")
print(err)
self.chat_history_file = None # Disable further attempts to write
def format_files_for_input(self, rel_fnames, rel_read_only_fnames):
if not self.pretty:
read_only_files = []
for full_path in sorted(rel_read_only_fnames or []):
read_only_files.append(f"{full_path} (read only)")
editable_files = []
for full_path in sorted(rel_fnames):
if full_path in rel_read_only_fnames:
continue
editable_files.append(f"{full_path}")
return "\n".join(read_only_files + editable_files) + "\n"
output = StringIO()
console = Console(file=output, force_terminal=False)
read_only_files = sorted(rel_read_only_fnames or [])
editable_files = [f for f in sorted(rel_fnames) if f not in rel_read_only_fnames]
if read_only_files:
files_with_label = ["Readonly:"] + read_only_files
read_only_output = StringIO()
Console(file=read_only_output, force_terminal=False).print(Columns(files_with_label))
read_only_lines = read_only_output.getvalue().splitlines()
console.print(Columns(files_with_label))
if editable_files:
files_with_label = editable_files
if read_only_files:
files_with_label = ["Editable:"] + editable_files
editable_output = StringIO()
Console(file=editable_output, force_terminal=False).print(Columns(files_with_label))
editable_lines = editable_output.getvalue().splitlines()
if len(read_only_lines) > 1 or len(editable_lines) > 1:
console.print()
console.print(Columns(files_with_label))
return output.getvalue()
def get_rel_fname(fname, root):
try:
return os.path.relpath(fname, root)
except ValueError:
return fname

View File

@@ -83,7 +83,11 @@ class Linter:
def lint(self, fname, cmd=None):
rel_fname = self.get_rel_fname(fname)
code = Path(fname).read_text(encoding=self.encoding, errors="replace")
try:
code = Path(fname).read_text(encoding=self.encoding, errors="replace")
except OSError as err:
print(f"Unable to read {fname}: {err}")
return
if cmd:
cmd = cmd.strip()
@@ -211,13 +215,18 @@ def basic_lint(fname, code):
try:
parser = get_parser(lang)
except OSError as err:
except Exception as err:
print(f"Unable to load parser: {err}")
return
tree = parser.parse(bytes(code, "utf-8"))
errors = traverse_tree(tree.root_node)
try:
errors = traverse_tree(tree.root_node)
except RecursionError:
print(f"Unable to lint {fname} due to RecursionError")
return
if not errors:
return

View File

@@ -8,10 +8,12 @@ import traceback
from pathlib import Path
import git
import importlib_resources
from dotenv import load_dotenv
from prompt_toolkit.enums import EditingMode
from aider import __version__, models, utils
from aider import __version__, models, urls, utils
from aider.analytics import Analytics
from aider.args import get_parser
from aider.coders import Coder
from aider.commands import Commands, SwitchCoder
@@ -26,6 +28,23 @@ from aider.versioncheck import check_version, install_from_main_branch, install_
from .dump import dump # noqa: F401
def check_config_files_for_yes(config_files):
found = False
for config_file in config_files:
if Path(config_file).exists():
try:
with open(config_file, "r") as f:
for line in f:
if line.strip().startswith("yes:"):
print("Configuration error detected.")
print(f"The file {config_file} contains a line starting with 'yes:'")
print("Please replace 'yes:' with 'yes-always:' in this file.")
found = True
except Exception:
pass
return found
def get_git_root():
"""Try and guess the git repo, since the conf.yml can be at the repo root"""
try:
@@ -40,7 +59,7 @@ def guessed_wrong_repo(io, git_root, fnames, git_dname):
try:
check_repo = Path(GitRepo(io, fnames, git_dname).root).resolve()
except FileNotFoundError:
except (OSError,) + ANY_GIT_ERROR:
return
# we had no guess, rely on the "true" repo result
@@ -68,15 +87,25 @@ def make_new_repo(git_root, io):
def setup_git(git_root, io):
try:
cwd = Path.cwd()
except OSError:
cwd = None
repo = None
if git_root:
repo = git.Repo(git_root)
elif Path.cwd() == Path.home():
try:
repo = git.Repo(git_root)
except ANY_GIT_ERROR:
pass
elif cwd == Path.home():
io.tool_warning("You should probably run aider in a directory, not your home dir.")
return
elif io.confirm_ask("No git repo found, create one to track aider's changes (recommended)?"):
git_root = str(Path.cwd().resolve())
elif cwd and io.confirm_ask(
"No git repo found, create one to track aider's changes (recommended)?"
):
git_root = str(cwd.resolve())
repo = make_new_repo(git_root, io)
if not repo:
@@ -114,32 +143,39 @@ def check_gitignore(git_root, io, ask=True):
try:
repo = git.Repo(git_root)
if repo.ignored(".aider"):
if repo.ignored(".aider") and repo.ignored(".env"):
return
except ANY_GIT_ERROR:
pass
pat = ".aider*"
patterns = [".aider*", ".env"]
patterns_to_add = []
gitignore_file = Path(git_root) / ".gitignore"
if gitignore_file.exists():
content = io.read_text(gitignore_file)
if content is None:
return
if pat in content.splitlines():
return
existing_lines = content.splitlines()
for pat in patterns:
if pat not in existing_lines:
patterns_to_add.append(pat)
else:
content = ""
patterns_to_add = patterns
if ask and not io.confirm_ask(f"Add {pat} to .gitignore (recommended)?"):
if not patterns_to_add:
return
if ask and not io.confirm_ask(f"Add {', '.join(patterns_to_add)} to .gitignore (recommended)?"):
return
if content and not content.endswith("\n"):
content += "\n"
content += pat + "\n"
content += "\n".join(patterns_to_add) + "\n"
io.write_text(gitignore_file, content)
io.tool_output(f"Added {pat} to .gitignore")
io.tool_output(f"Added {', '.join(patterns_to_add)} to .gitignore")
def check_streamlit_install(io):
@@ -169,7 +205,10 @@ def launch_gui(args):
"--server.runOnSave=false",
]
if "-dev" in __version__:
# https://github.com/Aider-AI/aider/issues/2193
is_dev = "-dev" in str(__version__)
if is_dev:
print("Watching for file changes.")
else:
st_args += [
@@ -217,16 +256,23 @@ def parse_lint_cmds(lint_cmds, io):
return res
def generate_search_path_list(default_fname, git_root, command_line_file):
def generate_search_path_list(default_file, git_root, command_line_file):
files = []
default_file = Path(default_fname)
files.append(Path.home() / default_file) # homedir
if git_root:
files.append(Path(git_root) / default_file) # git root
files.append(default_file.resolve())
files.append(default_file)
if command_line_file:
files.append(command_line_file)
files = [Path(fn).resolve() for fn in files]
resolved_files = []
for fn in files:
try:
resolved_files.append(Path(fn).resolve())
except OSError:
pass
files = resolved_files
files.reverse()
uniq = []
for fn in files:
@@ -266,7 +312,7 @@ def register_models(git_root, model_settings_fname, io, verbose=False):
return None
def load_dotenv_files(git_root, dotenv_fname):
def load_dotenv_files(git_root, dotenv_fname, encoding="utf-8"):
dotenv_files = generate_search_path_list(
".env",
git_root,
@@ -274,9 +320,14 @@ def load_dotenv_files(git_root, dotenv_fname):
)
loaded = []
for fname in dotenv_files:
if Path(fname).exists():
loaded.append(fname)
load_dotenv(fname, override=True)
try:
if Path(fname).exists():
load_dotenv(fname, override=True, encoding=encoding)
loaded.append(fname)
except OSError as e:
print(f"OSError loading {fname}: {e}")
except Exception as e:
print(f"Error loading {fname}: {e}")
return loaded
@@ -285,6 +336,10 @@ def register_litellm_models(git_root, model_metadata_fname, io, verbose=False):
".aider.model.metadata.json", git_root, model_metadata_fname
)
# Add the resource file path
resource_metadata = importlib_resources.files("aider.resources").joinpath("model-metadata.json")
model_metatdata_files.append(str(resource_metadata))
try:
model_metadata_files_loaded = models.register_litellm_models(model_metatdata_files)
if len(model_metadata_files_loaded) > 0 and verbose:
@@ -304,6 +359,7 @@ def sanity_check_repo(repo, io):
io.tool_error("The git repo does not seem to have a working tree?")
return False
bad_ver = False
try:
repo.get_tracked_files()
if not repo.git_repo_error:
@@ -320,7 +376,7 @@ def sanity_check_repo(repo, io):
io.tool_error("Aider only works with git repos with version number 1 or 2.")
io.tool_output("You may be able to convert your repo: git update-index --index-version=2")
io.tool_output("Or run aider --no-git to proceed without using git.")
io.tool_output("https://github.com/paul-gauthier/aider/issues/211")
io.offer_url(urls.git_index_version, "Open documentation url for more info?")
return False
io.tool_error("Unable to read git repository, it may be corrupt?")
@@ -341,7 +397,12 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
conf_fname = Path(".aider.conf.yml")
default_config_files = [conf_fname.resolve()] # CWD
default_config_files = []
try:
default_config_files += [conf_fname.resolve()] # CWD
except OSError:
pass
if git_root:
git_conf = Path(git_root) / conf_fname # git root
if git_conf not in default_config_files:
@@ -350,7 +411,13 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
default_config_files = list(map(str, default_config_files))
parser = get_parser(default_config_files, git_root)
args, unknown = parser.parse_known_args(argv)
try:
args, unknown = parser.parse_known_args(argv)
except AttributeError as e:
if all(word in str(e) for word in ["bool", "object", "has", "no", "attribute", "strip"]):
if check_config_files_for_yes(default_config_files):
return 1
raise e
if args.verbose:
print("Config files search order, if no --config:")
@@ -361,19 +428,26 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
default_config_files.reverse()
parser = get_parser(default_config_files, git_root)
args, unknown = parser.parse_known_args(argv)
# Load the .env file specified in the arguments
loaded_dotenvs = load_dotenv_files(git_root, args.env_file)
loaded_dotenvs = load_dotenv_files(git_root, args.env_file, args.encoding)
# Parse again to include any arguments that might have been defined in .env
args = parser.parse_args(argv)
if args.analytics_disable:
analytics = Analytics(permanently_disable=True)
print("Analytics have been permanently disabled.")
if not args.verify_ssl:
import httpx
os.environ["SSL_VERIFY"] = ""
litellm._load_litellm()
litellm._lazy_module.client_session = httpx.Client(verify=False)
litellm._lazy_module.aclient_session = httpx.AsyncClient(verify=False)
if args.dark_mode:
args.user_input_color = "#32FF32"
@@ -389,28 +463,34 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
args.assistant_output_color = "blue"
args.code_theme = "default"
if return_coder and args.yes is None:
args.yes = True
if return_coder and args.yes_always is None:
args.yes_always = True
editing_mode = EditingMode.VI if args.vim else EditingMode.EMACS
def get_io(pretty):
return InputOutput(
pretty,
args.yes,
args.yes_always,
args.input_history_file,
args.chat_history_file,
input=input,
output=output,
user_input_color=args.user_input_color,
tool_output_color=args.tool_output_color,
tool_warning_color=args.tool_warning_color,
tool_error_color=args.tool_error_color,
completion_menu_color=args.completion_menu_color,
completion_menu_bg_color=args.completion_menu_bg_color,
completion_menu_current_color=args.completion_menu_current_color,
completion_menu_current_bg_color=args.completion_menu_current_bg_color,
assistant_output_color=args.assistant_output_color,
code_theme=args.code_theme,
dry_run=args.dry_run,
encoding=args.encoding,
llm_history_file=args.llm_history_file,
editingmode=editing_mode,
fancy_input=args.fancy_input,
)
io = get_io(args.pretty)
@@ -422,9 +502,35 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
io = get_io(False)
io.tool_warning("Terminal does not support pretty output (UnicodeDecodeError)")
analytics = Analytics(logfile=args.analytics_log, permanently_disable=args.analytics_disable)
if args.analytics:
if analytics.need_to_ask():
io.tool_output(
"Aider respects your privacy and never collects your code, chat messages, keys or"
" personal info."
)
io.tool_output(f"For more info: {urls.analytics}")
disable = not io.confirm_ask(
"Allow collection of anonymous analytics to help improve aider?"
)
analytics.asked_opt_in = True
if disable:
analytics.disable(permanently=True)
io.tool_output("Analytics have been permanently disabled.")
analytics.save_data()
io.tool_output()
# This is a no-op if the user has opted out
analytics.enable()
analytics.event("launched")
if args.gui and not return_coder:
if not check_streamlit_install(io):
return
analytics.event("gui session")
launch_gui(argv)
return
@@ -519,9 +625,14 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if not args.model:
args.model = "gpt-4o-2024-08-06"
if os.environ.get("ANTHROPIC_API_KEY"):
args.model = "claude-3-5-sonnet-20240620"
args.model = "claude-3-5-sonnet-20241022"
main_model = models.Model(args.model, weak_model=args.weak_model)
main_model = models.Model(
args.model,
weak_model=args.weak_model,
editor_model=args.editor_model,
editor_edit_format=args.editor_edit_format,
)
if args.verbose:
io.tool_output("Model info:")
@@ -534,11 +645,12 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if args.show_model_warnings:
problem = models.sanity_check_models(io, main_model)
if problem:
analytics.event("model warning", main_model=main_model)
io.tool_output("You can skip this check with --no-show-model-warnings")
io.tool_output()
try:
if not io.confirm_ask("Proceed anyway?"):
return 1
io.offer_url(urls.model_warnings, "Open documentation url for more info?")
io.tool_output()
except KeyboardInterrupt:
return 1
@@ -561,8 +673,9 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
except FileNotFoundError:
pass
if not sanity_check_repo(repo, io):
return 1
if not args.skip_sanity_check_repo:
if not sanity_check_repo(repo, io):
return 1
commands = Commands(
io, None, verify_ssl=args.verify_ssl, args=args, parser=parser, verbose=args.verbose
@@ -579,7 +692,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if not main_model.streaming:
if args.stream:
io.tool_warning(
"Warning: Streaming is not supported by the selected model. Disabling streaming."
f"Warning: Streaming is not supported by {main_model.name}. Disabling streaming."
)
args.stream = False
@@ -606,6 +719,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
test_cmd=args.test_cmd,
commands=commands,
summarizer=summarizer,
analytics=analytics,
map_refresh=args.map_refresh,
cache_prompts=args.cache_prompts,
map_mul_no_files=args.map_multiplier_no_files,
@@ -664,6 +778,10 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
coder.apply_updates()
return
if args.apply_clipboard_edits:
args.edit_format = main_model.editor_edit_format
args.message = "/paste"
if "VSCODE_GIT_IPC_HANDLE" in os.environ:
args.pretty = False
io.tool_output("VSCode terminal detected, pretty output has been disabled.")
@@ -679,6 +797,9 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
io.tool_output(f"Cur working dir: {Path.cwd()}")
io.tool_output(f"Git working dir: {git_root}")
if args.load:
commands.cmd_load(args.load)
if args.message:
io.add_to_input_history(args.message)
io.tool_output()
@@ -704,6 +825,8 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if args.exit:
return
analytics.event("cli session", main_model=main_model, edit_format=main_model.edit_format)
while True:
try:
coder.run()
@@ -751,7 +874,8 @@ def check_and_load_imports(io, verbose=False):
except Exception as err:
io.tool_error(str(err))
io.tool_output("Error loading required imports. Did you install aider properly?")
io.tool_output("https://aider.chat/docs/install/install.html")
io.offer_url(urls.install_properly, "Open documentation url for more info?")
sys.exit(1)
installs[str(key)] = True

View File

@@ -13,7 +13,6 @@ import json5
import yaml
from PIL import Image
from aider import urls
from aider.dump import dump # noqa: F401
from aider.llm import litellm
@@ -53,9 +52,11 @@ ANTHROPIC_MODELS = """
claude-2
claude-2.1
claude-3-haiku-20240307
claude-3-5-haiku-20241022
claude-3-opus-20240229
claude-3-sonnet-20240229
claude-3-5-sonnet-20240620
claude-3-5-sonnet-20241022
"""
ANTHROPIC_MODELS = [ln.strip() for ln in ANTHROPIC_MODELS.splitlines() if ln.strip()]
@@ -69,17 +70,17 @@ class ModelSettings:
weak_model_name: Optional[str] = None
use_repo_map: bool = False
send_undo_reply: bool = False
accepts_images: bool = False
lazy: bool = False
reminder: str = "user"
examples_as_sys_msg: bool = False
extra_headers: Optional[dict] = None
max_tokens: Optional[int] = None
extra_params: Optional[dict] = None
cache_control: bool = False
caches_by_default: bool = False
use_system_prompt: bool = True
use_temperature: bool = True
streaming: bool = True
editor_model_name: Optional[str] = None
editor_edit_format: Optional[str] = None
# https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo
@@ -124,7 +125,6 @@ MODEL_SETTINGS = [
"udiff",
weak_model_name="gpt-4o-mini",
use_repo_map=True,
accepts_images=True,
lazy=True,
reminder="sys",
),
@@ -133,7 +133,6 @@ MODEL_SETTINGS = [
"udiff",
weak_model_name="gpt-4o-mini",
use_repo_map=True,
accepts_images=True,
lazy=True,
reminder="sys",
),
@@ -142,16 +141,15 @@ MODEL_SETTINGS = [
"diff",
weak_model_name="gpt-4o-mini",
use_repo_map=True,
accepts_images=True,
lazy=True,
reminder="sys",
editor_edit_format="editor-diff",
),
ModelSettings(
"openai/gpt-4o-2024-08-06",
"diff",
weak_model_name="gpt-4o-mini",
use_repo_map=True,
accepts_images=True,
lazy=True,
reminder="sys",
),
@@ -160,7 +158,6 @@ MODEL_SETTINGS = [
"diff",
weak_model_name="gpt-4o-mini",
use_repo_map=True,
accepts_images=True,
lazy=True,
reminder="sys",
),
@@ -169,15 +166,14 @@ MODEL_SETTINGS = [
"diff",
weak_model_name="gpt-4o-mini",
use_repo_map=True,
accepts_images=True,
lazy=True,
reminder="sys",
editor_edit_format="editor-diff",
),
ModelSettings(
"gpt-4o-mini",
"whole",
weak_model_name="gpt-4o-mini",
accepts_images=True,
lazy=True,
reminder="sys",
),
@@ -185,7 +181,6 @@ MODEL_SETTINGS = [
"openai/gpt-4o-mini",
"whole",
weak_model_name="openai/gpt-4o-mini",
accepts_images=True,
lazy=True,
reminder="sys",
),
@@ -211,7 +206,6 @@ MODEL_SETTINGS = [
"diff",
weak_model_name="gpt-4o-mini",
use_repo_map=True,
accepts_images=True,
reminder="sys",
),
ModelSettings(
@@ -240,30 +234,33 @@ MODEL_SETTINGS = [
ModelSettings(
"claude-3-opus-20240229",
"diff",
weak_model_name="claude-3-haiku-20240307",
weak_model_name="claude-3-5-haiku-20241022",
use_repo_map=True,
),
ModelSettings(
"openrouter/anthropic/claude-3-opus",
"diff",
weak_model_name="openrouter/anthropic/claude-3-haiku",
weak_model_name="openrouter/anthropic/claude-3-5-haiku",
use_repo_map=True,
),
ModelSettings(
"claude-3-sonnet-20240229",
"whole",
weak_model_name="claude-3-haiku-20240307",
weak_model_name="claude-3-5-haiku-20241022",
),
ModelSettings(
"claude-3-5-sonnet-20240620",
"diff",
weak_model_name="claude-3-haiku-20240307",
weak_model_name="claude-3-5-haiku-20241022",
editor_model_name="claude-3-5-sonnet-20240620",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
accepts_images=True,
max_tokens=8192,
extra_headers={
"anthropic-beta": ANTHROPIC_BETA_HEADER,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
"max_tokens": 8192,
},
cache_control=True,
reminder="user",
@@ -271,12 +268,84 @@ MODEL_SETTINGS = [
ModelSettings(
"anthropic/claude-3-5-sonnet-20240620",
"diff",
weak_model_name="claude-3-haiku-20240307",
weak_model_name="anthropic/claude-3-5-haiku-20241022",
editor_model_name="anthropic/claude-3-5-sonnet-20240620",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
max_tokens=8192,
extra_headers={
"anthropic-beta": ANTHROPIC_BETA_HEADER,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
"max_tokens": 8192,
},
cache_control=True,
reminder="user",
),
ModelSettings(
"anthropic/claude-3-5-sonnet-20241022",
"diff",
weak_model_name="anthropic/claude-3-5-haiku-20241022",
editor_model_name="anthropic/claude-3-5-sonnet-20241022",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
"max_tokens": 8192,
},
cache_control=True,
reminder="user",
),
ModelSettings(
"bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
"diff",
weak_model_name="bedrock/anthropic.claude-3-5-haiku-20241022-v1:0",
editor_model_name="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
"max_tokens": 8192,
},
cache_control=True,
reminder="user",
),
ModelSettings(
"anthropic/claude-3-5-sonnet-latest",
"diff",
weak_model_name="anthropic/claude-3-5-haiku-20241022",
editor_model_name="anthropic/claude-3-5-sonnet-20241022",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
"max_tokens": 8192,
},
cache_control=True,
reminder="user",
),
ModelSettings(
"claude-3-5-sonnet-20241022",
"diff",
weak_model_name="claude-3-5-haiku-20241022",
editor_model_name="claude-3-5-sonnet-20241022",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
"max_tokens": 8192,
},
cache_control=True,
reminder="user",
@@ -286,29 +355,96 @@ MODEL_SETTINGS = [
"whole",
weak_model_name="anthropic/claude-3-haiku-20240307",
examples_as_sys_msg=True,
extra_headers={
"anthropic-beta": ANTHROPIC_BETA_HEADER,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
},
cache_control=True,
),
ModelSettings(
"anthropic/claude-3-5-haiku-20241022",
"diff",
weak_model_name="anthropic/claude-3-5-haiku-20241022",
use_repo_map=True,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
},
cache_control=True,
),
ModelSettings(
"bedrock/anthropic.claude-3-5-haiku-20241022-v1:0",
"diff",
weak_model_name="bedrock/anthropic.claude-3-5-haiku-20241022-v1:0",
use_repo_map=True,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
},
cache_control=True,
),
ModelSettings(
"claude-3-5-haiku-20241022",
"diff",
weak_model_name="claude-3-5-haiku-20241022",
use_repo_map=True,
examples_as_sys_msg=True,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
},
cache_control=True,
),
ModelSettings(
"vertex_ai/claude-3-5-haiku@20241022",
"diff",
weak_model_name="vertex_ai/claude-3-5-haiku@20241022",
use_repo_map=True,
extra_params={
"max_tokens": 4096,
},
),
ModelSettings(
"claude-3-haiku-20240307",
"whole",
weak_model_name="claude-3-haiku-20240307",
examples_as_sys_msg=True,
extra_headers={
"anthropic-beta": ANTHROPIC_BETA_HEADER,
extra_params={
"extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER,
},
},
cache_control=True,
),
ModelSettings(
"openrouter/anthropic/claude-3.5-sonnet",
"diff",
weak_model_name="openrouter/anthropic/claude-3-haiku-20240307",
weak_model_name="openrouter/anthropic/claude-3-5-haiku",
editor_model_name="openrouter/anthropic/claude-3.5-sonnet",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
accepts_images=True,
max_tokens=8192,
extra_params={
"max_tokens": 8192,
},
reminder="user",
cache_control=True,
),
ModelSettings(
"openrouter/anthropic/claude-3.5-sonnet:beta",
"diff",
weak_model_name="openrouter/anthropic/claude-3-5-haiku:beta",
editor_model_name="openrouter/anthropic/claude-3.5-sonnet:beta",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
extra_params={
"max_tokens": 8192,
},
reminder="user",
cache_control=True,
),
@@ -317,23 +453,39 @@ MODEL_SETTINGS = [
ModelSettings(
"vertex_ai/claude-3-5-sonnet@20240620",
"diff",
weak_model_name="vertex_ai/claude-3-haiku@20240307",
weak_model_name="vertex_ai/claude-3-5-haiku@20241022",
editor_model_name="vertex_ai/claude-3-5-sonnet@20240620",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
accepts_images=True,
max_tokens=8192,
extra_params={
"max_tokens": 8192,
},
reminder="user",
),
ModelSettings(
"vertex_ai/claude-3-5-sonnet-v2@20241022",
"diff",
weak_model_name="vertex_ai/claude-3-5-haiku@20241022",
editor_model_name="vertex_ai/claude-3-5-sonnet-v2@20241022",
editor_edit_format="editor-diff",
use_repo_map=True,
examples_as_sys_msg=True,
extra_params={
"max_tokens": 8192,
},
reminder="user",
),
ModelSettings(
"vertex_ai/claude-3-opus@20240229",
"diff",
weak_model_name="vertex_ai/claude-3-haiku@20240307",
weak_model_name="vertex_ai/claude-3-5-haiku@20241022",
use_repo_map=True,
),
ModelSettings(
"vertex_ai/claude-3-sonnet@20240229",
"whole",
weak_model_name="vertex_ai/claude-3-haiku@20240307",
weak_model_name="vertex_ai/claude-3-5-haiku@20241022",
),
# Cohere
ModelSettings(
@@ -374,6 +526,15 @@ MODEL_SETTINGS = [
examples_as_sys_msg=True,
),
# Gemini
ModelSettings(
"gemini/gemini-1.5-pro-002",
"diff",
use_repo_map=True,
),
ModelSettings(
"gemini/gemini-1.5-flash-002",
"whole",
),
ModelSettings(
"gemini/gemini-1.5-pro",
"diff-fenced",
@@ -389,6 +550,11 @@ MODEL_SETTINGS = [
"diff-fenced",
use_repo_map=True,
),
ModelSettings(
"vertex_ai/gemini-pro-experimental",
"diff-fenced",
use_repo_map=True,
),
ModelSettings(
"gemini/gemini-1.5-flash-exp-0827",
"whole",
@@ -401,7 +567,9 @@ MODEL_SETTINGS = [
use_repo_map=True,
examples_as_sys_msg=True,
reminder="sys",
max_tokens=8192,
extra_params={
"max_tokens": 8192,
},
),
ModelSettings(
"deepseek/deepseek-coder",
@@ -410,7 +578,9 @@ MODEL_SETTINGS = [
examples_as_sys_msg=True,
reminder="sys",
caches_by_default=True,
max_tokens=8192,
extra_params={
"max_tokens": 8192,
},
),
ModelSettings(
"deepseek-chat",
@@ -418,7 +588,9 @@ MODEL_SETTINGS = [
use_repo_map=True,
examples_as_sys_msg=True,
reminder="sys",
max_tokens=8192,
extra_params={
"max_tokens": 8192,
},
),
ModelSettings(
"deepseek-coder",
@@ -427,7 +599,9 @@ MODEL_SETTINGS = [
examples_as_sys_msg=True,
reminder="sys",
caches_by_default=True,
max_tokens=8192,
extra_params={
"max_tokens": 8192,
},
),
ModelSettings(
"openrouter/deepseek/deepseek-coder",
@@ -441,14 +615,28 @@ MODEL_SETTINGS = [
"diff",
weak_model_name="openrouter/openai/gpt-4o-mini",
use_repo_map=True,
accepts_images=True,
lazy=True,
reminder="sys",
editor_edit_format="editor-diff",
),
ModelSettings(
"openai/o1-mini",
"whole",
weak_model_name="openai/gpt-4o-mini",
editor_model_name="openai/gpt-4o",
editor_edit_format="editor-diff",
use_repo_map=True,
reminder="user",
use_system_prompt=False,
use_temperature=False,
streaming=False,
),
ModelSettings(
"azure/o1-mini",
"whole",
weak_model_name="azure/gpt-4o-mini",
editor_model_name="azure/gpt-4o",
editor_edit_format="editor-diff",
use_repo_map=True,
reminder="user",
use_system_prompt=False,
@@ -459,6 +647,8 @@ MODEL_SETTINGS = [
"o1-mini",
"whole",
weak_model_name="gpt-4o-mini",
editor_model_name="gpt-4o",
editor_edit_format="editor-diff",
use_repo_map=True,
reminder="user",
use_system_prompt=False,
@@ -469,6 +659,20 @@ MODEL_SETTINGS = [
"openai/o1-preview",
"diff",
weak_model_name="openai/gpt-4o-mini",
editor_model_name="openai/gpt-4o",
editor_edit_format="editor-diff",
use_repo_map=True,
reminder="user",
use_system_prompt=False,
use_temperature=False,
streaming=False,
),
ModelSettings(
"azure/o1-preview",
"diff",
weak_model_name="azure/gpt-4o-mini",
editor_model_name="azure/gpt-4o",
editor_edit_format="editor-diff",
use_repo_map=True,
reminder="user",
use_system_prompt=False,
@@ -477,8 +681,10 @@ MODEL_SETTINGS = [
),
ModelSettings(
"o1-preview",
"diff",
"architect",
weak_model_name="gpt-4o-mini",
editor_model_name="gpt-4o",
editor_edit_format="editor-diff",
use_repo_map=True,
reminder="user",
use_system_prompt=False,
@@ -489,6 +695,8 @@ MODEL_SETTINGS = [
"openrouter/openai/o1-mini",
"whole",
weak_model_name="openrouter/openai/gpt-4o-mini",
editor_model_name="openrouter/openai/gpt-4o",
editor_edit_format="editor-diff",
use_repo_map=True,
reminder="user",
use_system_prompt=False,
@@ -499,92 +707,107 @@ MODEL_SETTINGS = [
"openrouter/openai/o1-preview",
"diff",
weak_model_name="openrouter/openai/gpt-4o-mini",
editor_model_name="openrouter/openai/gpt-4o",
editor_edit_format="editor-diff",
use_repo_map=True,
reminder="user",
use_system_prompt=False,
use_temperature=False,
streaming=False,
),
ModelSettings(
"openrouter/qwen/qwen-2.5-coder-32b-instruct",
"diff",
weak_model_name="openrouter/qwen/qwen-2.5-coder-32b-instruct",
editor_model_name="openrouter/qwen/qwen-2.5-coder-32b-instruct",
editor_edit_format="editor-diff",
use_repo_map=True,
),
]
model_info_url = (
"https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
)
class ModelInfoManager:
MODEL_INFO_URL = (
"https://raw.githubusercontent.com/BerriAI/litellm/main/"
"model_prices_and_context_window.json"
)
CACHE_TTL = 60 * 60 * 24 # 24 hours
def __init__(self):
self.cache_dir = Path.home() / ".aider" / "caches"
self.cache_file = self.cache_dir / "model_prices_and_context_window.json"
self.content = None
self._load_cache()
def get_model_flexible(model, content):
info = content.get(model, dict())
if info:
return info
pieces = model.split("/")
if len(pieces) == 2:
info = content.get(pieces[1])
if info and info.get("litellm_provider") == pieces[0]:
return info
return dict()
def get_model_info(model):
if not litellm._lazy_module:
cache_dir = Path.home() / ".aider" / "caches"
cache_file = cache_dir / "model_prices_and_context_window.json"
def _load_cache(self):
try:
cache_dir.mkdir(parents=True, exist_ok=True)
use_cache = True
self.cache_dir.mkdir(parents=True, exist_ok=True)
if self.cache_file.exists():
cache_age = time.time() - self.cache_file.stat().st_mtime
if cache_age < self.CACHE_TTL:
self.content = json.loads(self.cache_file.read_text())
except OSError:
# If we can't create the cache directory, we'll skip using the cache
use_cache = False
if use_cache:
current_time = time.time()
cache_age = (
current_time - cache_file.stat().st_mtime if cache_file.exists() else float("inf")
)
if cache_age < 60 * 60 * 24:
try:
content = json.loads(cache_file.read_text())
res = get_model_flexible(model, content)
if res:
return res
except Exception as ex:
print(str(ex))
import requests
pass
def _update_cache(self):
try:
response = requests.get(model_info_url, timeout=5)
import requests
response = requests.get(self.MODEL_INFO_URL, timeout=5)
if response.status_code == 200:
content = response.json()
if use_cache:
try:
cache_file.write_text(json.dumps(content, indent=4))
except OSError:
# If we can't write to the cache file, we'll just skip caching
pass
res = get_model_flexible(model, content)
if res:
return res
self.content = response.json()
try:
self.cache_file.write_text(json.dumps(self.content, indent=4))
except OSError:
pass
except Exception as ex:
print(str(ex))
# If all else fails, do it the slow way...
try:
info = litellm.get_model_info(model)
return info
except Exception:
def get_model_from_cached_json_db(self, model):
if not self.content:
self._update_cache()
if not self.content:
return dict()
info = self.content.get(model, dict())
if info:
return info
pieces = model.split("/")
if len(pieces) == 2:
info = self.content.get(pieces[1])
if info and info.get("litellm_provider") == pieces[0]:
return info
return dict()
def get_model_info(self, model):
cached_info = self.get_model_from_cached_json_db(model)
litellm_info = None
if litellm._lazy_module or not cached_info:
try:
litellm_info = litellm.get_model_info(model)
except Exception as ex:
if "model_prices_and_context_window.json" not in str(ex):
print(str(ex))
if litellm_info:
return litellm_info
return cached_info
model_info_manager = ModelInfoManager()
class Model(ModelSettings):
def __init__(self, model, weak_model=None):
def __init__(self, model, weak_model=None, editor_model=None, editor_edit_format=None):
self.name = model
self.max_chat_history_tokens = 1024
self.weak_model = None
self.editor_model = None
self.info = self.get_model_info(model)
@@ -605,8 +828,13 @@ class Model(ModelSettings):
else:
self.get_weak_model(weak_model)
if editor_model is False:
self.editor_model_name = None
else:
self.get_editor_model(editor_model, editor_edit_format)
def get_model_info(self, model):
return get_model_info(model)
return model_info_manager.get_model_info(model)
def configure_model_settings(self, model):
for ms in MODEL_SETTINGS:
@@ -645,7 +873,23 @@ class Model(ModelSettings):
self.edit_format = "diff"
self.use_repo_map = True
self.examples_as_sys_msg = True
self.reminder = None
self.reminder = "user"
if model.startswith("o1-") or "/o1-" in model:
self.use_system_prompt = False
self.use_temperature = False
self.streaming = False
if (
"qwen" in model
and "coder" in model
and ("2.5" in model or "2-5" in model)
and "32b" in model
):
"openrouter/qwen/qwen-2.5-coder-32b-instruct",
self.edit_format = "diff"
self.editor_edit_format = "editor-diff"
self.use_repo_map = True
# use the defaults
if self.edit_format == "diff":
@@ -676,6 +920,26 @@ class Model(ModelSettings):
def commit_message_models(self):
return [self.weak_model, self]
def get_editor_model(self, provided_editor_model_name, editor_edit_format):
# If editor_model_name is provided, override the model settings
if provided_editor_model_name:
self.editor_model_name = provided_editor_model_name
if editor_edit_format:
self.editor_edit_format = editor_edit_format
if not self.editor_model_name or self.editor_model_name == self.name:
self.editor_model = self
else:
self.editor_model = Model(
self.editor_model_name,
editor_model=False,
)
if not self.editor_edit_format:
self.editor_edit_format = self.editor_model.edit_format
return self.editor_model
def tokenizer(self, text):
return litellm.encode(model=self.name, text=text)
@@ -813,8 +1077,14 @@ def register_litellm_models(model_fnames):
continue
try:
with open(model_fname, "r") as model_def_file:
model_def = json5.load(model_def_file)
data = Path(model_fname).read_text()
if not data.strip():
continue
model_def = json5.loads(data)
if not model_def:
continue
# only load litellm if we have actual data
litellm._load_litellm()
litellm.register_model(model_def)
except Exception as e:
@@ -836,11 +1106,21 @@ def validate_variables(vars):
def sanity_check_models(io, main_model):
problem_main = sanity_check_model(io, main_model)
problem_weak = None
problem_strong = sanity_check_model(io, main_model)
if main_model.weak_model and main_model.weak_model is not main_model:
problem_weak = sanity_check_model(io, main_model.weak_model)
return problem_strong or problem_weak
problem_editor = None
if (
main_model.editor_model
and main_model.editor_model is not main_model
and main_model.editor_model is not main_model.weak_model
):
problem_editor = sanity_check_model(io, main_model.editor_model)
return problem_main or problem_weak or problem_editor
def sanity_check_model(io, model):
@@ -851,7 +1131,7 @@ def sanity_check_model(io, model):
io.tool_warning(f"Warning: {model} expects these environment variables")
for key in model.missing_keys:
value = os.environ.get(key, "")
status = "Set" if value else "Not set"
status = "Set" if value else "Not set"
io.tool_output(f"- {key}: {status}")
if platform.system() == "Windows" or True:
@@ -876,9 +1156,6 @@ def sanity_check_model(io, model):
for match in possible_matches:
io.tool_output(f"- {match}")
if show:
io.tool_output(f"For more info, see: {urls.model_warnings}")
return show
@@ -931,20 +1208,37 @@ def print_matching_models(io, search):
io.tool_output(f'No models match "{search}".')
def get_model_settings_as_yaml():
import yaml
model_settings_list = []
for ms in MODEL_SETTINGS:
model_settings_dict = {
field.name: getattr(ms, field.name) for field in fields(ModelSettings)
}
model_settings_list.append(model_settings_dict)
return yaml.dump(model_settings_list, default_flow_style=False)
def main():
if len(sys.argv) != 2:
print("Usage: python models.py <model_name>")
if len(sys.argv) < 2:
print("Usage: python models.py <model_name> or python models.py --yaml")
sys.exit(1)
model_name = sys.argv[1]
matching_models = fuzzy_match_models(model_name)
if matching_models:
print(f"Matching models for '{model_name}':")
for model in matching_models:
print(model)
if sys.argv[1] == "--yaml":
yaml_string = get_model_settings_as_yaml()
print(yaml_string)
else:
print(f"No matching models found for '{model_name}'.")
model_name = sys.argv[1]
matching_models = fuzzy_match_models(model_name)
if matching_models:
print(f"Matching models for '{model_name}':")
for model in matching_models:
print(model)
else:
print(f"No matching models found for '{model_name}'.")
if __name__ == "__main__":

View File

@@ -5,15 +5,21 @@
# Conventional Commits text adapted from:
# https://www.conventionalcommits.org/en/v1.0.0/#summary
commit_system = """You are an expert software engineer.
commit_system = """You are an expert software engineer that generates concise, \
one-line Git commit messages based on the provided diffs.
Review the provided context and diffs which are about to be committed to a git repo.
Review the diffs carefully.
Generate a commit message for those changes.
The commit message MUST use the imperative tense.
Generate a one-line commit message for those changes.
The commit message should be structured as follows: <type>: <description>
Use these for <type>: fix, feat, build, chore, ci, docs, style, refactor, perf, test
Reply with JUST the commit message, without quotes, comments, questions, etc!
Reply with one line only!
Ensure the commit message:
- Starts with the appropriate prefix.
- Is in the imperative mood (e.g., \"Add feature\" not \"Added feature\" or \"Adding feature\").
- Does not exceed 72 characters.
Reply only with the one-line commit message, without any additional text, explanations, \
or line breaks.
"""
# COMMANDS

View File

@@ -10,7 +10,15 @@ from aider.sendchat import simple_send_with_retries
from .dump import dump # noqa: F401
ANY_GIT_ERROR = (git.exc.ODBError, git.exc.GitError, OSError, IndexError, BufferError, TypeError)
ANY_GIT_ERROR = (
git.exc.ODBError,
git.exc.GitError,
OSError,
IndexError,
BufferError,
TypeError,
ValueError,
)
class GitRepo:
@@ -161,7 +169,7 @@ class GitRepo:
def get_rel_repo_dir(self):
try:
return os.path.relpath(self.repo.git_dir, os.getcwd())
except ValueError:
except (ValueError, OSError):
return self.repo.git_dir
def get_commit_message(self, diffs, context):
@@ -185,7 +193,7 @@ class GitRepo:
if max_tokens and num_tokens > max_tokens:
continue
commit_message = simple_send_with_retries(
model.name, messages, extra_headers=model.extra_headers
model.name, messages, extra_params=model.extra_params
)
if commit_message:
break
@@ -323,6 +331,15 @@ class GitRepo:
lines,
)
def git_ignored_file(self, path):
if not self.repo:
return
try:
if self.repo.ignored(path):
return True
except ANY_GIT_ERROR:
return False
def ignored_file(self, fname):
self.refresh_aider_ignore()
@@ -336,7 +353,14 @@ class GitRepo:
def ignored_file_raw(self, fname):
if self.subtree_only:
fname_path = Path(self.normalize_path(fname))
cwd_path = Path.cwd().resolve().relative_to(Path(self.root).resolve())
try:
cwd_path = Path.cwd().resolve().relative_to(Path(self.root).resolve())
except ValueError:
# Issue #1524
# ValueError: 'C:\\dev\\squid-certbot' is not in the subpath of
# 'C:\\dev\\squid-certbot'
# Clearly, fname is not under cwd... so ignore it
return True
if cwd_path not in fname_path.parents and fname_path != cwd_path:
return True

View File

@@ -2,6 +2,7 @@ import colorsys
import math
import os
import random
import shutil
import sqlite3
import sys
import time
@@ -27,7 +28,7 @@ from tree_sitter_languages import get_language, get_parser # noqa: E402
Tag = namedtuple("Tag", "rel_fname fname line name kind".split())
SQLITE_ERRORS = (sqlite3.OperationalError, sqlite3.DatabaseError)
SQLITE_ERRORS = (sqlite3.OperationalError, sqlite3.DatabaseError, OSError)
class RepoMap:
@@ -166,13 +167,52 @@ class RepoMap:
# Just return the full fname.
return fname
def tags_cache_error(self, original_error=None):
"""Handle SQLite errors by trying to recreate cache, falling back to dict if needed"""
if self.verbose and original_error:
self.io.tool_warning(f"Tags cache error: {str(original_error)}")
if isinstance(getattr(self, "TAGS_CACHE", None), dict):
return
path = Path(self.root) / self.TAGS_CACHE_DIR
# Try to recreate the cache
try:
# Delete existing cache dir
if path.exists():
shutil.rmtree(path)
# Try to create new cache
new_cache = Cache(path)
# Test that it works
test_key = "test"
new_cache[test_key] = "test"
_ = new_cache[test_key]
del new_cache[test_key]
# If we got here, the new cache works
self.TAGS_CACHE = new_cache
return
except SQLITE_ERRORS as e:
# If anything goes wrong, warn and fall back to dict
self.io.tool_warning(
f"Unable to use tags cache at {path}, falling back to memory cache"
)
if self.verbose:
self.io.tool_warning(f"Cache recreation error: {str(e)}")
self.TAGS_CACHE = dict()
def load_tags_cache(self):
path = Path(self.root) / self.TAGS_CACHE_DIR
try:
self.TAGS_CACHE = Cache(path)
except SQLITE_ERRORS:
self.io.tool_warning(f"Unable to use tags cache, delete {path} to resolve.")
self.TAGS_CACHE = dict()
except SQLITE_ERRORS as e:
self.tags_cache_error(e)
def save_tags_cache(self):
pass
@@ -190,9 +230,18 @@ class RepoMap:
return []
cache_key = fname
val = self.TAGS_CACHE.get(cache_key) # Issue #1308
try:
val = self.TAGS_CACHE.get(cache_key) # Issue #1308
except SQLITE_ERRORS as e:
self.tags_cache_error(e)
val = self.TAGS_CACHE.get(cache_key)
if val is not None and val.get("mtime") == file_mtime:
return self.TAGS_CACHE[cache_key]["data"]
try:
return self.TAGS_CACHE[cache_key]["data"]
except SQLITE_ERRORS as e:
self.tags_cache_error(e)
return self.TAGS_CACHE[cache_key]["data"]
# miss!
data = list(self.get_tags_raw(fname, rel_fname))
@@ -201,8 +250,9 @@ class RepoMap:
try:
self.TAGS_CACHE[cache_key] = {"mtime": file_mtime, "data": data}
self.save_tags_cache()
except SQLITE_ERRORS:
pass
except SQLITE_ERRORS as e:
self.tags_cache_error(e)
self.TAGS_CACHE[cache_key] = {"mtime": file_mtime, "data": data}
return data
@@ -302,7 +352,13 @@ class RepoMap:
# https://networkx.org/documentation/stable/_modules/networkx/algorithms/link_analysis/pagerank_alg.html#pagerank
personalize = 100 / len(fnames)
if len(fnames) - len(self.TAGS_CACHE) > 100:
try:
cache_size = len(self.TAGS_CACHE)
except SQLITE_ERRORS as e:
self.tags_cache_error(e)
cache_size = len(self.TAGS_CACHE)
if len(fnames) - cache_size > 100:
self.io.tool_output(
"Initial repo scan can be slow in larger repos, but only happens once."
)
@@ -312,6 +368,8 @@ class RepoMap:
showing_bar = False
for fname in fnames:
if self.verbose:
self.io.tool_output(f"Processing {fname}")
if progress and not showing_bar:
progress()
@@ -398,7 +456,11 @@ class RepoMap:
try:
ranked = nx.pagerank(G, weight="weight", **pers_args)
except ZeroDivisionError:
return []
# Issue #1536
try:
ranked = nx.pagerank(G, weight="weight")
except ZeroDivisionError:
return []
# distribute the rank from each source node, across all of its out edges
ranked_definitions = defaultdict(float)
@@ -415,7 +477,9 @@ class RepoMap:
ranked_definitions[(dst, ident)] += data["rank"]
ranked_tags = []
ranked_definitions = sorted(ranked_definitions.items(), reverse=True, key=lambda x: x[1])
ranked_definitions = sorted(
ranked_definitions.items(), reverse=True, key=lambda x: (x[1], x[0])
)
# dump(ranked_definitions)
@@ -451,11 +515,18 @@ class RepoMap:
force_refresh=False,
):
# Create a cache key
cache_key = (
cache_key = [
tuple(sorted(chat_fnames)) if chat_fnames else None,
tuple(sorted(other_fnames)) if other_fnames else None,
max_map_tokens,
)
]
if self.refresh == "auto":
cache_key += [
tuple(sorted(mentioned_fnames)) if mentioned_fnames else None,
tuple(sorted(mentioned_idents)) if mentioned_idents else None,
]
cache_key = tuple(cache_key)
use_cache = False
if not force_refresh:

View File

@@ -0,0 +1,3 @@
# This ensures that importlib_resources.files("aider.resources")
# doesn't raise ImportError, even if there are no other files in this
# dir.

View File

@@ -0,0 +1,11 @@
{
"openrouter/qwen/qwen-2.5-coder-32b-instruct": {
"max_tokens": 33792,
"max_input_tokens": 33792,
"max_output_tokens": 33792,
"input_cost_per_token": 0.00000018,
"output_cost_per_token": 0.00000018,
"litellm_provider": "openrouter",
"mode": "chat",
},
}

View File

@@ -185,7 +185,9 @@ class Scraper:
headers = {"User-Agent": f"Mozilla./5.0 ({aider_user_agent})"}
try:
with httpx.Client(headers=headers, verify=self.verify_ssl) as client:
with httpx.Client(
headers=headers, verify=self.verify_ssl, follow_redirects=True
) as client:
response = client.get(url)
response.raise_for_status()
return response.text, response.headers.get("content-type", "").split(";")[0]

View File

@@ -1,9 +1,9 @@
import hashlib
import json
import backoff
import time
from aider.dump import dump # noqa: F401
from aider.exceptions import LiteLLMExceptions
from aider.llm import litellm
# from diskcache import Cache
@@ -13,37 +13,7 @@ CACHE_PATH = "~/.aider.send.cache.v1"
CACHE = None
# CACHE = Cache(CACHE_PATH)
def retry_exceptions():
import httpx
return (
httpx.ConnectError,
httpx.RemoteProtocolError,
httpx.ReadTimeout,
litellm.exceptions.APIConnectionError,
litellm.exceptions.APIError,
litellm.exceptions.RateLimitError,
litellm.exceptions.ServiceUnavailableError,
litellm.exceptions.Timeout,
litellm.exceptions.InternalServerError,
litellm.llms.anthropic.chat.AnthropicError,
)
def lazy_litellm_retry_decorator(func):
def wrapper(*args, **kwargs):
decorated_func = backoff.on_exception(
backoff.expo,
retry_exceptions(),
max_time=60,
on_backoff=lambda details: print(
f"{details.get('exception', 'Exception')}\nRetry in {details['wait']:.1f} seconds."
),
)(func)
return decorated_func(*args, **kwargs)
return wrapper
RETRY_TIMEOUT = 60
def send_completion(
@@ -52,11 +22,8 @@ def send_completion(
functions,
stream,
temperature=0,
extra_headers=None,
max_tokens=None,
extra_params=None,
):
from aider.llm import litellm
kwargs = dict(
model=model_name,
messages=messages,
@@ -69,10 +36,9 @@ def send_completion(
function = functions[0]
kwargs["tools"] = [dict(type="function", function=function)]
kwargs["tool_choice"] = {"type": "function", "function": {"name": function["name"]}}
if extra_headers is not None:
kwargs["extra_headers"] = extra_headers
if max_tokens is not None:
kwargs["max_tokens"] = max_tokens
if extra_params is not None:
kwargs.update(extra_params)
key = json.dumps(kwargs, sort_keys=True).encode()
@@ -82,8 +48,6 @@ def send_completion(
if not stream and CACHE is not None and key in CACHE:
return hash_object, CACHE[key]
# del kwargs['stream']
res = litellm.completion(**kwargs)
if not stream and CACHE is not None:
@@ -92,19 +56,42 @@ def send_completion(
return hash_object, res
@lazy_litellm_retry_decorator
def simple_send_with_retries(model_name, messages, extra_headers=None):
try:
kwargs = {
"model_name": model_name,
"messages": messages,
"functions": None,
"stream": False,
}
if extra_headers is not None:
kwargs["extra_headers"] = extra_headers
def simple_send_with_retries(model_name, messages, extra_params=None):
litellm_ex = LiteLLMExceptions()
_hash, response = send_completion(**kwargs)
return response.choices[0].message.content
except (AttributeError, litellm.exceptions.BadRequestError):
return
retry_delay = 0.125
while True:
try:
kwargs = {
"model_name": model_name,
"messages": messages,
"functions": None,
"stream": False,
"extra_params": extra_params,
}
_hash, response = send_completion(**kwargs)
if not response or not hasattr(response, "choices") or not response.choices:
return None
return response.choices[0].message.content
except litellm_ex.exceptions_tuple() as err:
ex_info = litellm_ex.get_ex_info(err)
print(str(err))
if ex_info.description:
print(ex_info.description)
should_retry = ex_info.retry
if should_retry:
retry_delay *= 2
if retry_delay > RETRY_TIMEOUT:
should_retry = False
if not should_retry:
return None
print(f"Retrying in {retry_delay:.1f} seconds...")
time.sleep(retry_delay)
continue
except AttributeError:
return None

View File

@@ -8,4 +8,7 @@ model_warnings = "https://aider.chat/docs/llms/warnings.html"
token_limits = "https://aider.chat/docs/troubleshooting/token-limits.html"
llms = "https://aider.chat/docs/llms.html"
large_repos = "https://aider.chat/docs/faq.html#can-i-use-aider-in-a-large-mono-repo"
github_issues = "https://github.com/paul-gauthier/aider/issues/new"
github_issues = "https://github.com/Aider-AI/aider/issues/new"
git_index_version = "https://github.com/Aider-AI/aider/issues/211"
install_properly = "https://aider.chat/docs/troubleshooting/imports.html"
analytics = "https://aider.chat/docs/more/analytics.html"

View File

@@ -216,6 +216,9 @@ def get_pip_install(args):
"-m",
"pip",
"install",
"--upgrade",
"--upgrade-strategy",
"only-if-needed",
]
cmd += args
return cmd
@@ -272,8 +275,12 @@ class Spinner:
self.start_time = time.time()
self.last_update = 0
self.visible = False
self.is_tty = sys.stdout.isatty()
def step(self):
if not self.is_tty:
return
current_time = time.time()
if not self.visible and current_time - self.start_time >= 0.5:
self.visible = True
@@ -289,7 +296,7 @@ class Spinner:
print(f"\r{self.text} {next(self.spinner_chars)}\r{self.text} ", end="", flush=True)
def end(self):
if self.visible:
if self.visible and self.is_tty:
print("\r" + " " * (len(self.text) + 3))
@@ -346,7 +353,7 @@ def check_pip_install_extra(io, module, prompt, pip_install_cmd, self_update=Fal
success, output = run_install(cmd)
if success:
if not module:
return
return True
try:
__import__(module)
return True

View File

@@ -21,7 +21,7 @@ def install_from_main_branch(io):
io,
None,
"Install the development version of aider from the main branch?",
["--upgrade", "git+https://github.com/paul-gauthier/aider.git"],
["git+https://github.com/Aider-AI/aider.git"],
self_update=True,
)
@@ -50,7 +50,7 @@ def install_upgrade(io, latest_version=None):
io,
None,
new_ver_text,
["--upgrade", "aider-chat"],
["aider-chat"],
self_update=True,
)

View File

@@ -3,18 +3,25 @@ import os
import queue
import tempfile
import time
import warnings
from prompt_toolkit.shortcuts import prompt
from aider.llm import litellm
from .dump import dump # noqa: F401
warnings.filterwarnings(
"ignore", message="Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work"
)
from pydub import AudioSegment # noqa
try:
import soundfile as sf
except (OSError, ModuleNotFoundError):
sf = None
from prompt_toolkit.shortcuts import prompt
from .dump import dump # noqa: F401
class SoundDeviceError(Exception):
pass
@@ -27,7 +34,7 @@ class Voice:
threshold = 0.15
def __init__(self):
def __init__(self, audio_format="wav"):
if sf is None:
raise SoundDeviceError
try:
@@ -37,6 +44,9 @@ class Voice:
self.sd = sd
except (OSError, ModuleNotFoundError):
raise SoundDeviceError
if audio_format not in ["wav", "mp3", "webm"]:
raise ValueError(f"Unsupported audio format: {audio_format}")
self.audio_format = audio_format
def callback(self, indata, frames, time, status):
"""This is called (from a separate thread) for each audio block."""
@@ -80,7 +90,7 @@ class Voice:
def raw_record_and_transcribe(self, history, language):
self.q = queue.Queue()
filename = tempfile.mktemp(suffix=".wav")
temp_wav = tempfile.mktemp(suffix=".wav")
try:
sample_rate = int(self.sd.query_devices(None, "input")["default_samplerate"])
@@ -99,10 +109,18 @@ class Voice:
except self.sd.PortAudioError as err:
raise SoundDeviceError(f"Error accessing audio input device: {err}")
with sf.SoundFile(filename, mode="x", samplerate=sample_rate, channels=1) as file:
with sf.SoundFile(temp_wav, mode="x", samplerate=sample_rate, channels=1) as file:
while not self.q.empty():
file.write(self.q.get())
if self.audio_format != "wav":
filename = tempfile.mktemp(suffix=f".{self.audio_format}")
audio = AudioSegment.from_wav(temp_wav)
audio.export(filename, format=self.audio_format)
os.remove(temp_wav)
else:
filename = temp_wav
with open(filename, "rb") as fh:
try:
transcript = litellm.transcription(
@@ -112,6 +130,9 @@ class Voice:
print(f"Unable to transcribe {filename}: {err}")
return
if self.audio_format != "wav":
os.remove(filename)
text = transcript.text
return text

View File

@@ -1,20 +1,140 @@
---
title: Release history
parent: More info
nav_order: 999
nav_order: 900
highlight_image: /assets/blame.jpg
description: Release notes and stats on aider writing its own code.
---
# Release history
{% include blame.md %}
The above
[stats are based on the git commit history](/docs/faq.html#how-are-the-aider-wrote-xx-of-code-stats-computed)
in the aider repo.
<!--[[[cog
# This page is a copy of HISTORY.md, adding the front matter above.
text = open("HISTORY.md").read()
text = text.replace("# Release history", "")
cog.out(text)
]]]-->
# Release history
### Aider v0.63.0
- Support for Qwen 2.5 Coder 32B.
- `/web` command just adds the page to the chat, without triggering an LLM response.
- Improved prompting for the user's preferred chat language.
- Improved handling of LiteLLM exceptions.
- Bugfix for double-counting tokens when reporting cache stats.
- Bugfix for the LLM creating new files.
- Other small bug fixes.
- Aider wrote 55% of the code in this release.
### Aider v0.62.0
- Full support for Claude 3.5 Haiku
- Scored 75% on [aider's code editing leaderboard](https://aider.chat/docs/leaderboards/).
- Almost as good as Sonnet at much lower cost.
- Launch with `--haiku` to use it.
- Easily apply file edits from ChatGPT, Claude or other web apps
- Chat with ChatGPT or Claude via their web app.
- Give it your source files and ask for the changes you want.
- Use the web app's "copy response" button to copy the entire reply from the LLM.
- Run `aider --apply-clipboard-edits file-to-edit.js`.
- Aider will edit your file with the LLM's changes.
- Bugfix for creating new files.
- Aider wrote 84% of the code in this release.
### Aider v0.61.0
- Load and save aider slash-commands to files:
- `/save <fname>` command will make a file of `/add` and `/read-only` commands that recreate the current file context in the chat.
- `/load <fname>` will replay the commands in the file.
- You can use `/load` to run any arbitrary set of slash-commands, not just `/add` and `/read-only`.
- Use `--load <fname>` to run a list of commands on launch, before the interactive chat begins.
- Anonymous, opt-in [analytics](https://aider.chat/docs/more/analytics.html) with no personal data sharing.
- Aider follows litellm's `supports_vision` attribute to enable image support for models.
- Bugfix for when diff mode flexibly handles the model using the wrong filename.
- Displays filenames in sorted order for `/add` and `/read-only`.
- New `--no-fancy-input` switch disables prompt toolkit input, now still available with `--no-pretty`.
- Override browser config with `--no-browser` or `--no-gui`.
- Offer to open documentation URLs when errors occur.
- Properly support all o1 models, regardless of provider.
- Improved layout of filenames above input prompt.
- Better handle corrupted repomap tags cache.
- Improved handling of API errors, especially when accessing the weak model.
- Aider wrote 68% of the code in this release.
### Aider v0.60.1
- Enable image support for Sonnet 10/22.
- Display filenames in sorted order.
### Aider v0.60.0
- Full support for Sonnet 10/22, the new SOTA model on aider's code editing benchmark.
- Aider uses Sonnet 10/22 by default.
- Improved formatting of added and read-only files above chat prompt, by @jbellis.
- Improved support for o1 models by more flexibly parsing their nonconforming code edit replies.
- Corrected diff edit format prompt that only the first match is replaced.
- Stronger whole edit format prompt asking for clean file names.
- Now offers to add `.env` to the `.gitignore` file.
- Ships with a small model metadata json file to handle models not yet updated in litellm.
- Model settings for o1 models on azure.
- Bugfix to properly include URLs in `/help` RAG results.
- Aider wrote 49% of the code in this release.
### Aider v0.59.1
- Check for obsolete `yes: true` in yaml config, show helpful error.
- Model settings for openrouter/anthropic/claude-3.5-sonnet:beta
### Aider v0.59.0
- Improvements to `/read-only`:
- Now supports shell-style auto-complete of the full file system.
- Still auto-completes the full paths of the repo files like `/add`.
- Now supports globs like `src/**/*.py`
- Renamed `--yes` to `--yes-always`.
- Now uses `AIDER_YES_ALWAYS` env var and `yes-always:` yaml key.
- Existing YAML and .env files will need to be updated.
- Can still abbreviate to `--yes` on the command line.
- Config file now uses standard YAML list syntax with ` - list entries`, one per line.
- `/settings` now includes the same announcement lines that would print at launch.
- Sanity checks the `--editor-model` on launch now, same as main and weak models.
- Added `--skip-sanity-check-repo` switch to speedup launch in large repos.
- Bugfix so architect mode handles Control-C properly.
- Repo-map is deterministic now, with improved caching logic.
- Improved commit message prompt.
- Aider wrote 77% of the code in this release.
### Aider v0.58.1
- Fixed bug where cache warming pings caused subsequent user messages to trigger a tight loop of LLM requests.
### Aider v0.58.0
- [Use a pair of Architect/Editor models for improved coding](https://aider.chat/2024/09/26/architect.html)
- Use a strong reasoning model like o1-preview as your Architect.
- Use a cheaper, faster model like gpt-4o as your Editor.
- New `--o1-preview` and `--o1-mini` shortcuts.
- Support for new Gemini 002 models.
- Better support for Qwen 2.5 models.
- Many confirmation questions can be skipped for the rest of the session with "(D)on't ask again" response.
- Autocomplete for `/read-only` supports the entire filesystem.
- New settings for completion menu colors.
- New `/copy` command to copy the last LLM response to the clipboard.
- Renamed `/clipboard` to `/paste`.
- Will now follow HTTP redirects when scraping urls.
- New `--voice-format` switch to send voice audio as wav/mp3/webm, by @mbailey.
- ModelSettings takes `extra_params` dict to specify any extras to pass to `litellm.completion()`.
- Support for cursor shapes when in vim mode.
- Numerous bug fixes.
- Aider wrote 53% of the code in this release.
### Aider v0.57.1
@@ -680,7 +800,7 @@ cog.out(text)
### Aider v0.14.0
- [Support for Claude2 and other LLMs via OpenRouter](https://aider.chat/docs/faq.html#accessing-other-llms-with-openrouter) by @joshuavial
- Documentation for [running the aider benchmarking suite](https://github.com/paul-gauthier/aider/tree/main/benchmark)
- Documentation for [running the aider benchmarking suite](https://github.com/Aider-AI/aider/tree/main/benchmark)
- Aider now requires Python >= 3.9

View File

@@ -24,7 +24,7 @@ exclude:
aux_links:
"GitHub":
- "https://github.com/paul-gauthier/aider"
- "https://github.com/Aider-AI/aider"
"Discord":
- "https://discord.gg/Tv2uQnR88V"
"Blog":
@@ -32,11 +32,11 @@ aux_links:
nav_external_links:
- title: "GitHub"
url: "https://github.com/paul-gauthier/aider"
url: "https://github.com/Aider-AI/aider"
- title: "Discord"
url: "https://discord.gg/Tv2uQnR88V"
repository: paul-gauthier/aider
repository: Aider-AI/aider
callouts:
tip:

View File

@@ -0,0 +1,492 @@
- dirname: 2024-09-25-21-17-19--architect-sonnet-sonnet-diff
test_cases: 133
model: claude-3.5-sonnet
editor_model: claude-3.5-sonnet
editor_edit_format: diff
edit_format: architect
commit_hash: c18d6a8-dirty
pass_rate_1: 62.4
pass_rate_2: 80.5
percent_cases_well_formed: 100.0
error_outputs: 3
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 183
lazy_comments: 6
syntax_errors: 9
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model openrouter/anthropic/claude-3.5-sonnet
date: 2024-09-25
versions: 0.57.2.dev
seconds_per_case: 25.1
total_cost: 4.9502
- dirname: 2024-07-04-14-32-08--claude-3.5-sonnet-diff-continue
test_cases: 133
model: claude-3.5-sonnet
edit_format: diff
commit_hash: 35f21b5
pass_rate_1: 57.1
pass_rate_2: 77.4
percent_cases_well_formed: 99.2
error_outputs: 23
released: 2024-06-20
num_malformed_responses: 4
num_with_malformed_responses: 1
user_asks: 2
lazy_comments: 0
syntax_errors: 1
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --sonnet
date: 2024-07-04
versions: 0.42.1-dev
seconds_per_case: 17.6
total_cost: 3.6346
- dirname: 2024-09-25-21-25-01--architect-o1mini-4o-jr-diff
test_cases: 133
model: o1-mini
editor_model: gpt-4o
editor_edit_format: diff
edit_format: architect
commit_hash: 3f682ed-dirty, 25e833b
pass_rate_1: 51.1
pass_rate_2: 70.7
percent_cases_well_formed: 100.0
error_outputs: 12
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 214
lazy_comments: 6
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model o1-mini
date: 2024-09-25
versions: 0.57.2.dev
seconds_per_case: 23.7
total_cost: 9.3158
- dirname: 2024-09-26-15-05-58--architect-o1mini-deep-jr-whole
test_cases: 133
model: o1-mini
edit_format: architect
commit_hash: 1676653-dirty
editor_model: deepseek
editor_edit_format: whole
pass_rate_1: 51.9
pass_rate_2: 71.4
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 199
lazy_comments: 11
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model o1-mini
date: 2024-09-26
versions: 0.57.2.dev
seconds_per_case: 48.2
total_cost: 5.6069
- dirname: 2024-09-25-21-33-40--architect-4o-4o-jr-diff
test_cases: 133
model: gpt-4o
editor_model: gpt-4o
editor_edit_format: diff
edit_format: architect
commit_hash: 9f3cd92
pass_rate_1: 56.4
pass_rate_2: 75.2
percent_cases_well_formed: 100.0
error_outputs: 13
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 207
lazy_comments: 8
syntax_errors: 1
indentation_errors: 1
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model gpt-4o
date: 2024-09-25
versions: 0.57.2.dev
seconds_per_case: 18.2
total_cost: 6.0918
- dirname: 2024-09-21-16-45-11--o1-preview-flex-sr-markers
test_cases: 133
model: o1-preview
edit_format: diff
commit_hash: 5493654-dirty
pass_rate_1: 57.9
pass_rate_2: 79.7
percent_cases_well_formed: 93.2
error_outputs: 11
num_malformed_responses: 11
num_with_malformed_responses: 9
user_asks: 3
lazy_comments: 0
syntax_errors: 10
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model o1-preview
date: 2024-09-21
versions: 0.56.1.dev
seconds_per_case: 80.9
total_cost: 63.9190
- dirname: 2024-09-25-21-39-05--architect-o1preview-4o-jr-diff
test_cases: 133
model: o1-preview
editor_model: gpt-4o
editor_edit_format: diff
edit_format: architect
commit_hash: 9f3cd92
pass_rate_1: 63.2
pass_rate_2: 80.5
percent_cases_well_formed: 100.0
error_outputs: 23
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 191
lazy_comments: 2
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 4
command: aider --model o1-preview
date: 2024-09-25
versions: 0.57.2.dev
seconds_per_case: 42.3
total_cost: 39.3766
- dirname: 2024-09-25-21-52-42--architect-o1preview-sonnet-jr-diff
test_cases: 133
model: o1-preview
editor_model: claude-3.5-sonnet
editor_edit_format: diff
edit_format: architect
commit_hash: 9f3cd92
editor_model: claude-3-5-sonnet
pass_rate_1: 60.9
pass_rate_2: 82.7
percent_cases_well_formed: 100.0
error_outputs: 1
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 180
lazy_comments: 3
syntax_errors: 9
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model o1-preview
date: 2024-09-25
versions: 0.57.2.dev
seconds_per_case: 44.9
total_cost: 37.6192
- dirname: 2024-09-21-16-40-56--o1-mini-flex-sr-markers
test_cases: 36
model: o1-mini
edit_format: diff
commit_hash: 5493654
pass_rate_1: 50.0
pass_rate_2: 61.1
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 3
lazy_comments: 0
syntax_errors: 0
indentation_errors: 1
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model o1-mini
date: 2024-09-21
versions: 0.56.1.dev
seconds_per_case: 26.7
total_cost: 2.4226
- dirname: 2024-09-25-23-12-14--architect-o1mini-deep-jr-diff
test_cases: 133
model: o1-mini
edit_format: architect
commit_hash: 9f3cd92-dirty
editor_model: deepseek
editor_edit_format: diff
pass_rate_1: 48.9
pass_rate_2: 69.2
percent_cases_well_formed: 100.0
error_outputs: 1
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 202
lazy_comments: 12
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model o1-mini
date: 2024-09-25
versions: 0.57.2.dev
seconds_per_case: 52.2
total_cost: 5.7927
- dirname: 2024-09-25-23-18-16--architect-o1preview-deep-jr-diff
test_cases: 133
model: o1-preview
edit_format: architect
commit_hash: 9f3cd92-dirty
editor_model: deepseek
editor_edit_format: diff
pass_rate_1: 64.7
pass_rate_2: 80.5
percent_cases_well_formed: 100.0
error_outputs: 5
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 180
lazy_comments: 2
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model o1-preview
date: 2024-09-25
versions: 0.57.2.dev
seconds_per_case: 73.2
total_cost: 35.7887
- dirname: 2024-09-25-23-30-36--architect-o1preview-deep-jr-whole
test_cases: 133
model: o1-preview
edit_format: architect
commit_hash: 9f3cd92-dirty
editor_model: deepseek
editor_edit_format: whole
pass_rate_1: 63.9
pass_rate_2: 85.0
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 181
lazy_comments: 12
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model o1-preview
date: 2024-09-25
versions: 0.57.2.dev
seconds_per_case: 67.4
total_cost: 35.3152
- dirname: 2024-09-26-15-15-17--architect-sonnet-deep-jr-whole
test_cases: 133
model: claude-3.5-sonnet
edit_format: architect
commit_hash: bc1559f-dirty
editor_model: deepseek
editor_edit_format: whole
pass_rate_1: 61.7
pass_rate_2: 78.9
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 184
lazy_comments: 5
syntax_errors: 9
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model openrouter/anthropic/claude-3.5-sonnet
date: 2024-09-26
versions: 0.57.2.dev
seconds_per_case: 37.2
total_cost: 2.1510
- dirname: 2024-09-26-15-33-28--costs-gpt4o-diff
test_cases: 133
model: gpt-4o
edit_format: diff
commit_hash: 89aa385-dirty
pass_rate_1: 55.6
pass_rate_2: 71.4
percent_cases_well_formed: 97.7
error_outputs: 5
num_malformed_responses: 5
num_with_malformed_responses: 3
user_asks: 10
lazy_comments: 0
syntax_errors: 0
indentation_errors: 1
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model gpt-4o
date: 2024-09-26
versions: 0.57.2.dev
seconds_per_case: 9.7
total_cost: 3.8088
- dirname: 2024-09-26-15-41-08--architect-4o-deep-jr-whole
test_cases: 133
model: gpt-4o
edit_format: architect
commit_hash: 89aa385-dirty
editor_model: deepseek
editor_edit_format: whole
pass_rate_1: 60.9
pass_rate_2: 73.7
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 187
lazy_comments: 12
syntax_errors: 5
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model gpt-4o
date: 2024-09-26
versions: 0.57.2.dev
seconds_per_case: 38.0
total_cost: 2.4737
- dirname: 2024-09-26-15-54-08--architect-4o-deep-jr-diff
test_cases: 133
model: gpt-4o
edit_format: architect
commit_hash: 89aa385-dirty
editor_model: deepseek
editor_edit_format: diff
pass_rate_1: 57.1
pass_rate_2: 74.4
percent_cases_well_formed: 100.0
error_outputs: 4
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 192
lazy_comments: 6
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model gpt-4o
date: 2024-09-26
versions: 0.57.2.dev
seconds_per_case: 44.0
total_cost: 2.5498
- dirname: 2024-09-26-16-06-39--architect-sonnet-deep-jr-diff
test_cases: 133
model: claude-3.5-sonnet
edit_format: architect
commit_hash: 89aa385-dirty
editor_model: deepseek
editor_edit_format: diff
pass_rate_1: 61.7
pass_rate_2: 78.9
percent_cases_well_formed: 100.0
error_outputs: 2
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 184
lazy_comments: 2
syntax_errors: 9
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model openrouter/anthropic/claude-3.5-sonnet
date: 2024-09-26
versions: 0.57.2.dev
seconds_per_case: 43.2
total_cost: 2.1488
- dirname: 2024-09-27-18-15-32--architect-4omini-4omini
test_cases: 133
model: gpt-4o-mini
edit_format: architect
commit_hash: 0bd8058-dirty
editor_model: gpt-4o-mini
editor_edit_format: whole
pass_rate_1: 43.6
pass_rate_2: 60.2
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 208
lazy_comments: 2
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model gpt-4o-mini
date: 2024-09-27
versions: 0.57.2.dev
seconds_per_case: 21.0
total_cost: 0.1527
- dirname: 2024-07-18-18-57-46--gpt-4o-mini-whole
test_cases: 133
model: gpt-4o-mini
edit_format: whole
commit_hash: d31eef3-dirty
pass_rate_1: 40.6
pass_rate_2: 55.6
released: 2024-07-18
percent_cases_well_formed: 100.0
error_outputs: 1
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 1
lazy_comments: 0
syntax_errors: 1
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model gpt-4o-mini
date: 2024-07-18
versions: 0.44.1-dev
seconds_per_case: 7.8
total_cost: 0.0916
- dirname: 2024-09-29-22-35-36--architect-o1preview-o1mini-whole
test_cases: 133
model: o1-preview
edit_format: architect
commit_hash: 53ca83b
editor_model: o1-mini
editor_edit_format: whole
pass_rate_1: 65.4
pass_rate_2: 85.0
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 179
lazy_comments: 4
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model o1-preview
date: 2024-09-29
versions: 0.58.1.dev
seconds_per_case: 39.7
total_cost: 36.2078

View File

@@ -2600,3 +2600,382 @@
Paul Gauthier (aider): 381
start_tag: v0.56.0
total_lines: 563
- aider_percentage: 53.45
aider_total: 712
end_date: '2024-09-29'
end_tag: v0.58.0
file_counts:
.github/workflows/docker-build-test.yml:
Paul Gauthier: 1
Paul Gauthier (aider): 11
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Paul Gauthier: 8
Paul Gauthier (aider): 109
Stein Martin Hustad: 17
fry69: 2
aider/coders/__init__.py:
Paul Gauthier: 6
Paul Gauthier (aider): 2
aider/coders/architect_coder.py:
Paul Gauthier: 40
Paul Gauthier (aider): 3
aider/coders/base_coder.py:
Jonathan Ellis: 1
Paul Gauthier: 32
Paul Gauthier (aider): 8
aider/coders/editor_editblock_coder.py:
Paul Gauthier: 6
Paul Gauthier (aider): 1
aider/coders/editor_whole_coder.py:
Paul Gauthier: 7
aider/coders/wholefile_coder.py:
Paul Gauthier: 2
aider/commands.py:
Jonathan Ellis: 1
Mike Bailey: 1
Paul Gauthier: 20
Paul Gauthier (aider): 78
fry69: 2
aider/help.py:
Paul Gauthier: 27
Paul Gauthier (aider): 7
aider/history.py:
Paul Gauthier: 1
aider/io.py:
Paul Gauthier: 39
Paul Gauthier (aider): 62
Stein Martin Hustad: 5
fry69: 10
aider/linter.py:
Paul Gauthier: 6
aider/main.py:
Paul Gauthier: 13
Paul Gauthier (aider): 6
Stein Martin Hustad: 4
fry69: 1
rti: 1
aider/models.py:
Paul Gauthier: 58
Paul Gauthier (aider): 85
aider/repo.py:
Paul Gauthier: 16
Paul Gauthier (aider): 2
aider/repomap.py:
Paul Gauthier: 5
aider/scrape.py:
Paul Gauthier (aider): 3
aider/sendchat.py:
Paul Gauthier: 1
Paul Gauthier (aider): 5
aider/utils.py:
Paul Gauthier: 4
aider/versioncheck.py:
Paul Gauthier: 2
aider/voice.py:
Mike Bailey: 17
Paul Gauthier: 2
Paul Gauthier (aider): 10
benchmark/benchmark.py:
Paul Gauthier: 25
Paul Gauthier (aider): 29
fry69: 3
scripts/issues.py:
Paul Gauthier: 5
Paul Gauthier (aider): 45
scripts/update-docs.sh:
Paul Gauthier: 1
scripts/yank-old-versions.py:
Paul Gauthier (aider): 51
tests/basic/test_commands.py:
Paul Gauthier: 2
Paul Gauthier (aider): 98
tests/basic/test_io.py:
Paul Gauthier: 2
Paul Gauthier (aider): 97
tests/basic/test_main.py:
Paul Gauthier: 2
tests/basic/test_models.py:
Paul Gauthier: 4
tests/basic/test_sanity_check_repo.py:
fry69: 179
tests/basic/test_wholefile.py:
Paul Gauthier: 38
grand_total:
Jonathan Ellis: 2
Mike Bailey: 18
Paul Gauthier: 376
Paul Gauthier (aider): 712
Stein Martin Hustad: 26
fry69: 197
rti: 1
start_tag: v0.57.0
total_lines: 1332
- aider_percentage: 76.79
aider_total: 172
end_date: '2024-10-04'
end_tag: v0.59.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Paul Gauthier: 2
Paul Gauthier (aider): 6
aider/args_formatter.py:
Paul Gauthier: 4
aider/coders/architect_coder.py:
Paul Gauthier: 1
aider/coders/base_coder.py:
Paul Gauthier: 6
aider/coders/editblock_coder.py:
Paul Gauthier: 1
aider/commands.py:
Paul Gauthier: 3
Paul Gauthier (aider): 49
aider/gui.py:
Paul Gauthier: 2
aider/main.py:
Paul Gauthier: 10
Paul Gauthier (aider): 4
aider/models.py:
Paul Gauthier (aider): 12
aider/repomap.py:
Paul Gauthier: 9
Paul Gauthier (aider): 3
aider/urls.py:
Paul Gauthier: 2
aider/versioncheck.py:
Paul Gauthier: 1
scripts/issues.py:
Paul Gauthier: 1
scripts/update-docs.sh:
Paul Gauthier: 2
tests/basic/test_commands.py:
Paul Gauthier: 4
Paul Gauthier (aider): 80
tests/basic/test_models.py:
Paul Gauthier: 1
Paul Gauthier (aider): 18
tests/basic/test_sanity_check_repo.py:
Paul Gauthier: 1
tests/help/test_help.py:
Paul Gauthier: 1
grand_total:
Paul Gauthier: 52
Paul Gauthier (aider): 172
start_tag: v0.58.0
total_lines: 224
- aider_percentage: 49.12
aider_total: 140
end_date: '2024-10-22'
end_tag: v0.60.0
file_counts:
.github/workflows/close-stale.yml:
Paul Gauthier: 5
Paul Gauthier (aider): 19
.github/workflows/pages.yml:
Paul Gauthier: 3
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Paul Gauthier: 1
fry69: 2
aider/coders/base_coder.py:
Paul Gauthier: 2
aider/coders/editblock_coder.py:
Paul Gauthier (aider): 3
aider/commands.py:
Paul Gauthier: 1
aider/help.py:
Paul Gauthier: 1
Paul Gauthier (aider): 33
aider/io.py:
Jonathan Ellis: 10
Paul Gauthier: 7
aider/main.py:
Paul Gauthier: 20
Paul Gauthier (aider): 39
aider/models.py:
Paul Gauthier: 18
Sven Grunewaldt: 24
fry69: 16
aider/resources/__init__.py:
Paul Gauthier: 3
aider/sendchat.py:
Paul Gauthier: 3
tests/basic/test_editblock.py:
Paul Gauthier: 23
tests/basic/test_main.py:
Paul Gauthier: 1
tests/help/test_help.py:
Paul Gauthier: 4
Paul Gauthier (aider): 46
grand_total:
Jonathan Ellis: 10
Paul Gauthier: 93
Paul Gauthier (aider): 140
Sven Grunewaldt: 24
fry69: 18
start_tag: v0.59.0
total_lines: 285
- aider_percentage: 67.61
aider_total: 860
end_date: '2024-11-01'
end_tag: v0.61.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/analytics.py:
Paul Gauthier: 75
Paul Gauthier (aider): 89
aider/args.py:
Paul Gauthier: 5
Paul Gauthier (aider): 29
aider/coders/base_coder.py:
Paul Gauthier: 56
Paul Gauthier (aider): 43
aider/coders/editblock_coder.py:
Paul Gauthier: 14
aider/commands.py:
Paul Gauthier: 14
Paul Gauthier (aider): 86
aider/io.py:
Paul Gauthier: 12
Paul Gauthier (aider): 32
aider/linter.py:
Paul Gauthier: 6
aider/main.py:
Paul Gauthier: 48
Paul Gauthier (aider): 10
aider/models.py:
Paul Gauthier: 54
Paul Gauthier (aider): 63
kAIto47802: 4
aider/repomap.py:
Paul Gauthier: 12
Paul Gauthier (aider): 52
aider/sendchat.py:
Paul Gauthier: 23
Paul Gauthier (aider): 23
aider/urls.py:
Paul Gauthier: 2
aider/utils.py:
Paul Gauthier (aider): 6
scripts/issues.py:
Paul Gauthier (aider): 13
scripts/pip-compile.sh:
Paul Gauthier (aider): 13
scripts/update-docs.sh:
Paul Gauthier: 1
Paul Gauthier (aider): 5
tests/basic/test_analytics.py:
Paul Gauthier: 1
Paul Gauthier (aider): 99
tests/basic/test_commands.py:
Konstantin L: 34
Paul Gauthier: 45
Paul Gauthier (aider): 267
tests/basic/test_io.py:
Paul Gauthier: 2
Paul Gauthier (aider): 4
tests/basic/test_main.py:
Paul Gauthier (aider): 3
tests/basic/test_models.py:
Paul Gauthier: 3
Paul Gauthier (aider): 9
tests/basic/test_sanity_check_repo.py:
Paul Gauthier (aider): 6
tests/basic/test_sendchat.py:
Paul Gauthier (aider): 8
grand_total:
Konstantin L: 34
Paul Gauthier: 374
Paul Gauthier (aider): 860
kAIto47802: 4
start_tag: v0.60.0
total_lines: 1272
- aider_percentage: 84.0
aider_total: 63
end_date: '2024-11-04'
end_tag: v0.62.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Paul Gauthier (aider): 14
aider/coders/editblock_coder.py:
Paul Gauthier: 6
aider/main.py:
Paul Gauthier (aider): 4
aider/models.py:
Paul Gauthier: 5
Paul Gauthier (aider): 45
grand_total:
Paul Gauthier: 12
Paul Gauthier (aider): 63
start_tag: v0.61.0
total_lines: 75
- aider_percentage: 55.16
aider_total: 385
end_date: '2024-11-13'
end_tag: v0.63.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/coders/architect_coder.py:
Paul Gauthier: 3
aider/coders/base_coder.py:
Paul Gauthier: 42
Paul Gauthier (aider): 1
aider/coders/editblock_coder.py:
Paul Gauthier: 4
aider/commands.py:
Paul Gauthier: 13
aider/exceptions.py:
Paul Gauthier: 72
Paul Gauthier (aider): 4
aider/io.py:
Paul Gauthier: 3
Paul Gauthier (aider): 23
aider/main.py:
Paul Gauthier: 9
Paul Gauthier (aider): 9
aider/models.py:
Logan Attwood: 29
Paul Gauthier: 50
Paul Gauthier (aider): 7
aider/repo.py:
Paul Gauthier: 7
aider/repomap.py:
Paul Gauthier: 4
aider/sendchat.py:
Paul Gauthier: 17
Paul Gauthier (aider): 4
scripts/issues.py:
Paul Gauthier: 4
Paul Gauthier (aider): 195
tests/basic/test_coder.py:
Paul Gauthier: 2
tests/basic/test_commands.py:
Paul Gauthier (aider): 20
tests/basic/test_editblock.py:
Paul Gauthier: 41
tests/basic/test_exceptions.py:
Paul Gauthier (aider): 65
tests/basic/test_main.py:
Paul Gauthier: 1
tests/basic/test_sanity_check_repo.py:
Paul Gauthier: 2
Paul Gauthier (aider): 2
tests/basic/test_sendchat.py:
Paul Gauthier: 8
Paul Gauthier (aider): 55
tests/scrape/test_scrape.py:
Paul Gauthier: 1
grand_total:
Logan Attwood: 29
Paul Gauthier: 284
Paul Gauthier (aider): 385
start_tag: v0.62.0
total_lines: 698

View File

@@ -20,7 +20,7 @@
versions: 0.30.2-dev
seconds_per_case: 32.4
total_cost: 13.8395
- dirname: 2024-03-06-16-42-00--claude3-sonnet-whole
test_cases: 133
model: claude-3-sonnet-20240229
@@ -43,7 +43,7 @@
versions: 0.25.1-dev
seconds_per_case: 23.1
total_cost: 0.0000
- dirname: 2024-05-03-20-47-24--gemini-1.5-pro-diff-fenced
test_cases: 133
model: gemini-1.5-pro-latest
@@ -88,7 +88,7 @@
versions: 0.33.1-dev
seconds_per_case: 6.5
total_cost: 0.5032
- dirname: 2023-11-06-21-23-59--gpt-3.5-turbo-0301
test_cases: 133
model: gpt-3.5-turbo-0301
@@ -111,7 +111,7 @@
versions: 0.16.4-dev
seconds_per_case: 6.5
total_cost: 0.4822
- dirname: 2023-11-07-02-41-07--gpt-3.5-turbo-0613
test_cases: 133
model: gpt-3.5-turbo-0613
@@ -155,7 +155,7 @@
versions: 0.30.2-dev
seconds_per_case: 5.3
total_cost: 0.3261
- dirname: 2024-01-25-23-37-15--jan-exercism-gpt-4-0125-preview-udiff
test_cases: 133
model: gpt-4-0125-preview
@@ -178,7 +178,7 @@
versions: 0.22.1-dev
seconds_per_case: 44.8
total_cost: 14.6428
- dirname: 2024-05-04-15-07-30--redo-gpt-4-0314-diff-reminder-rules
test_cases: 133
model: gpt-4-0314
@@ -201,7 +201,7 @@
versions: 0.31.2-dev
seconds_per_case: 19.8
total_cost: 16.2689
- dirname: 2023-12-16-21-24-28--editblock-gpt-4-0613-actual-main
test_cases: 133
model: gpt-4-0613
@@ -228,7 +228,7 @@
- dirname: 2024-05-08-21-16-03--may-gpt-4-1106-preview-udiff
test_cases: 133
model: gpt-4-1106-preview
released: 2023-11-06
released: 2023-11-06
edit_format: udiff
commit_hash: 87664dc
pass_rate_1: 51.9
@@ -247,7 +247,7 @@
versions: 0.33.1-dev
seconds_per_case: 20.4
total_cost: 6.6061
- dirname: 2024-05-01-02-09-20--gpt-4-turbo-examples
test_cases: 133
model: gpt-4-turbo-2024-04-09 (udiff)
@@ -270,7 +270,7 @@
versions: 0.30.2-dev
seconds_per_case: 22.8
total_cost: 6.3337
- dirname: 2024-05-03-22-24-48--openrouter--llama3-diff-examples-sys-msg
test_cases: 132
model: llama3-70b-8192
@@ -293,7 +293,7 @@
versions: 0.31.2-dev
seconds_per_case: 14.5
total_cost: 0.4311
- dirname: 2024-05-06-18-31-08--command-r-plus-whole-final
test_cases: 133
model: command-r-plus
@@ -316,11 +316,11 @@
versions: 0.31.2-dev
seconds_per_case: 22.9
total_cost: 2.7494
- dirname: 2024-05-07-20-32-37--qwen1.5-110b-chat-whole
test_cases: 133
model: qwen1.5-110b-chat
released: 2024-02-04
released: 2024-02-04
edit_format: whole
commit_hash: 70b1c0c
pass_rate_1: 30.8
@@ -339,7 +339,7 @@
versions: 0.31.2-dev
seconds_per_case: 46.9
total_cost: 0.0000
- dirname: 2024-05-07-20-57-04--wizardlm-2-8x22b-whole
test_cases: 133
model: WizardLM-2 8x22B
@@ -547,7 +547,7 @@
- dirname: 2024-07-04-14-32-08--claude-3.5-sonnet-diff-continue
test_cases: 133
model: claude-3.5-sonnet
model: claude-3.5-sonnet-20240620
edit_format: diff
commit_hash: 35f21b5
pass_rate_1: 57.1
@@ -563,12 +563,12 @@
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --sonnet
command: aider --model claude-3.5-sonnet-20240620
date: 2024-07-04
versions: 0.42.1-dev
seconds_per_case: 17.6
total_cost: 3.6346
- dirname: 2024-07-01-21-41-48--haiku-whole
test_cases: 133
model: claude-3-haiku-20240307
@@ -832,30 +832,6 @@
seconds_per_case: 6.5
total_cost: 0.0000
- dirname: 2024-08-14-13-07-12--chatgpt-4o-latest-diff
test_cases: 133
model: chatgpt-4o-latest
edit_format: diff
commit_hash: b1c3769
pass_rate_1: 53.4
pass_rate_2: 69.2
percent_cases_well_formed: 97.7
error_outputs: 27
num_malformed_responses: 5
num_with_malformed_responses: 3
user_asks: 7
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model openai/chatgpt-4o-latest
date: 2024-08-14
released: 2024-08-08
versions: 0.50.2-dev
seconds_per_case: 26.3
total_cost: 3.6113
- dirname: 2024-08-28-07-10-50--gemini-1.5-pro-exp-0827-diff-fenced
test_cases: 133
model: gemini-1.5-pro-exp-0827
@@ -1110,28 +1086,28 @@
seconds_per_case: 103.0
total_cost: 5.3725
- dirname: 2024-09-12-20-56-22--o1-mini-diff
test_cases: 133
model: o1-mini (diff)
- dirname: 2024-09-21-16-40-56--o1-mini-flex-sr-markers
test_cases: 36
model: o1-mini
edit_format: diff
commit_hash: 4598a37-dirty, 291b456, 752e823-dirty
pass_rate_1: 45.1
pass_rate_2: 62.4
percent_cases_well_formed: 85.7
error_outputs: 26
num_malformed_responses: 26
num_with_malformed_responses: 19
user_asks: 2
commit_hash: 5493654
pass_rate_1: 50.0
pass_rate_2: 61.1
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 3
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
indentation_errors: 1
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model o1-mini --edit-format diff
date: 2024-09-12
test_timeouts: 0
command: aider --model o1-mini
date: 2024-09-21
versions: 0.56.1.dev
seconds_per_case: 177.7
total_cost: 11.1071
seconds_per_case: 26.7
total_cost: 2.4226
- dirname: 2024-09-21-16-45-11--o1-preview-flex-sr-markers
test_cases: 133
@@ -1155,7 +1131,7 @@
versions: 0.56.1.dev
seconds_per_case: 80.9
total_cost: 63.9190
- dirname: 2024-09-19-16-58-29--qwen2.5-coder:7b-instruct-q8_0
test_cases: 133
model: qwen2.5-coder:7b-instruct-q8_0
@@ -1178,7 +1154,7 @@
versions: 0.56.0
seconds_per_case: 9.3
total_cost: 0.0000
- dirname: 2024-09-20-20-20-19--qwen-2.5-72b-instruct-diff
test_cases: 133
model: qwen-2.5-72b-instruct (bf16)
@@ -1200,4 +1176,645 @@
date: 2024-09-20
versions: 0.56.1.dev
seconds_per_case: 39.8
total_cost: 0.0000
total_cost: 0.0000
- dirname: 2024-09-21-11-56-43--Codestral-22B-v0.1-Q4_K_M.gguf_whole
test_cases: 133
model: Codestral-22B-v0.1-Q4_K_M
edit_format: whole
commit_hash: 2753ac6-dirty
pass_rate_1: 36.1
pass_rate_2: 48.1
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 8
lazy_comments: 6
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 4
command: aider --model Codestral-22B-v0.1-Q4_K_M
date: 2024-09-21
versions: 0.56.1.dev
seconds_per_case: 656.4
total_cost: 0.9108
- dirname: 2024-09-24-16-26-45--gemini-1.5-pro-002-diff-fenced
test_cases: 133
model: gemini-1.5-pro-002
edit_format: diff-fenced
commit_hash: 6b5fe9b, 3edcd71
pass_rate_1: 49.6
pass_rate_2: 65.4
percent_cases_well_formed: 96.2
error_outputs: 17
num_malformed_responses: 17
num_with_malformed_responses: 5
user_asks: 3
lazy_comments: 0
syntax_errors: 2
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 4
command: aider --model gemini/gemini-1.5-pro-002
date: 2024-09-24
versions: 0.57.2.dev
seconds_per_case: 11.6
total_cost: 2.8166
- dirname: 2024-09-24-16-33-23--gemini-1.5-flash-002-whole
test_cases: 133
model: gemini-1.5-flash-002
edit_format: whole
commit_hash: 3edcd71
pass_rate_1: 37.6
pass_rate_2: 51.1
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 3
lazy_comments: 0
syntax_errors: 1
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model gemini/gemini-1.5-flash-002
date: 2024-09-24
versions: 0.57.2.dev
seconds_per_case: 5.1
total_cost: 0.0515
- dirname: 2024-09-24-15-18-59--gemini-1.5-flash-8b-exp-0924-whole
test_cases: 133
model: gemini-1.5-flash-8b-exp-0924
edit_format: whole
commit_hash: 86faaa6
pass_rate_1: 33.1
pass_rate_2: 38.3
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 9
lazy_comments: 6
syntax_errors: 8
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model gemini/gemini-1.5-flash-8b-exp-0924
date: 2024-09-24
versions: 0.57.2.dev
seconds_per_case: 6.6
total_cost: 0.0000
- dirname: 2024-09-28-18-30-20--codestral-whole
test_cases: 133
model: ollama/codestral
edit_format: whole
commit_hash: 1971285-dirty
pass_rate_1: 33.8
pass_rate_2: 45.9
percent_cases_well_formed: 98.5
error_outputs: 8
num_malformed_responses: 8
num_with_malformed_responses: 2
user_asks: 12
lazy_comments: 6
syntax_errors: 5
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 4
command: aider --model ollama/codestral
date: 2024-09-28
versions: 0.57.2.dev
seconds_per_case: 67.2
total_cost: 0.0000
- dirname: 2024-09-29-17-51-11--codegeex4-whole-2
test_cases: 133
model: ollama/codegeex4
edit_format: whole
commit_hash: 228ae24
pass_rate_1: 28.6
pass_rate_2: 32.3
percent_cases_well_formed: 97.0
error_outputs: 20
num_malformed_responses: 20
num_with_malformed_responses: 4
user_asks: 56
lazy_comments: 5
syntax_errors: 5
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 4
command: aider --model ollama/codegeex4
date: 2024-09-29
versions: 0.57.2.dev
seconds_per_case: 128.1
total_cost: 0.0000
- dirname: 2024-09-30-00-09-00--wojtek-opencodeinterpreter-6.7b-whole-2
test_cases: 133
model: ollama/wojtek/opencodeinterpreter:6.7b
edit_format: whole
commit_hash: 6d586fd
pass_rate_1: 26.3
pass_rate_2: 30.1
percent_cases_well_formed: 91.0
error_outputs: 18
num_malformed_responses: 18
num_with_malformed_responses: 12
user_asks: 79
lazy_comments: 7
syntax_errors: 0
indentation_errors: 1
exhausted_context_windows: 0
test_timeouts: 6
command: aider --model ollama/wojtek/opencodeinterpreter:6.7b
date: 2024-09-30
versions: 0.58.1.dev
seconds_per_case: 59.3
total_cost: 0.0000
- dirname: 2024-09-30-03-49-01--mistral-nemo-12b-instruct-2407-q4_K_M-whole-1
test_cases: 133
model: ollama/mistral-nemo:12b-instruct-2407-q4_K_M
edit_format: whole
commit_hash: ba4dec8
pass_rate_1: 22.6
pass_rate_2: 33.1
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 53
lazy_comments: 37
syntax_errors: 2
indentation_errors: 2
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model ollama/mistral-nemo:12b-instruct-2407-q4_K_M
date: 2024-09-30
versions: 0.58.1.dev
seconds_per_case: 34.7
total_cost: 0.0000
- dirname: 2024-09-30-14-09-43--qwen2.5-32b-whole-2
test_cases: 133
model: ollama/qwen2.5:32b
edit_format: whole
commit_hash: 765c4cb
pass_rate_1: 44.4
pass_rate_2: 54.1
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 9
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model ollama/qwen2.5:32b
date: 2024-09-30
versions: 0.58.1.dev
seconds_per_case: 134.9
total_cost: 0.0000
- dirname: 2024-09-30-19-35-40--llama3.2-3b-instruct-fp16-whole-1
test_cases: 133
model: ollama/llama3.2:3b-instruct-fp16
edit_format: whole
commit_hash: 3f12290
pass_rate_1: 20.3
pass_rate_2: 26.3
percent_cases_well_formed: 97.0
error_outputs: 21
num_malformed_responses: 21
num_with_malformed_responses: 4
user_asks: 73
lazy_comments: 11
syntax_errors: 1
indentation_errors: 3
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model ollama/llama3.2:3b-instruct-fp16
date: 2024-09-30
versions: 0.58.1.dev
seconds_per_case: 66.6
total_cost: 0.0000
- dirname: 2024-09-30-23-01-24--hermes3-8b-llama3.1-fp16-whole-2
test_cases: 133
model: ollama/hermes3:8b-llama3.1-fp16
edit_format: whole
commit_hash: c5ba4f7
pass_rate_1: 24.1
pass_rate_2: 30.1
percent_cases_well_formed: 98.5
syntax_errors: 0
exhausted_context_windows: 0
command: aider --model ollama/hermes3:8b-llama3.1-fp16
date: 2024-09-30
versions: 0.58.1.dev
seconds_per_case: 64.7
total_cost: 0.0000
- dirname: 2024-10-01-02-33-11--mistral-small-whole-1
test_cases: 133
model: ollama/mistral-small
edit_format: whole
commit_hash: 8a908fa
pass_rate_1: 30.1
pass_rate_2: 38.3
percent_cases_well_formed: 99.2
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
command: aider --model ollama/mistral-small
date: 2024-10-01
versions: 0.58.1.dev
seconds_per_case: 84.6
total_cost: 0.0000
- dirname: 2024-10-01-07-05-40--yi-coder-9b-chat-fp16-whole-1
test_cases: 133
model: ollama/yi-coder:9b-chat-fp16
edit_format: whole
commit_hash: 52c6632-dirty
pass_rate_1: 39.8
pass_rate_2: 43.6
percent_cases_well_formed: 99.2
lazy_comments: 0
indentation_errors: 0
exhausted_context_windows: 0
command: aider --model ollama/yi-coder:9b-chat-fp16
date: 2024-10-01
versions: 0.58.1.dev
seconds_per_case: 63.7
total_cost: 0.0000
- dirname: 2024-10-01-16-50-09--hermes3-whole-4
test_cases: 133
model: ollama/hermes3
edit_format: whole
commit_hash: 415e898
pass_rate_1: 21.1
pass_rate_2: 22.6
percent_cases_well_formed: 98.5
exhausted_context_windows: 0
command: aider --model ollama/hermes3
date: 2024-10-01
versions: 0.58.1.dev
seconds_per_case: 24.8
total_cost: 0.0000
- dirname: 2024-10-04-16-30-08--chatgpt-4o-latest-diff-oct4
test_cases: 133
model: openai/chatgpt-4o-latest
edit_format: diff
commit_hash: af10953
pass_rate_1: 56.4
pass_rate_2: 72.2
percent_cases_well_formed: 97.0
error_outputs: 4
num_malformed_responses: 4
num_with_malformed_responses: 4
user_asks: 21
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model openai/chatgpt-4o-latest
date: 2024-10-04
versions: 0.58.2.dev
seconds_per_case: 23.7
total_cost: 4.0641
- dirname: 2024-10-05-20-03-10--dracarys-glhf-whole
test_cases: 133
model: Dracarys2-72B-Instruct
edit_format: whole
commit_hash: 04a2cbb
pass_rate_1: 55.6
pass_rate_2: 66.9
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 1
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: (via glhf.chat)
date: 2024-10-05
versions: 0.59.2.dev
seconds_per_case: 46.7
total_cost: 0.0000
- dirname: 2024-10-13-21-33-42--grok2-whole
test_cases: 133
model: Grok-2
edit_format: whole
commit_hash: 0a497b7
pass_rate_1: 45.9
pass_rate_2: 58.6
percent_cases_well_formed: 98.5
error_outputs: 7
num_malformed_responses: 7
num_with_malformed_responses: 2
user_asks: 24
lazy_comments: 4
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model openrouter/x-ai/grok-2
date: 2024-10-13
versions: 0.59.2.dev
seconds_per_case: 34.6
total_cost: 0.0000
- dirname: 2024-10-13-23-58-44--grok2mini-whole
test_cases: 133
model: Grok-2-mini
edit_format: whole
commit_hash: 0a497b7-dirty, 0a497b7
pass_rate_1: 40.6
pass_rate_2: 54.9
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 8
lazy_comments: 2
syntax_errors: 2
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model openrouter/x-ai/grok-2-mini
date: 2024-10-13
versions: 0.59.2.dev
seconds_per_case: 32.1
total_cost: 0.0000
- dirname: 2024-10-16-15-55-37--nemotron-glhf-whole3
test_cases: 133
model: Llama-3.1-Nemotron-70B-Instruct-HF
edit_format: whole
commit_hash: 6bb9b25-dirty
pass_rate_1: 36.8
pass_rate_2: 54.9
percent_cases_well_formed: 99.2
error_outputs: 17
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 53
lazy_comments: 17
syntax_errors: 1
indentation_errors: 2
exhausted_context_windows: 0
test_timeouts: 3
command: (via glhf.chat)
date: 2024-10-16
versions: 0.59.2.dev
seconds_per_case: 64.9
total_cost: 0.0000
- dirname: 2024-10-22-17-45-28--sonnet-1022-diff-fixed-model-settings
test_cases: 133
model: claude-3-5-sonnet-20241022
edit_format: diff
commit_hash: 3b14eb9
pass_rate_1: 69.2
pass_rate_2: 84.2
percent_cases_well_formed: 99.2
error_outputs: 1
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 0
lazy_comments: 1
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model anthropic/claude-3-5-sonnet-20241022
date: 2024-10-22
versions: 0.59.2.dev
seconds_per_case: 18.6
total_cost: 0.0000
- dirname: 2024-11-04-19-19-32--haiku35-diff-ex-as-sys-false
test_cases: 133
model: claude-3-5-haiku-20241022
edit_format: diff
commit_hash: 03bbdb0-dirty
pass_rate_1: 61.7
pass_rate_2: 75.2
percent_cases_well_formed: 95.5
error_outputs: 11
num_malformed_responses: 11
num_with_malformed_responses: 6
user_asks: 1
lazy_comments: 1
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model anthropic/claude-3-5-haiku-20241022
date: 2024-11-04
versions: 0.61.1.dev
seconds_per_case: 18.4
total_cost: 0.0000
- dirname: 2024-11-07-06-15-36--Qwen2.5.1-Coder-7B-Instruct-GGUF:Q8_0-32k-whole
test_cases: 133
model: ollama/Qwen2.5.1-Coder-7B-Instruct-GGUF:Q8_0-32k
edit_format: whole
commit_hash: e76704e
pass_rate_1: 52.6
pass_rate_2: 63.9
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 4
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model ollama/Qwen2.5.1-Coder-7B-Instruct-GGUF:Q8_0-32k
date: 2024-11-07
versions: 0.59.2.dev
seconds_per_case: 18.2
total_cost: 0.0000
- dirname: 2024-10-29-00-29-09--Qwen2.5-Coder-0.5B-Instruct
test_cases: 133
model: Qwen2.5-Coder-0.5B-Instruct
edit_format: whole
commit_hash: 58bd375
pass_rate_1: 14.3
pass_rate_2: 14.3
percent_cases_well_formed: 100.0
error_outputs: 20
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 45
lazy_comments: 0
syntax_errors: 2
indentation_errors: 0
exhausted_context_windows: 20
test_timeouts: 2
command: aider --model openai/Qwen2.5-Coder-0.5B-Instruct
date: 2024-10-29
versions: 0.59.2.dev
seconds_per_case: 16.0
total_cost: 0.0000
- dirname: 2024-11-11-19-37-01--Qwen2.5-Coder-1.5B-Instruct
test_cases: 133
model: Qwen2.5-Coder-1.5B-Instruct
edit_format: whole
commit_hash: bb5681c
pass_rate_1: 28.6
pass_rate_2: 31.6
percent_cases_well_formed: 100.0
error_outputs: 5
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 13
lazy_comments: 2
syntax_errors: 1
indentation_errors: 0
exhausted_context_windows: 5
test_timeouts: 2
command: aider --model openai/Qwen2.5-Coder-1.5B-Instruct
date: 2024-11-11
versions: 0.59.2.dev
seconds_per_case: 27.4
total_cost: 0.0000
- dirname: 2024-11-04-02-25-32--Qwen2.5-Coder-3B-Instruct
test_cases: 133
model: Qwen2.5-Coder-3B-Instruct
edit_format: whole
commit_hash: 0ba3647
pass_rate_1: 33.8
pass_rate_2: 39.1
percent_cases_well_formed: 100.0
error_outputs: 4
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 3
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 4
test_timeouts: 6
command: aider --model openai/Qwen2.5-Coder-3B-Instruct
date: 2024-11-04
versions: 0.59.2.dev
seconds_per_case: 18.7
total_cost: 0.0000
- dirname: 2024-10-16-16-20-59--Qwen2.5-Coder-7B-Instruct
test_cases: 133
model: Qwen2.5-Coder-7B-Instruct
edit_format: whole
commit_hash: 92fe979-dirty
pass_rate_1: 51.9
pass_rate_2: 57.9
percent_cases_well_formed: 100.0
error_outputs: 2
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 2
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 2
test_timeouts: 5
command: aider --model openai/Qwen2.5-Coder-7B-Instruct
date: 2024-10-16
versions: 0.59.2.dev
seconds_per_case: 10.5
total_cost: 0.0000
- dirname: 2024-10-29-11-53-39--Qwen2.5-Coder-14B-Instruct
test_cases: 133
model: Qwen2.5-Coder-14B-Instruct
edit_format: whole
commit_hash: 58bd375
pass_rate_1: 58.6
pass_rate_2: 69.2
percent_cases_well_formed: 100.0
error_outputs: 3
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 2
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 3
test_timeouts: 0
command: aider --model openai/Qwen2.5-Coder-14B-Instruct
date: 2024-10-29
versions: 0.59.2.dev
seconds_per_case: 18.3
total_cost: 0.0000
- dirname: 2024-11-09-10-57-11--Qwen2.5-Coder-32B-Instruct
test_cases: 133
model: Qwen2.5-Coder-32B-Instruct (whole)
edit_format: whole
commit_hash: ec9982a
pass_rate_1: 60.9
pass_rate_2: 73.7
percent_cases_well_formed: 100.0
error_outputs: 1
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 1
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 1
command: aider --model openai/Qwen2.5-Coder-32B-Instruct
date: 2024-11-09
versions: 0.59.2.dev
seconds_per_case: 26.6
total_cost: 0.0000
- dirname: 2024-11-09-11-09-15--Qwen2.5-Coder-32B-Instruct
test_cases: 133
model: Qwen2.5-Coder-32B-Instruct (diff)
edit_format: diff
commit_hash: ec9982a
pass_rate_1: 59.4
pass_rate_2: 71.4
percent_cases_well_formed: 94.7
error_outputs: 17
num_malformed_responses: 17
num_with_malformed_responses: 7
user_asks: 1
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model openai/Qwen2.5-Coder-32B-Instruct
date: 2024-11-09
versions: 0.59.2.dev
seconds_per_case: 22.5
total_cost: 0.0000

View File

@@ -145,7 +145,7 @@
- dirname: 2024-07-01-18-30-33--refac-claude-3.5-sonnet-diff-not-lazy
test_cases: 89
model: claude-3.5-sonnet (diff)
model: claude-3.5-sonnet-20240620
edit_format: diff
commit_hash: 7396e38-dirty
pass_rate_1: 64.0
@@ -229,4 +229,70 @@
date: 2024-09-05
versions: 0.55.1.dev
seconds_per_case: 225.4
total_cost: 1.0338
total_cost: 1.0338
- dirname: 2024-10-22-19-57-27--refac-openrouter-sonnet-1022
test_cases: 89
model: claude-3-5-sonnet-20241022
edit_format: diff
commit_hash: 4a3e6ef
pass_rate_1: 92.1
percent_cases_well_formed: 91.0
error_outputs: 13
num_malformed_responses: 12
num_with_malformed_responses: 8
user_asks: 14
lazy_comments: 2
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --sonnet
date: 2024-10-22
versions: 0.60.1.dev
seconds_per_case: 32.5
total_cost: 8.4644
- dirname: 2024-10-22-20-03-10--refac-o1mini
test_cases: 89
model: o1-mini
edit_format: diff
commit_hash: 4a3e6ef-dirty
pass_rate_1: 44.9
percent_cases_well_formed: 29.2
error_outputs: 151
num_malformed_responses: 150
num_with_malformed_responses: 63
user_asks: 28
lazy_comments: 2
syntax_errors: 5
indentation_errors: 4
exhausted_context_windows: 1
test_timeouts: 0
command: aider --model o1-mini
date: 2024-10-22
versions: 0.60.1.dev
seconds_per_case: 115.3
total_cost: 29.0492
- dirname: 2024-10-22-20-26-36--refac-o1preview
test_cases: 89
model: o1-preview
edit_format: diff
commit_hash: 4a3e6ef-dirty
pass_rate_1: 75.3
percent_cases_well_formed: 57.3
error_outputs: 75
num_malformed_responses: 74
num_with_malformed_responses: 38
user_asks: 19
lazy_comments: 2
syntax_errors: 2
indentation_errors: 3
exhausted_context_windows: 1
test_timeouts: 0
command: aider --model o1-preview
date: 2024-10-22
versions: 0.60.1.dev
seconds_per_case: 231.7
total_cost: 120.9850

View File

@@ -2,7 +2,7 @@
You can get started quickly like this:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
# Change directory into a git repo
cd /to/your/git/repo

View File

@@ -1,5 +1,5 @@
If you need more help, please check our
[GitHub issues](https://github.com/paul-gauthier/aider/issues)
[GitHub issues](https://github.com/Aider-AI/aider/issues)
and file a new issue if your problem isn't discussed.
Or drop into our
[Discord](https://discord.gg/Tv2uQnR88V)

View File

@@ -2,4 +2,4 @@ You can send long, multi-line messages in the chat in a few ways:
- Paste a multi-line message directly into the chat.
- Enter `{` alone on the first line to start a multiline message and `}` alone on the last line to end it.
- Use Meta-ENTER to start a new line without sending the message (Esc+ENTER in some environments).
- Use `/clipboard` to paste text from the clipboard into the chat.
- Use `/paste` to paste text from the clipboard into the chat.

View File

@@ -1,7 +1,7 @@
<footer class="site-footer">
Aider is AI pair programming in your terminal.
Aider is on
<a href="https://github.com/paul-gauthier/aider">GitHub</a>
<a href="https://github.com/Aider-AI/aider">GitHub</a>
and
<a href="https://discord.gg/Tv2uQnR88V">Discord</a>.
</footer>

View File

@@ -110,9 +110,9 @@ source code, by including the critical lines of code for each definition.
Here's a
sample of the map of the aider repo, just showing the maps of
[base_coder.py](https://github.com/paul-gauthier/aider/blob/main/aider/coders/base_coder.py)
[base_coder.py](https://github.com/Aider-AI/aider/blob/main/aider/coders/base_coder.py)
and
[commands.py](https://github.com/paul-gauthier/aider/blob/main/aider/commands.py)
[commands.py](https://github.com/Aider-AI/aider/blob/main/aider/commands.py)
:
```
@@ -188,7 +188,7 @@ It specifically uses the
[py-tree-sitter-languages](https://github.com/grantjenks/py-tree-sitter-languages)
python module,
which provides simple, pip-installable binary wheels for
[most popular programming languages](https://github.com/paul-gauthier/grep-ast/blob/main/grep_ast/parsers.py).
[most popular programming languages](https://github.com/Aider-AI/grep-ast/blob/main/grep_ast/parsers.py).
Tree-sitter parses source code into an Abstract Syntax Tree (AST) based
on the syntax of the programming language.
@@ -209,7 +209,7 @@ that aider originally used.
Switching from ctags to tree-sitter provides a bunch of benefits:
- The map is richer, showing full function call signatures and other details straight from the source files.
- Thanks to `py-tree-sitter-languages`, we get full support for many programming languages via a python package that's automatically installed as part of the normal `python -m pip install aider-chat`.
- Thanks to `py-tree-sitter-languages`, we get full support for many programming languages via a python package that's automatically installed as part of the normal `python -m pip install -U aider-chat`.
- We remove the requirement for users to manually install `universal-ctags` via some external tool or package manager (brew, apt, choco, etc).
- Tree-sitter integration is a key enabler for future work and capabilities for aider.
@@ -245,7 +245,7 @@ just install [aider](https://aider.chat/docs/install.html).
## Credits
Aider uses
[modified versions of the tags.scm files](https://github.com/paul-gauthier/aider/tree/main/aider/queries)
[modified versions of the tags.scm files](https://github.com/Aider-AI/aider/tree/main/aider/queries)
from these
open source tree-sitter language implementations:

View File

@@ -23,14 +23,14 @@ making it the best available model for pair programming with AI.
To use Claude 3 Opus with aider:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export ANTHROPIC_API_KEY=sk-...
aider --opus
```
## Aider's code editing benchmark
[Aider](https://github.com/paul-gauthier/aider)
[Aider](https://github.com/Aider-AI/aider)
is an open source command line chat tool that lets you
pair program with AI on code in your local git repo.

View File

@@ -52,7 +52,7 @@ def some_complex_method(foo, bar):
# ... implement method here ...
```
Aider uses a ["laziness" benchmark suite](https://github.com/paul-gauthier/refactor-benchmark)
Aider uses a ["laziness" benchmark suite](https://github.com/Aider-AI/refactor-benchmark)
which is designed to both provoke and quantify lazy coding.
It consists of
89 python refactoring tasks

View File

@@ -46,7 +46,7 @@ It also supports [connecting to almost any LLM](https://aider.chat/docs/llms.htm
Use the `--browser` switch to launch the browser version of aider:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export OPENAI_API_KEY=<key> # Mac/Linux
setx OPENAI_API_KEY <key> # Windows, restart shell after setx

View File

@@ -15,7 +15,7 @@ nav_exclude: true
I recently wanted to draw a graph showing how LLM code editing skill has been
changing over time as new models have been released by OpenAI, Anthropic and others.
I have all the
[data in a yaml file](https://github.com/paul-gauthier/aider/blob/main/website/_data/edit_leaderboard.yml) that is used to render
[data in a yaml file](https://github.com/Aider-AI/aider/blob/main/website/_data/edit_leaderboard.yml) that is used to render
[aider's LLM leaderboards](https://aider.chat/docs/leaderboards/).
Below is the aider chat transcript, which shows:

View File

@@ -25,7 +25,7 @@ This increases the ability of the LLM to understand the problem and
make the correct changes to resolve it.
Aider ships with basic linters built with tree-sitter that support
[most popular programming languages](https://github.com/paul-gauthier/grep-ast/blob/main/grep_ast/parsers.py).
[most popular programming languages](https://github.com/Aider-AI/grep-ast/blob/main/grep_ast/parsers.py).
These built in linters will detect syntax errors and other fatal problems with the code.
You can also configure aider to use your preferred linters.

View File

@@ -76,7 +76,7 @@ The held out "acceptance tests" were *only* used
after benchmarking to compute statistics on which problems aider
correctly resolved.
The [full harness to run aider on SWE Bench Lite is available on GitHub](https://github.com/paul-gauthier/aider-swe-bench).
The [full harness to run aider on SWE Bench Lite is available on GitHub](https://github.com/Aider-AI/aider-swe-bench).
The benchmarking process was similar to how a developer might use aider to
resolve a GitHub issue:

View File

@@ -12,8 +12,12 @@ nav_exclude: true
[![self assembly](/assets/self-assembly.jpg)](https://aider.chat/assets/self-assembly.jpg)
{: .note }
This article is quite out dated. For current statistics, see
[aider's release history](/HISTORY.html).
The
[aider git repo](https://github.com/paul-gauthier/aider)
[aider git repo](https://github.com/Aider-AI/aider)
currently contains about 4K commits and 14K lines of code.
Aider made 15% of the commits, inserting 4.8K and deleting 1.5K lines of code.

View File

@@ -64,7 +64,7 @@ with the problem statement
submitted as the opening chat message from "the user".
- After that aider ran as normal, except all of aider's
suggestions were always accepted without user approval.
- A [simple harness](https://github.com/paul-gauthier/aider-swe-bench#the-aider-agent) was used to retry the SWE Bench problem if aider produced code that wasn't *plausibly correct*.
- A [simple harness](https://github.com/Aider-AI/aider-swe-bench#the-aider-agent) was used to retry the SWE Bench problem if aider produced code that wasn't *plausibly correct*.
Plausibly correct means that aider reported that it had successfully edited the repo
without causing syntax errors or breaking any *pre-existing* tests.
- If the solution from aider with GPT-4o wasn't plausible, the harness launched aider to try again from scratch using Claude 3 Opus.
@@ -90,7 +90,7 @@ For a detailed discussion of the benchmark
methodology, see the
[article about aider's SWE Bench Lite results](https://aider.chat/2024/05/22/swe-bench-lite.html).
Also, the
[aider SWE Bench repository on GitHub](https://github.com/paul-gauthier/aider-swe-bench)
[aider SWE Bench repository on GitHub](https://github.com/Aider-AI/aider-swe-bench)
contains the harness and statistics code used for the benchmarks.
The benchmarking process was similar to how a developer might use aider to

View File

@@ -37,8 +37,8 @@ Users who tested Sonnet with a preview of
[aider's latest release](https://aider.chat/HISTORY.html#aider-v0410)
were thrilled:
- *Works like a charm. It is a monster. It refactors files of any size like it is nothing. The continue trick with Sonnet is truly the holy grail. Aider beats [other tools] hands down. I'm going to cancel both subscriptions.* -- [Emasoft](https://github.com/paul-gauthier/aider/issues/705#issuecomment-2200338971)
- *Thanks heaps for this feature - it's a real game changer. I can be more ambitious when asking Claude for larger features.* -- [cngarrison](https://github.com/paul-gauthier/aider/issues/705#issuecomment-2196026656)
- *Works like a charm. It is a monster. It refactors files of any size like it is nothing. The continue trick with Sonnet is truly the holy grail. Aider beats [other tools] hands down. I'm going to cancel both subscriptions.* -- [Emasoft](https://github.com/Aider-AI/aider/issues/705#issuecomment-2200338971)
- *Thanks heaps for this feature - it's a real game changer. I can be more ambitious when asking Claude for larger features.* -- [cngarrison](https://github.com/Aider-AI/aider/issues/705#issuecomment-2196026656)
- *Fantastic...! It's such an improvement not being constrained by output token length issues. [I refactored] a single JavaScript file into seven smaller files using a single Aider request.* -- [John Galt](https://discord.com/channels/1131200896827654144/1253492379336441907/1256250487934554143)
## Hitting the 4k token output limit
@@ -116,7 +116,7 @@ for more details, but
you can get started quickly with aider and Sonnet like this:
```
$ python -m pip install aider-chat
$ python -m pip install -U aider-chat
$ export ANTHROPIC_API_KEY=<key> # Mac/Linux
$ setx ANTHROPIC_API_KEY <key> # Windows, restart shell after setx

View File

@@ -30,7 +30,7 @@ included for scale.
You can code with all of these models using aider like this:
```
$ python -m pip install aider-chat
$ python -m pip install -U aider-chat
# Change directory into a git repo to work on
$ cd /to/your/git/repo

View File

@@ -0,0 +1,418 @@
---
title: Separating code reasoning and editing
excerpt: An Architect model describes how to solve the coding problem, and an Editor model translates that into file edits. This Architect/Editor approach produces SOTA benchmark results.
highlight_image: /assets/architect.jpg
draft: false
nav_exclude: true
---
{% if page.date %}
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
{% endif %}
# Separating code reasoning and editing
Aider now has experimental support for using two models to complete each coding task:
- An Architect model is asked to describe how to solve the coding problem.
- An Editor model is given the Architect's solution and asked to produce specific code editing instructions to apply those changes to existing source files.
Splitting up "code reasoning" and "code editing" in this manner
has produced SOTA results on
[aider's code editing benchmark](/docs/benchmarks.html#the-benchmark).
Using o1-preview as the Architect with either DeepSeek or o1-mini as the
Editor produced the SOTA score of 85%.
Using the Architect/Editor approach
also significantly improved the benchmark scores of many
models, compared to their previous "solo" baseline scores (striped bars).
<style>
.shaded td {
background-color: #f2f2f2;
border-top: 1px solid #ccc;
}
.table-container {
max-width: 100%;
overflow-x: auto;
}
.responsive-table {
border-collapse: separate;
border-spacing: 0;
width: 100%;
font-size: 16px;
border: 1px solid #ddd;
}
.responsive-table th, .responsive-table td {
padding: 8px;
text-align: left;
border-bottom: 1px solid #ddd;
word-break: break-word;
}
.responsive-table th {
background-color: #e2e2e2;
}
.responsive-table th:first-child,
.responsive-table td:first-child {
border-left: 1px solid #ddd;
}
.responsive-table th:last-child,
.responsive-table td:last-child {
border-right: 1px solid #ddd;
}
@media screen and (max-width: 600px) {
.responsive-table {
font-size: 12px;
}
.responsive-table th, .responsive-table td {
padding: 4px;
}
}
</style>
<style>
#passRateChart {
max-width: 100%;
height: auto !important;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@1.0.2"></script>
{% assign sorted_data = site.data.architect | sort: "pass_rate_2" | reverse %}
<canvas id="passRateChart" width="400" height="250"></canvas>
<script>
document.addEventListener("DOMContentLoaded", function() {
var ctx = document.getElementById('passRateChart').getContext('2d');
// Function to determine aspect ratio and base font size based on screen width
function getChartSettings() {
if (window.innerWidth < 600) {
return { aspectRatio: 1, baseFontSize: 8 }; // Slightly taller for small screens
} else if (window.innerWidth < 800) {
return { aspectRatio: 1.2, baseFontSize: 10 }; // Slightly taller for small screens
} else {
return { aspectRatio: 1.4, baseFontSize: 12 }; // Slightly taller for larger screens
}
}
var chartSettings = getChartSettings();
var baseFontSize = chartSettings.baseFontSize;
var labels = [];
var data = [];
var colorMapping = {
"claude-3.5-sonnet": "rgba(75, 192, 192, 0.2)",
"gpt-4o": "rgba(255, 99, 132, 0.2)",
"o1-preview": "rgba(54, 162, 235, 0.2)",
"o1-mini": "rgba(255, 206, 86, 0.2)",
"gpt-4o-mini": "rgba(153, 102, 255, 0.2)"
};
var borderColorMapping = {
"claude-3.5-sonnet": "rgba(75, 192, 192, 1)",
"gpt-4o": "rgba(255, 99, 132, 1)",
"o1-preview": "rgba(54, 162, 235, 1)",
"o1-mini": "rgba(255, 206, 86, 1)",
"gpt-4o-mini": "rgba(153, 102, 255, 1)"
};
var backgroundColors = [];
var borderColors = [];
var patterns = {};
for (var key in colorMapping) {
patterns[key] = ctx.createPattern(createStripePattern(colorMapping[key]), 'repeat');
}
{% assign grouped_data = sorted_data | group_by: "model" %}
{% for group in grouped_data %}
{% for item in group.items %}
if ("{{ item.editor_model }}" == "") {
labels.push("Baseline");
} else {
labels.push("{{ item.editor_model }}/{{ item.editor_edit_format | default: item.edit_format }}");
}
data.push({{ item.pass_rate_2 }});
if ("{{ item.editor_model }}" == "") {
backgroundColors.push(patterns["{{ item.model }}"]);
} else {
backgroundColors.push(colorMapping["{{ item.model }}"]);
}
borderColors.push(borderColorMapping["{{ item.model }}"]);
{% endfor %}
{% endfor %}
labels.reverse();
data.reverse();
backgroundColors.reverse();
borderColors.reverse();
var chart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: 'Pass Rate',
data: data,
backgroundColor: backgroundColors,
borderColor: borderColors,
borderWidth: 1
}]
},
options: {
responsive: true,
maintainAspectRatio: true,
aspectRatio: chartSettings.aspectRatio,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Pass Rate (%)',
font: {
size: baseFontSize + 6
}
},
ticks: {
font: {
size: baseFontSize
}
}
},
x: {
title: {
display: true,
text: 'Editor model and edit format',
font: {
size: baseFontSize + 6
}
},
ticks: {
font: {
size: baseFontSize + 4
},
maxRotation: 90, // Allow full rotation if needed
minRotation: 45 // Start rotating at 45 degrees to fit more labels
}
}
},
plugins: {
annotation: {
annotations: {
line1: {
type: 'line',
yMin: 79.7,
yMax: 79.7,
borderColor: 'rgba(255, 99, 132, 0.8)',
borderWidth: 2,
borderDash: [6, 6],
label: {
content: 'Previous SOTA',
enabled: true,
position: 'start',
xAdjust: 10,
font: {
size: baseFontSize
}
}
}
}
},
legend: {
display: true,
title: {
display: true,
text: 'Architect model',
font: {
size: baseFontSize + 2,
weight: 'bold'
}
},
labels: {
font: {
size: baseFontSize + 4
},
generateLabels: function(chart) {
var colorMapping = {
"o1-preview": "rgba(54, 162, 235, 0.2)",
"claude-3.5-sonnet": "rgba(75, 192, 192, 0.2)",
"gpt-4o": "rgba(255, 99, 132, 0.2)",
"o1-mini": "rgba(255, 206, 86, 0.2)",
"gpt-4o-mini": "rgba(153, 102, 255, 0.2)"
};
return Object.keys(colorMapping).reverse().map(function(key) {
return {
text: key,
fillStyle: colorMapping[key],
strokeStyle: colorMapping[key].replace('0.2', '1'),
lineWidth: 1
};
});
}
}
}
}
}
});
// Update aspect ratio and font sizes on window resize
window.addEventListener('resize', function() {
var newSettings = getChartSettings();
chart.options.aspectRatio = newSettings.aspectRatio;
baseFontSize = newSettings.baseFontSize;
// Update font sizes
chart.options.scales.y.title.font.size = baseFontSize + 6;
chart.options.scales.y.ticks.font.size = baseFontSize;
chart.options.scales.x.title.font.size = baseFontSize + 6;
chart.options.scales.x.ticks.font.size = baseFontSize + 4;
chart.options.plugins.annotation.annotations.line1.label.font.size = baseFontSize;
chart.options.plugins.legend.title.font.size = baseFontSize + 4;
chart.options.plugins.legend.labels.font.size = baseFontSize + 4;
chart.update();
});
});
function createStripePattern(baseColor) {
var canvas = document.createElement('canvas');
canvas.width = 10;
canvas.height = 10;
var ctx = canvas.getContext('2d');
ctx.fillStyle = baseColor;
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.strokeStyle = 'rgba(0, 0, 0, 0.1)';
ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(10, 10);
ctx.stroke();
return canvas;
}
</script>
## Motivation
This approach was motivated by the release of OpenAI's o1 models.
They are strong at reasoning, but often fail to output properly formatted
code editing instructions.
It helps to instead let them describe the solution
however they prefer and then pass that output to a more traditional LLM.
This second Editor LLM can then interpret the solution description and
produce the code editing instructions needed to update
the existing source code.
This approach has recently become attractive for aider due to
rapid improvements in the speed and costs of frontier models.
In particular, chaining older LLMs would have been quite slow and
incompatible with aider's goal of providing an interactive,
pair programming AI coding experience.
## Code reasoning and code editing
Normally aider asks the model to solve a coding problem in one prompt,
asking the LLM to explain the solution and return
a well formatted series of file edits.
All of [aider's editing formats](/docs/more/edit-formats.html)
require the LLM to return source code edits in a specific text
format, so that aider can process the edits and apply them to the local source files.
Because this all happens in a single prompt/response round trip to the LLM,
the model has to split its attention between
solving the coding problem and conforming to the edit format.
The Architect/Editor approach splits this into two inference steps, possibly
using two different LLMs:
1. Solve the coding problem (Architect).
2. Turn the proposed solution into a series of well formed code edits (Editor).
The Architect/Editor approach allows the Architect to focus on solving the coding problem
and *describe the solution however comes naturally to it*.
Similarly, the Editor can focus all of its attention on properly formatting the edits
without needing to reason much about how to solve the coding problem.
We can assign the Architect and Editor roles to LLMs which are well suited to their needs.
Strong reasoning model like o1-preview make excellent Architects, while
the Editor role can be assigned to an appropriate model based on cost, speed
and code editing skill.
## Results
The graph above and the table below show the
[aider's code editing benchmark](/docs/benchmarks.html#the-benchmark)
score for various combinations of Architect and Editor models.
Some noteworthy observations:
- Pairing o1-preview as Architect with either Deepseek or o1-mini as Editor sets a SOTA significantly above the previous best score. This result is obtained with the "whole" editing format, requiring the Editor to output a full update copy of each edited source file. Both of these steps are therefore quite slow, so probably not practical for interactive use with aider.
- Pairing OpenAI's o1-preview with Anthropic's Sonnet as the Editor produces the second best result. This is an entirely practical configuration for users able to work with both providers.
- Pairing many models with themselves in the Architect/Editor configuration can provide
significant benefits.
Sonnet, GPT-4o and GPT-4o-mini all scored higher when used as an Architect/Editor pair.
- Deepseek is surprisingly effective as an Editor model. It seems remarkably capable at turning proposed coding solutions into new, updated versions of the source files. Using the efficient "diff" editing format, Deepseek helps all the Architect models except for Sonnet.
## Try it!
The development version of aider
has built in defaults to support Architect/Editor coding with
o1-preview, o1-mini, GPT-4o and Claude 3.5 Sonnet.
Run aider with `--architect` or get started quickly like this:
```
pip install -U aider-chat
# Change directory into a git repo
cd /to/your/git/repo
# Work with Claude 3.5 Sonnet as the Architect and Editor
export ANTHROPIC_API_KEY=your-key-goes-here
aider --sonnet --architect
# Work with OpenAI models, using gpt-4o as the Editor
export OPENAI_API_KEY=your-key-goes-here
aider --4o --architect
aider --o1-mini --architect
aider --o1-preview --architect
```
## More info
Aider has a number of "chat modes", and "architect" is available as a new chat mode.
The `--architect` switch is a shortcut for `--chat-mode architect`.
For more details, see documentation on
[aider's chat modes](/docs/usage/modes.html).
## Full results
Below are the benchmark results using various models as the Architect, paired with
various models as the Editor.
Each section includes a "baseline" result,
where the model works
by itself in aider's normal "code" editing mode
(not as part of an Architect/Editor configuration).
This "solo" baseline represents the performance previously available when using
this model with aider.
<div class="table-container">
<table class="responsive-table">
<thead>
<tr>
<th>Architect</th>
<th>Editor</th>
<th>Edit Format</th>
<th>Pass Rate</th>
</tr>
</thead>
<tbody>
{% for group in grouped_data %}
{% assign group_class = forloop.index | modulo: 2 | plus: 1 %}
{% for item in group.items %}
<tr class="{% if group_class == 1 %}shaded{% endif %}">
<td>{{ item.model }}</td>
<td>{% if item.editor_model %}{{ item.editor_model }}{% else %}<b>Baseline</b>{% endif %}</td>
<td style="text-align: center;">{{ item.editor_edit_format | default: item.edit_format }}</td>
<td style="text-align: right;">{{ item.pass_rate_2 }}%</td>
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -29,9 +29,12 @@
## Use claude-3-opus-20240229 model for the main chat
#opus: false
## Use claude-3-5-sonnet-20240620 model for the main chat
## Use claude-3-5-sonnet-20241022 model for the main chat
#sonnet: false
## Use claude-3-5-haiku-20241022 model for the main chat
#haiku: false
## Use gpt-4-0613 model for the main chat
#4: false
@@ -50,6 +53,12 @@
## Use deepseek/deepseek-coder model for the main chat
#deepseek: false
## Use o1-mini model for the main chat
#o1-mini: false
## Use o1-preview model for the main chat
#o1-preview: false
#################
# Model Settings:
@@ -83,17 +92,29 @@
## Specify what edit format the LLM should use (default depends on model)
#edit-format: xxx
## Use architect edit format for the main chat
#architect: false
## Specify the model to use for commit messages and chat history summarization (default depends on --model)
#weak-model: xxx
## Specify the model to use for editor tasks (default depends on --model)
#editor-model: xxx
## Specify the edit format for the editor model (default: depends on editor model)
#editor-edit-format: xxx
## Only work with models that have meta-data available (default: True)
#show-model-warnings: true
## Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
#map-tokens: xxx
## Soft limit on tokens for chat history, after which summarization begins. If unspecified, defaults to the model's max_chat_history_tokens.
#max-chat-history-tokens: xxx
## Control how often the repo map is refreshed (default: auto)
#map-refresh: auto
## Specify the .env file to load (default: .env in git root)
#env-file: .env
#################
# Cache Settings:
## Enable caching of prompts (default: False)
#cache-prompts: false
@@ -101,15 +122,18 @@
## Number of times to ping at 5min intervals to keep prompt cache warm (default: 0)
#cache-keepalive-pings: false
###################
# Repomap Settings:
## Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
#map-tokens: xxx
## Control how often the repo map is refreshed. Options: auto, always, files, manual (default: auto)
#map-refresh: auto
## Multiplier for map tokens when no files are specified (default: 2)
#map-multiplier-no-files: true
## Maximum number of tokens to use for chat history. If not specified, uses the model's max_chat_history_tokens.
#max-chat-history-tokens: xxx
## Specify the .env file to load (default: .env in git root)
#env-file: .env
################
# History Files:
@@ -155,6 +179,18 @@
## Set the color for assistant output (default: #0088ff)
#assistant-output-color: #0088ff
## Set the color for the completion menu (default: terminal's default text color)
#completion-menu-color: xxx
## Set the background color for the completion menu (default: terminal's default background color)
#completion-menu-bg-color: xxx
## Set the color for the current item in the completion menu (default: terminal's default background color)
#completion-menu-current-color: xxx
## Set the background color for the current item in the completion menu (default: terminal's default text color)
#completion-menu-current-bg-color: xxx
## Set the markdown code theme (default: default, other options include monokai, solarized-dark, solarized-light)
#code-theme: default
@@ -203,6 +239,9 @@
## Perform a dry run without modifying files (default: False)
#dry-run: false
## Skip the sanity check for the git repository (default: False)
#skip-sanity-check-repo: false
########################
# Fixing and committing:
@@ -212,7 +251,10 @@
## Specify lint commands to run for different languages, eg: "python: flake8 --select=..." (can be used multiple times)
#lint-cmd: xxx
## Specify multiple values like this:
#lint-cmd: [xxx,yyyy,zzz]
#lint-cmd:
# - xxx
# - yyy
# - zzz
## Enable/disable automatic linting after changes (default: True)
#auto-lint: true
@@ -226,25 +268,40 @@
## Run tests and fix problems found
#test: false
############
# Analytics:
## Enable/disable analytics for one session (default: False)
#analytics: false
## Specify a file to log analytics events
#analytics-log: xxx
## Permanently disable analytics
#analytics-disable: false
#################
# Other Settings:
## specify a file to edit (can be used multiple times)
#file: xxx
## Specify multiple values like this:
#file: [xxx,yyyy,zzz]
#file:
# - xxx
# - yyy
# - zzz
## specify a read-only file (can be used multiple times)
#read: xxx
## Specify multiple values like this:
#read: [xxx,yyyy,zzz]
#read:
# - xxx
# - yyy
# - zzz
## Use VI editing mode in the terminal (default: False)
#vim: false
## Specify the language for voice using ISO 639-1 code (default: auto)
#voice-language: en
## Specify the language to use in the chat (default: None, uses system settings)
#chat-language: xxx
@@ -266,8 +323,11 @@
## Apply the changes from the given file instead of running the chat (debug)
#apply: xxx
## Apply clipboard contents as edits using the main model's editor format
#apply-clipboard-edits: false
## Always say yes to every confirmation
#yes: false
#yes-always: false
## Enable verbose output
#verbose: false
@@ -287,14 +347,29 @@
## Specify a file containing the message to send the LLM, process reply, then exit (disables chat mode)
#message-file: xxx
## Load and execute /commands from a file on launch
#load: xxx
## Specify the encoding for input and output (default: utf-8)
#encoding: utf-8
## Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory)
#config: xxx
## Run aider in your browser
## Run aider in your browser (default: False)
#gui: false
## Enable/disable suggesting shell commands (default: True)
#suggest-shell-commands: true
## Enable/disable fancy input with history and completion (default: True)
#fancy-input: true
#################
# Voice Settings:
## Audio format for voice recording (default: wav). webm and mp3 require ffmpeg
#voice-format: wav
## Specify the language for voice using ISO 639-1 code (default: auto)
#voice-language: en

View File

@@ -33,9 +33,12 @@
## Use claude-3-opus-20240229 model for the main chat
#AIDER_OPUS=
## Use claude-3-5-sonnet-20240620 model for the main chat
## Use claude-3-5-sonnet-20241022 model for the main chat
#AIDER_SONNET=
## Use claude-3-5-haiku-20241022 model for the main chat
#AIDER_HAIKU=
## Use gpt-4-0613 model for the main chat
#AIDER_4=
@@ -54,6 +57,12 @@
## Use deepseek/deepseek-coder model for the main chat
#AIDER_DEEPSEEK=
## Use o1-mini model for the main chat
#AIDER_O1_MINI=
## Use o1-preview model for the main chat
#AIDER_O1_PREVIEW=
#################
# Model Settings:
@@ -87,17 +96,29 @@
## Specify what edit format the LLM should use (default depends on model)
#AIDER_EDIT_FORMAT=
## Use architect edit format for the main chat
#AIDER_ARCHITECT=
## Specify the model to use for commit messages and chat history summarization (default depends on --model)
#AIDER_WEAK_MODEL=
## Specify the model to use for editor tasks (default depends on --model)
#AIDER_EDITOR_MODEL=
## Specify the edit format for the editor model (default: depends on editor model)
#AIDER_EDITOR_EDIT_FORMAT=
## Only work with models that have meta-data available (default: True)
#AIDER_SHOW_MODEL_WARNINGS=true
## Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
#AIDER_MAP_TOKENS=
## Soft limit on tokens for chat history, after which summarization begins. If unspecified, defaults to the model's max_chat_history_tokens.
#AIDER_MAX_CHAT_HISTORY_TOKENS=
## Control how often the repo map is refreshed (default: auto)
#AIDER_MAP_REFRESH=auto
## Specify the .env file to load (default: .env in git root)
#AIDER_ENV_FILE=.env
#################
# Cache Settings:
## Enable caching of prompts (default: False)
#AIDER_CACHE_PROMPTS=false
@@ -105,15 +126,18 @@
## Number of times to ping at 5min intervals to keep prompt cache warm (default: 0)
#AIDER_CACHE_KEEPALIVE_PINGS=false
###################
# Repomap Settings:
## Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
#AIDER_MAP_TOKENS=
## Control how often the repo map is refreshed. Options: auto, always, files, manual (default: auto)
#AIDER_MAP_REFRESH=auto
## Multiplier for map tokens when no files are specified (default: 2)
#AIDER_MAP_MULTIPLIER_NO_FILES=true
## Maximum number of tokens to use for chat history. If not specified, uses the model's max_chat_history_tokens.
#AIDER_MAX_CHAT_HISTORY_TOKENS=
## Specify the .env file to load (default: .env in git root)
#AIDER_ENV_FILE=.env
################
# History Files:
@@ -159,6 +183,18 @@
## Set the color for assistant output (default: #0088ff)
#AIDER_ASSISTANT_OUTPUT_COLOR=#0088ff
## Set the color for the completion menu (default: terminal's default text color)
#AIDER_COMPLETION_MENU_COLOR=
## Set the background color for the completion menu (default: terminal's default background color)
#AIDER_COMPLETION_MENU_BG_COLOR=
## Set the color for the current item in the completion menu (default: terminal's default background color)
#AIDER_COMPLETION_MENU_CURRENT_COLOR=
## Set the background color for the current item in the completion menu (default: terminal's default text color)
#AIDER_COMPLETION_MENU_CURRENT_BG_COLOR=
## Set the markdown code theme (default: default, other options include monokai, solarized-dark, solarized-light)
#AIDER_CODE_THEME=default
@@ -207,6 +243,9 @@
## Perform a dry run without modifying files (default: False)
#AIDER_DRY_RUN=false
## Skip the sanity check for the git repository (default: False)
#AIDER_SKIP_SANITY_CHECK_REPO=false
########################
# Fixing and committing:
@@ -228,6 +267,18 @@
## Run tests and fix problems found
#AIDER_TEST=false
############
# Analytics:
## Enable/disable analytics for one session (default: False)
#AIDER_ANALYTICS=false
## Specify a file to log analytics events
#AIDER_ANALYTICS_LOG=
## Permanently disable analytics
#AIDER_ANALYTICS_DISABLE=false
#################
# Other Settings:
@@ -240,9 +291,6 @@
## Use VI editing mode in the terminal (default: False)
#AIDER_VIM=false
## Specify the language for voice using ISO 639-1 code (default: auto)
#AIDER_VOICE_LANGUAGE=en
## Specify the language to use in the chat (default: None, uses system settings)
#AIDER_CHAT_LANGUAGE=
@@ -261,8 +309,11 @@
## Apply the changes from the given file instead of running the chat (debug)
#AIDER_APPLY=
## Apply clipboard contents as edits using the main model's editor format
#AIDER_APPLY_CLIPBOARD_EDITS=false
## Always say yes to every confirmation
#AIDER_YES=
#AIDER_YES_ALWAYS=
## Enable verbose output
#AIDER_VERBOSE=false
@@ -282,11 +333,26 @@
## Specify a file containing the message to send the LLM, process reply, then exit (disables chat mode)
#AIDER_MESSAGE_FILE=
## Load and execute /commands from a file on launch
#AIDER_LOAD=
## Specify the encoding for input and output (default: utf-8)
#AIDER_ENCODING=utf-8
## Run aider in your browser
## Run aider in your browser (default: False)
#AIDER_GUI=false
## Enable/disable suggesting shell commands (default: True)
#AIDER_SUGGEST_SHELL_COMMANDS=true
## Enable/disable fancy input with history and completion (default: True)
#AIDER_FANCY_INPUT=true
#################
# Voice Settings:
## Audio format for voice recording (default: wav). webm and mp3 require ffmpeg
#AIDER_VOICE_FORMAT=wav
## Specify the language for voice using ISO 639-1 code (default: auto)
#AIDER_VOICE_LANGUAGE=en

View File

@@ -19,7 +19,7 @@ and there's a lot
of interest about their ability to code compared to the previous versions.
With that in mind, I've been benchmarking the new models.
[Aider](https://github.com/paul-gauthier/aider)
[Aider](https://github.com/Aider-AI/aider)
is an open source command line chat tool that lets you work with GPT to edit
code in your local git repo.
To do this, aider needs to be able to reliably recognize when GPT wants to edit

View File

@@ -20,7 +20,7 @@ and there's a lot
of interest about their capabilities and performance.
With that in mind, I've been benchmarking the new models.
[Aider](https://github.com/paul-gauthier/aider)
[Aider](https://github.com/Aider-AI/aider)
is an open source command line chat tool that lets you work with GPT to edit
code in your local git repo.
Aider relies on a

View File

@@ -55,7 +55,7 @@ about prompting GPT for complex tasks like coding. It's beneficial to
minimize the "cognitive overhead" of formatting the response, allowing
GPT to concentrate on the coding task at hand.
As a thought experiment, imagine a slack conversation with a junior developer where
As a thought experiment, imagine a slack conversation with a editor developer where
you ask them to write the code to add some new feature to your app.
They're going to type the response back to you by hand in the chat.
Should they type out the
@@ -168,7 +168,7 @@ requests:
### whole
The
[whole](https://github.com/paul-gauthier/aider/blob/main/aider/coders/wholefile_prompts.py)
[whole](https://github.com/Aider-AI/aider/blob/main/aider/coders/wholefile_prompts.py)
format asks GPT to return an updated copy of the entire file, including any changes.
The file should be
formatted with normal markdown triple-backtick fences, inlined with the rest of its response text.
@@ -187,7 +187,7 @@ def main():
### diff
The [diff](https://github.com/paul-gauthier/aider/blob/main/aider/coders/editblock_prompts.py)
The [diff](https://github.com/Aider-AI/aider/blob/main/aider/coders/editblock_prompts.py)
format also asks GPT to return edits as part of the normal response text,
in a simple diff format.
Each edit is a fenced code block that
@@ -209,7 +209,7 @@ demo.py
### whole-func
The [whole-func](https://github.com/paul-gauthier/aider/blob/main/aider/coders/wholefile_func_coder.py)
The [whole-func](https://github.com/Aider-AI/aider/blob/main/aider/coders/wholefile_func_coder.py)
format requests updated copies of whole files to be returned using the function call API.
@@ -227,7 +227,7 @@ format requests updated copies of whole files to be returned using the function
### diff-func
The
[diff-func](https://github.com/paul-gauthier/aider/blob/main/aider/coders/editblock_func_coder.py)
[diff-func](https://github.com/Aider-AI/aider/blob/main/aider/coders/editblock_func_coder.py)
format requests a list of
original/updated style edits to be returned using the function call API.

File diff suppressed because it is too large Load Diff

View File

@@ -23,8 +23,16 @@ load whichever is found first.
## A note on lists
The syntax for specifying a list of values is not standard yaml.
Instead, use this format:
Lists of values can be specified either as a bulleted list:
```
read:
- CONVENTIONS.md
- anotherfile.txt
- thirdfile.py
```
Or lists can be specified using commas and square brackets:
```
read: [CONVENTIONS.md, anotherfile.txt, thirdfile.py]
@@ -34,7 +42,7 @@ read: [CONVENTIONS.md, anotherfile.txt, thirdfile.py]
Below is a sample of the YAML config file, which you
can also
[download from GitHub](https://github.com/paul-gauthier/aider/blob/main/aider/website/assets/sample.aider.conf.yml).
[download from GitHub](https://github.com/Aider-AI/aider/blob/main/aider/website/assets/sample.aider.conf.yml).
<!--[[[cog
from aider.args import get_sample_yaml
@@ -77,9 +85,12 @@ cog.outl("```")
## Use claude-3-opus-20240229 model for the main chat
#opus: false
## Use claude-3-5-sonnet-20240620 model for the main chat
## Use claude-3-5-sonnet-20241022 model for the main chat
#sonnet: false
## Use claude-3-5-haiku-20241022 model for the main chat
#haiku: false
## Use gpt-4-0613 model for the main chat
#4: false
@@ -98,6 +109,12 @@ cog.outl("```")
## Use deepseek/deepseek-coder model for the main chat
#deepseek: false
## Use o1-mini model for the main chat
#o1-mini: false
## Use o1-preview model for the main chat
#o1-preview: false
#################
# Model Settings:
@@ -131,17 +148,29 @@ cog.outl("```")
## Specify what edit format the LLM should use (default depends on model)
#edit-format: xxx
## Use architect edit format for the main chat
#architect: false
## Specify the model to use for commit messages and chat history summarization (default depends on --model)
#weak-model: xxx
## Specify the model to use for editor tasks (default depends on --model)
#editor-model: xxx
## Specify the edit format for the editor model (default: depends on editor model)
#editor-edit-format: xxx
## Only work with models that have meta-data available (default: True)
#show-model-warnings: true
## Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
#map-tokens: xxx
## Soft limit on tokens for chat history, after which summarization begins. If unspecified, defaults to the model's max_chat_history_tokens.
#max-chat-history-tokens: xxx
## Control how often the repo map is refreshed (default: auto)
#map-refresh: auto
## Specify the .env file to load (default: .env in git root)
#env-file: .env
#################
# Cache Settings:
## Enable caching of prompts (default: False)
#cache-prompts: false
@@ -149,15 +178,18 @@ cog.outl("```")
## Number of times to ping at 5min intervals to keep prompt cache warm (default: 0)
#cache-keepalive-pings: false
###################
# Repomap Settings:
## Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
#map-tokens: xxx
## Control how often the repo map is refreshed. Options: auto, always, files, manual (default: auto)
#map-refresh: auto
## Multiplier for map tokens when no files are specified (default: 2)
#map-multiplier-no-files: true
## Maximum number of tokens to use for chat history. If not specified, uses the model's max_chat_history_tokens.
#max-chat-history-tokens: xxx
## Specify the .env file to load (default: .env in git root)
#env-file: .env
################
# History Files:
@@ -203,6 +235,18 @@ cog.outl("```")
## Set the color for assistant output (default: #0088ff)
#assistant-output-color: #0088ff
## Set the color for the completion menu (default: terminal's default text color)
#completion-menu-color: xxx
## Set the background color for the completion menu (default: terminal's default background color)
#completion-menu-bg-color: xxx
## Set the color for the current item in the completion menu (default: terminal's default background color)
#completion-menu-current-color: xxx
## Set the background color for the current item in the completion menu (default: terminal's default text color)
#completion-menu-current-bg-color: xxx
## Set the markdown code theme (default: default, other options include monokai, solarized-dark, solarized-light)
#code-theme: default
@@ -251,6 +295,9 @@ cog.outl("```")
## Perform a dry run without modifying files (default: False)
#dry-run: false
## Skip the sanity check for the git repository (default: False)
#skip-sanity-check-repo: false
########################
# Fixing and committing:
@@ -260,7 +307,10 @@ cog.outl("```")
## Specify lint commands to run for different languages, eg: "python: flake8 --select=..." (can be used multiple times)
#lint-cmd: xxx
## Specify multiple values like this:
#lint-cmd: [xxx,yyyy,zzz]
#lint-cmd:
# - xxx
# - yyy
# - zzz
## Enable/disable automatic linting after changes (default: True)
#auto-lint: true
@@ -274,25 +324,40 @@ cog.outl("```")
## Run tests and fix problems found
#test: false
############
# Analytics:
## Enable/disable analytics for one session (default: False)
#analytics: false
## Specify a file to log analytics events
#analytics-log: xxx
## Permanently disable analytics
#analytics-disable: false
#################
# Other Settings:
## specify a file to edit (can be used multiple times)
#file: xxx
## Specify multiple values like this:
#file: [xxx,yyyy,zzz]
#file:
# - xxx
# - yyy
# - zzz
## specify a read-only file (can be used multiple times)
#read: xxx
## Specify multiple values like this:
#read: [xxx,yyyy,zzz]
#read:
# - xxx
# - yyy
# - zzz
## Use VI editing mode in the terminal (default: False)
#vim: false
## Specify the language for voice using ISO 639-1 code (default: auto)
#voice-language: en
## Specify the language to use in the chat (default: None, uses system settings)
#chat-language: xxx
@@ -314,8 +379,11 @@ cog.outl("```")
## Apply the changes from the given file instead of running the chat (debug)
#apply: xxx
## Apply clipboard contents as edits using the main model's editor format
#apply-clipboard-edits: false
## Always say yes to every confirmation
#yes: false
#yes-always: false
## Enable verbose output
#verbose: false
@@ -335,16 +403,31 @@ cog.outl("```")
## Specify a file containing the message to send the LLM, process reply, then exit (disables chat mode)
#message-file: xxx
## Load and execute /commands from a file on launch
#load: xxx
## Specify the encoding for input and output (default: utf-8)
#encoding: utf-8
## Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory)
#config: xxx
## Run aider in your browser
## Run aider in your browser (default: False)
#gui: false
## Enable/disable suggesting shell commands (default: True)
#suggest-shell-commands: true
## Enable/disable fancy input with history and completion (default: True)
#fancy-input: true
#################
# Voice Settings:
## Audio format for voice recording (default: wav). webm and mp3 require ffmpeg
#voice-format: wav
## Specify the language for voice using ISO 639-1 code (default: auto)
#voice-language: en
```
<!--[[[end]]]-->

View File

@@ -28,7 +28,7 @@ If the files above exist, they will be loaded in that order. Files loaded last w
Below is a sample `.env` file, which you
can also
[download from GitHub](https://github.com/paul-gauthier/aider/blob/main/aider/website/assets/sample.env).
[download from GitHub](https://github.com/Aider-AI/aider/blob/main/aider/website/assets/sample.env).
<!--[[[cog
from aider.args import get_sample_dotenv
@@ -75,9 +75,12 @@ cog.outl("```")
## Use claude-3-opus-20240229 model for the main chat
#AIDER_OPUS=
## Use claude-3-5-sonnet-20240620 model for the main chat
## Use claude-3-5-sonnet-20241022 model for the main chat
#AIDER_SONNET=
## Use claude-3-5-haiku-20241022 model for the main chat
#AIDER_HAIKU=
## Use gpt-4-0613 model for the main chat
#AIDER_4=
@@ -96,6 +99,12 @@ cog.outl("```")
## Use deepseek/deepseek-coder model for the main chat
#AIDER_DEEPSEEK=
## Use o1-mini model for the main chat
#AIDER_O1_MINI=
## Use o1-preview model for the main chat
#AIDER_O1_PREVIEW=
#################
# Model Settings:
@@ -129,17 +138,29 @@ cog.outl("```")
## Specify what edit format the LLM should use (default depends on model)
#AIDER_EDIT_FORMAT=
## Use architect edit format for the main chat
#AIDER_ARCHITECT=
## Specify the model to use for commit messages and chat history summarization (default depends on --model)
#AIDER_WEAK_MODEL=
## Specify the model to use for editor tasks (default depends on --model)
#AIDER_EDITOR_MODEL=
## Specify the edit format for the editor model (default: depends on editor model)
#AIDER_EDITOR_EDIT_FORMAT=
## Only work with models that have meta-data available (default: True)
#AIDER_SHOW_MODEL_WARNINGS=true
## Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
#AIDER_MAP_TOKENS=
## Soft limit on tokens for chat history, after which summarization begins. If unspecified, defaults to the model's max_chat_history_tokens.
#AIDER_MAX_CHAT_HISTORY_TOKENS=
## Control how often the repo map is refreshed (default: auto)
#AIDER_MAP_REFRESH=auto
## Specify the .env file to load (default: .env in git root)
#AIDER_ENV_FILE=.env
#################
# Cache Settings:
## Enable caching of prompts (default: False)
#AIDER_CACHE_PROMPTS=false
@@ -147,15 +168,18 @@ cog.outl("```")
## Number of times to ping at 5min intervals to keep prompt cache warm (default: 0)
#AIDER_CACHE_KEEPALIVE_PINGS=false
###################
# Repomap Settings:
## Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
#AIDER_MAP_TOKENS=
## Control how often the repo map is refreshed. Options: auto, always, files, manual (default: auto)
#AIDER_MAP_REFRESH=auto
## Multiplier for map tokens when no files are specified (default: 2)
#AIDER_MAP_MULTIPLIER_NO_FILES=true
## Maximum number of tokens to use for chat history. If not specified, uses the model's max_chat_history_tokens.
#AIDER_MAX_CHAT_HISTORY_TOKENS=
## Specify the .env file to load (default: .env in git root)
#AIDER_ENV_FILE=.env
################
# History Files:
@@ -201,6 +225,18 @@ cog.outl("```")
## Set the color for assistant output (default: #0088ff)
#AIDER_ASSISTANT_OUTPUT_COLOR=#0088ff
## Set the color for the completion menu (default: terminal's default text color)
#AIDER_COMPLETION_MENU_COLOR=
## Set the background color for the completion menu (default: terminal's default background color)
#AIDER_COMPLETION_MENU_BG_COLOR=
## Set the color for the current item in the completion menu (default: terminal's default background color)
#AIDER_COMPLETION_MENU_CURRENT_COLOR=
## Set the background color for the current item in the completion menu (default: terminal's default text color)
#AIDER_COMPLETION_MENU_CURRENT_BG_COLOR=
## Set the markdown code theme (default: default, other options include monokai, solarized-dark, solarized-light)
#AIDER_CODE_THEME=default
@@ -249,6 +285,9 @@ cog.outl("```")
## Perform a dry run without modifying files (default: False)
#AIDER_DRY_RUN=false
## Skip the sanity check for the git repository (default: False)
#AIDER_SKIP_SANITY_CHECK_REPO=false
########################
# Fixing and committing:
@@ -270,6 +309,18 @@ cog.outl("```")
## Run tests and fix problems found
#AIDER_TEST=false
############
# Analytics:
## Enable/disable analytics for one session (default: False)
#AIDER_ANALYTICS=false
## Specify a file to log analytics events
#AIDER_ANALYTICS_LOG=
## Permanently disable analytics
#AIDER_ANALYTICS_DISABLE=false
#################
# Other Settings:
@@ -282,9 +333,6 @@ cog.outl("```")
## Use VI editing mode in the terminal (default: False)
#AIDER_VIM=false
## Specify the language for voice using ISO 639-1 code (default: auto)
#AIDER_VOICE_LANGUAGE=en
## Specify the language to use in the chat (default: None, uses system settings)
#AIDER_CHAT_LANGUAGE=
@@ -303,8 +351,11 @@ cog.outl("```")
## Apply the changes from the given file instead of running the chat (debug)
#AIDER_APPLY=
## Apply clipboard contents as edits using the main model's editor format
#AIDER_APPLY_CLIPBOARD_EDITS=false
## Always say yes to every confirmation
#AIDER_YES=
#AIDER_YES_ALWAYS=
## Enable verbose output
#AIDER_VERBOSE=false
@@ -324,14 +375,29 @@ cog.outl("```")
## Specify a file containing the message to send the LLM, process reply, then exit (disables chat mode)
#AIDER_MESSAGE_FILE=
## Load and execute /commands from a file on launch
#AIDER_LOAD=
## Specify the encoding for input and output (default: utf-8)
#AIDER_ENCODING=utf-8
## Run aider in your browser
## Run aider in your browser (default: False)
#AIDER_GUI=false
## Enable/disable suggesting shell commands (default: True)
#AIDER_SUGGEST_SHELL_COMMANDS=true
## Enable/disable fancy input with history and completion (default: True)
#AIDER_FANCY_INPUT=true
#################
# Voice Settings:
## Audio format for voice recording (default: wav). webm and mp3 require ffmpeg
#AIDER_VOICE_FORMAT=wav
## Specify the language for voice using ISO 639-1 code (default: auto)
#AIDER_VOICE_LANGUAGE=en
```
<!--[[[end]]]-->

View File

@@ -26,26 +26,30 @@ cog.out(get_md_help())
]]]-->
```
usage: aider [-h] [--openai-api-key] [--anthropic-api-key] [--model]
[--opus] [--sonnet] [--4] [--4o] [--mini] [--4-turbo]
[--35turbo] [--deepseek] [--list-models]
[--openai-api-base] [--openai-api-type]
[--openai-api-version] [--openai-api-deployment-id]
[--openai-organization-id] [--model-settings-file]
[--model-metadata-file]
[--opus] [--sonnet] [--haiku] [--4] [--4o] [--mini]
[--4-turbo] [--35turbo] [--deepseek] [--o1-mini]
[--o1-preview] [--list-models] [--openai-api-base]
[--openai-api-type] [--openai-api-version]
[--openai-api-deployment-id] [--openai-organization-id]
[--model-settings-file] [--model-metadata-file]
[--verify-ssl | --no-verify-ssl] [--edit-format]
[--weak-model]
[--architect] [--weak-model] [--editor-model]
[--editor-edit-format]
[--show-model-warnings | --no-show-model-warnings]
[--map-tokens] [--map-refresh]
[--cache-prompts | --no-cache-prompts]
[--cache-keepalive-pings] [--map-multiplier-no-files]
[--max-chat-history-tokens] [--env-file]
[--cache-prompts | --no-cache-prompts]
[--cache-keepalive-pings] [--map-tokens]
[--map-refresh] [--map-multiplier-no-files]
[--input-history-file] [--chat-history-file]
[--restore-chat-history | --no-restore-chat-history]
[--llm-history-file] [--dark-mode] [--light-mode]
[--pretty | --no-pretty] [--stream | --no-stream]
[--user-input-color] [--tool-output-color]
[--tool-error-color] [--tool-warning-color]
[--assistant-output-color] [--code-theme]
[--assistant-output-color] [--completion-menu-color]
[--completion-menu-bg-color]
[--completion-menu-current-color]
[--completion-menu-current-bg-color] [--code-theme]
[--show-diffs] [--git | --no-git]
[--gitignore | --no-gitignore] [--aiderignore]
[--subtree-only] [--auto-commits | --no-auto-commits]
@@ -55,15 +59,21 @@ usage: aider [-h] [--openai-api-key] [--anthropic-api-key] [--model]
[--attribute-commit-message-author | --no-attribute-commit-message-author]
[--attribute-commit-message-committer | --no-attribute-commit-message-committer]
[--commit] [--commit-prompt] [--dry-run | --no-dry-run]
[--lint] [--lint-cmd] [--auto-lint | --no-auto-lint]
[--test-cmd] [--auto-test | --no-auto-test] [--test]
[--file] [--read] [--vim] [--voice-language]
[--skip-sanity-check-repo] [--lint] [--lint-cmd]
[--auto-lint | --no-auto-lint] [--test-cmd]
[--auto-test | --no-auto-test] [--test]
[--analytics | --no-analytics] [--analytics-log]
[--analytics-disable] [--file] [--read] [--vim]
[--chat-language] [--version] [--just-check-update]
[--check-update | --no-check-update]
[--install-main-branch] [--upgrade] [--apply] [--yes]
[-v] [--show-repo-map] [--show-prompts] [--exit]
[--message] [--message-file] [--encoding] [-c] [--gui]
[--install-main-branch] [--upgrade] [--apply]
[--apply-clipboard-edits] [--yes-always] [-v]
[--show-repo-map] [--show-prompts] [--exit] [--message]
[--message-file] [--load] [--encoding] [-c]
[--gui | --no-gui | --browser | --no-browser]
[--suggest-shell-commands | --no-suggest-shell-commands]
[--fancy-input | --no-fancy-input] [--voice-format]
[--voice-language]
```
@@ -94,9 +104,13 @@ Use claude-3-opus-20240229 model for the main chat
Environment variable: `AIDER_OPUS`
### `--sonnet`
Use claude-3-5-sonnet-20240620 model for the main chat
Use claude-3-5-sonnet-20241022 model for the main chat
Environment variable: `AIDER_SONNET`
### `--haiku`
Use claude-3-5-haiku-20241022 model for the main chat
Environment variable: `AIDER_HAIKU`
### `--4`
Use gpt-4-0613 model for the main chat
Environment variable: `AIDER_4`
@@ -129,6 +143,14 @@ Aliases:
Use deepseek/deepseek-coder model for the main chat
Environment variable: `AIDER_DEEPSEEK`
### `--o1-mini`
Use o1-mini model for the main chat
Environment variable: `AIDER_O1_MINI`
### `--o1-preview`
Use o1-preview model for the main chat
Environment variable: `AIDER_O1_PREVIEW`
## Model Settings:
### `--list-models MODEL`
@@ -183,10 +205,22 @@ Aliases:
- `--edit-format EDIT_FORMAT`
- `--chat-mode EDIT_FORMAT`
### `--architect`
Use architect edit format for the main chat
Environment variable: `AIDER_ARCHITECT`
### `--weak-model WEAK_MODEL`
Specify the model to use for commit messages and chat history summarization (default depends on --model)
Environment variable: `AIDER_WEAK_MODEL`
### `--editor-model EDITOR_MODEL`
Specify the model to use for editor tasks (default depends on --model)
Environment variable: `AIDER_EDITOR_MODEL`
### `--editor-edit-format EDITOR_EDIT_FORMAT`
Specify the edit format for the editor model (default: depends on editor model)
Environment variable: `AIDER_EDITOR_EDIT_FORMAT`
### `--show-model-warnings`
Only work with models that have meta-data available (default: True)
Default: True
@@ -195,14 +229,16 @@ Aliases:
- `--show-model-warnings`
- `--no-show-model-warnings`
### `--map-tokens VALUE`
Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
Environment variable: `AIDER_MAP_TOKENS`
### `--max-chat-history-tokens VALUE`
Soft limit on tokens for chat history, after which summarization begins. If unspecified, defaults to the model's max_chat_history_tokens.
Environment variable: `AIDER_MAX_CHAT_HISTORY_TOKENS`
### `--map-refresh VALUE`
Control how often the repo map is refreshed (default: auto)
Default: auto
Environment variable: `AIDER_MAP_REFRESH`
### `--env-file ENV_FILE`
Specify the .env file to load (default: .env in git root)
Default: .env
Environment variable: `AIDER_ENV_FILE`
## Cache Settings:
### `--cache-prompts`
Enable caching of prompts (default: False)
@@ -217,20 +253,22 @@ Number of times to ping at 5min intervals to keep prompt cache warm (default: 0)
Default: 0
Environment variable: `AIDER_CACHE_KEEPALIVE_PINGS`
## Repomap Settings:
### `--map-tokens VALUE`
Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)
Environment variable: `AIDER_MAP_TOKENS`
### `--map-refresh VALUE`
Control how often the repo map is refreshed. Options: auto, always, files, manual (default: auto)
Default: auto
Environment variable: `AIDER_MAP_REFRESH`
### `--map-multiplier-no-files VALUE`
Multiplier for map tokens when no files are specified (default: 2)
Default: 2
Environment variable: `AIDER_MAP_MULTIPLIER_NO_FILES`
### `--max-chat-history-tokens VALUE`
Maximum number of tokens to use for chat history. If not specified, uses the model's max_chat_history_tokens.
Environment variable: `AIDER_MAX_CHAT_HISTORY_TOKENS`
### `--env-file ENV_FILE`
Specify the .env file to load (default: .env in git root)
Default: .env
Environment variable: `AIDER_ENV_FILE`
## History Files:
### `--input-history-file INPUT_HISTORY_FILE`
@@ -307,6 +345,22 @@ Set the color for assistant output (default: #0088ff)
Default: #0088ff
Environment variable: `AIDER_ASSISTANT_OUTPUT_COLOR`
### `--completion-menu-color COLOR`
Set the color for the completion menu (default: terminal's default text color)
Environment variable: `AIDER_COMPLETION_MENU_COLOR`
### `--completion-menu-bg-color COLOR`
Set the background color for the completion menu (default: terminal's default background color)
Environment variable: `AIDER_COMPLETION_MENU_BG_COLOR`
### `--completion-menu-current-color COLOR`
Set the color for the current item in the completion menu (default: terminal's default background color)
Environment variable: `AIDER_COMPLETION_MENU_CURRENT_COLOR`
### `--completion-menu-current-bg-color COLOR`
Set the background color for the current item in the completion menu (default: terminal's default text color)
Environment variable: `AIDER_COMPLETION_MENU_CURRENT_BG_COLOR`
### `--code-theme VALUE`
Set the markdown code theme (default: default, other options include monokai, solarized-dark, solarized-light)
Default: default
@@ -410,6 +464,11 @@ Aliases:
- `--dry-run`
- `--no-dry-run`
### `--skip-sanity-check-repo`
Skip the sanity check for the git repository (default: False)
Default: False
Environment variable: `AIDER_SKIP_SANITY_CHECK_REPO`
## Fixing and committing:
### `--lint`
@@ -448,6 +507,25 @@ Run tests and fix problems found
Default: False
Environment variable: `AIDER_TEST`
## Analytics:
### `--analytics`
Enable/disable analytics for one session (default: False)
Default: False
Environment variable: `AIDER_ANALYTICS`
Aliases:
- `--analytics`
- `--no-analytics`
### `--analytics-log ANALYTICS_LOG_FILE`
Specify a file to log analytics events
Environment variable: `AIDER_ANALYTICS_LOG`
### `--analytics-disable`
Permanently disable analytics
Default: False
Environment variable: `AIDER_ANALYTICS_DISABLE`
## Other Settings:
### `--file FILE`
@@ -463,11 +541,6 @@ Use VI editing mode in the terminal (default: False)
Default: False
Environment variable: `AIDER_VIM`
### `--voice-language VOICE_LANGUAGE`
Specify the language for voice using ISO 639-1 code (default: auto)
Default: en
Environment variable: `AIDER_VOICE_LANGUAGE`
### `--chat-language CHAT_LANGUAGE`
Specify the language to use in the chat (default: None, uses system settings)
Environment variable: `AIDER_CHAT_LANGUAGE`
@@ -505,9 +578,14 @@ Aliases:
Apply the changes from the given file instead of running the chat (debug)
Environment variable: `AIDER_APPLY`
### `--yes`
### `--apply-clipboard-edits`
Apply clipboard contents as edits using the main model's editor format
Default: False
Environment variable: `AIDER_APPLY_CLIPBOARD_EDITS`
### `--yes-always`
Always say yes to every confirmation
Environment variable: `AIDER_YES`
Environment variable: `AIDER_YES_ALWAYS`
### `--verbose`
Enable verbose output
@@ -547,6 +625,10 @@ Aliases:
- `--message-file MESSAGE_FILE`
- `-f MESSAGE_FILE`
### `--load LOAD_FILE`
Load and execute /commands from a file on launch
Environment variable: `AIDER_LOAD`
### `--encoding VALUE`
Specify the encoding for input and output (default: utf-8)
Default: utf-8
@@ -559,12 +641,14 @@ Aliases:
- `--config CONFIG_FILE`
### `--gui`
Run aider in your browser
Run aider in your browser (default: False)
Default: False
Environment variable: `AIDER_GUI`
Aliases:
- `--gui`
- `--no-gui`
- `--browser`
- `--no-browser`
### `--suggest-shell-commands`
Enable/disable suggesting shell commands (default: True)
@@ -573,4 +657,24 @@ Environment variable: `AIDER_SUGGEST_SHELL_COMMANDS`
Aliases:
- `--suggest-shell-commands`
- `--no-suggest-shell-commands`
### `--fancy-input`
Enable/disable fancy input with history and completion (default: True)
Default: True
Environment variable: `AIDER_FANCY_INPUT`
Aliases:
- `--fancy-input`
- `--no-fancy-input`
## Voice Settings:
### `--voice-format VOICE_FORMAT`
Audio format for voice recording (default: wav). webm and mp3 require ffmpeg
Default: wav
Environment variable: `AIDER_VOICE_FORMAT`
### `--voice-language VOICE_LANGUAGE`
Specify the language for voice using ISO 639-1 code (default: auto)
Default: en
Environment variable: `AIDER_VOICE_LANGUAGE`
<!--[[[end]]]-->

View File

@@ -112,9 +112,9 @@ like functions and methods also include their signatures.
Here's a
sample of the map of the aider repo, just showing the maps of
[main.py](https://github.com/paul-gauthier/aider/blob/main/aider/main.py)
[main.py](https://github.com/Aider-AI/aider/blob/main/aider/main.py)
and
[io.py](https://github.com/paul-gauthier/aider/blob/main/aider/io.py)
[io.py](https://github.com/Aider-AI/aider/blob/main/aider/io.py)
:
```

View File

@@ -30,7 +30,7 @@ current chat to build a compact
Adding a bunch of files that are mostly irrelevant to the
task at hand will often distract or confuse the LLM.
The LLM will give worse coding results, and sometimese even fail to correctly edit files.
Addings extra files will also increase the token costs on your OpenAI invoice.
Addings extra files will also increase your token costs.
Again, it's usually best to just add the files to the chat that will need to be modified.
If you still wish to add lots of files to the chat, you can:
@@ -92,6 +92,40 @@ the functionality you want to use in repo B.
Then when you're using aider in repo B, you can
`/read` in that script.
## How do I turn on the repository map?
Depending on the LLM you are using, aider may launch with the repo map disabled by default:
```
Repo-map: disabled
```
This is because weaker models get easily overwhelmed and confused by the content of the
repo map. They sometimes mistakenly try to edit the code in the repo map.
The repo map is usually disabled for a good reason.
If you would like to force it on, you can run aider with `--map-tokens 1024`.
## How do I include the git history in the context?
When starting a fresh aider session, you can include recent git history in the chat context. This can be useful for providing the LLM with information about recent changes. To do this:
1. Use the `/run` command with `git diff` to show recent changes:
```
/run git diff HEAD~1
```
This will include the diff of the last commit in the chat history.
2. To include diffs from multiple commits, increase the number after the tilde:
```
/run git diff HEAD~3
```
This will show changes from the last three commits.
Remember, the chat history already includes recent changes made during the current session, so this tip is most useful when starting a new aider session and you want to provide context about recent work.
{: .tip }
The `/git` command will not work for this purpose, as its output is not included in the chat.
## How can I run aider locally from source code?
@@ -99,7 +133,7 @@ To run the project locally, follow these steps:
```
# Clone the repository
git clone git@github.com:paul-gauthier/aider.git
git clone git@github.com:Aider-AI/aider.git
# Navigate to the project directory
cd aider
@@ -116,7 +150,6 @@ python -m aider
## Can I change the system prompts that aider uses?
Aider is set up to support different system prompts and edit formats
@@ -157,18 +190,55 @@ You can also refer to the
[instructions for installing a development version of aider](https://aider.chat/docs/install/optional.html#install-the-development-version-of-aider).
## How are the "aider wrote xx% of code" stats computed?
[Aider is tightly integrated with git](/docs/git.html) so all
one of aider's code changes are committed to the repo with proper attribution.
The
[stats are computed](https://github.com/Aider-AI/aider/blob/main/scripts/blame.py)
by doing something like `git blame` on the repo,
and counting up who wrote all the new lines of code in each release.
Only lines in source code files are counted, not documentation or prompt files.
## Can I share my aider chat transcript?
Yes, you can now share aider chat logs in a pretty way.
1. Copy the markdown logs you want to share from `.aider.chat.history.md` and make a github gist. Or publish the raw markdown logs on the web any way you'd like.
https://gist.github.com/paul-gauthier/2087ab8b64034a078c0a209440ac8be0
```
https://gist.github.com/Aider-AI/2087ab8b64034a078c0a209440ac8be0
```
2. Take the gist URL and append it to:
https://aider.chat/share/?mdurl=
```
https://aider.chat/share/?mdurl=
```
This will give you a URL like this, which shows the chat history like you'd see in a terminal:
https://aider.chat/share/?mdurl=https://gist.github.com/paul-gauthier/2087ab8b64034a078c0a209440ac8be0
```
https://aider.chat/share/?mdurl=https://gist.github.com/Aider-AI/2087ab8b64034a078c0a209440ac8be0
```
## Can I edit files myself while aider is running?
Yes. Aider always reads the latest copy of files from the file
system when you send each message.
While you're waiting for aider's reply to complete, it's probably unwise to
edit files that you've added to the chat.
Your edits and aider's edits might conflict.
## What is Aider AI LLC?
Aider AI LLC is the company behind the aider AI coding tool.
Aider is
[open source and available on GitHub](https://github.com/Aider-AI/aider)
under an
[Apache 2.0 license](https://github.com/Aider-AI/aider/blob/main/LICENSE.txt).
<div style="height:80vh"></div>

View File

@@ -1,6 +1,6 @@
---
parent: More info
nav_order: 800
nav_order: 100
description: Aider is tightly integrated with git.
---
@@ -22,9 +22,16 @@ This keeps your edits separate from aider's edits, and makes sure you never lose
## In-chat commands
Aider also allows you to use in-chat commands to `/diff` or `/undo` the last change.
To do more complex management of your git history, you cat use raw `git` commands,
either by using `/git` within the chat, or with standard git tools outside of aider.
Aider also allows you to use
[in-chat commands](/docs/usage/commands.html)
to perform git operations:
- `/diff` will show all the file changes since the last message you sent.
- `/undo` will undo and discard the last change.
- `/commit` to commit all dirty changes with a sensible commit message.
- `/git` will let you run raw git commands to do more complex management of your git history.
You can also manage your git history outside of aider with your preferred git tools.
## Disabling git integration
@@ -36,15 +43,18 @@ While it is not recommended, you can disable aider's use of git in a few ways:
## Commit messages
Aider sends the `--weak-model` a copy of the diffs and the chat history
and asks it to produce a commit message.
By default, aider creates commit messages which follow
[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/).
You can customize the
[commit prompt](https://github.com/paul-gauthier/aider/blob/main/aider/prompts.py#L5)
[commit prompt](https://github.com/Aider-AI/aider/blob/main/aider/prompts.py#L5)
with the `--commit-prompt` option.
You can place that on the command line, or
[configure it via a config file or environment variables](https://aider.chat/docs/config.html).
## Commit attribution
Aider marks commits that it either authored or committed.

View File

@@ -9,6 +9,10 @@ nav_order: 10
- TOC
{:toc}
## Python version
Aider currently works with python 3.9-3.12.
## Install git
Make sure you have git installed.
@@ -31,7 +35,7 @@ To work with Anthropic's models like Claude 3.5 Sonnet you need a paid
```
# Install aider
python -m pip install aider-chat
python -m pip install -U --upgrade-strategy only-if-needed aider-chat
# To work with GPT-4o:
$ aider --4o --openai-api-key sk-xxx...
@@ -44,7 +48,7 @@ $ aider --sonnet --anthropic-api-key sk-xxx...
```
# Install aider
python -m pip install aider-chat
python -m pip install -U --upgrade-strategy only-if-needed aider-chat
# To work with GPT-4o:
$ aider --4o --openai-api-key sk-xxx...

View File

@@ -74,15 +74,11 @@ joshuavial also confirmed that aider works inside a VS Code terminal window.
Aider detects if it is running inside VSCode and turns off pretty/color output,
since the VSCode terminal doesn't seem to support it well.
[MattFlower](https://github.com/MattFlower) provided a VSCode plugin for aider:
[https://marketplace.visualstudio.com/items?itemName=MattFlower.aider](https://marketplace.visualstudio.com/items?itemName=MattFlower.aider)
### Other editors
If you are interested in creating an aider plugin for your favorite editor,
please let me know by opening a
[GitHub issue](https://github.com/paul-gauthier/aider/issues).
[GitHub issue](https://github.com/Aider-AI/aider/issues).
## Install the development version of aider
@@ -91,7 +87,7 @@ If you want the very latest development version of aider
you can install directly from GitHub:
```
python -m pip install --upgrade git+https://github.com/paul-gauthier/aider.git
python -m pip install --upgrade git+https://github.com/Aider-AI/aider.git
```
If you've git cloned the aider repository already, you can install "live" from your local copy. This is mostly useful if you are developing aider and want your current modifications to take effect immediately.

View File

@@ -1,6 +1,6 @@
---
parent: More info
nav_order: 900
nav_order: 200
description: Aider supports pretty much all popular coding languages.
---
# Supported languages
@@ -33,7 +33,7 @@ then it should be possible to add repo map support.
To build a repo map, aider needs the `tags.scm` file
from the given language's tree-sitter grammar.
If you can find and share that file in a
[GitHub issue](https://github.com/paul-gauthier/aider/issues),
[GitHub issue](https://github.com/Aider-AI/aider/issues),
then it may be possible to add repo map support.
If aider doesn't support linting, it will be complicated to

View File

@@ -55,14 +55,85 @@ The model also has to successfully apply all its changes to the source file with
</tbody>
</table>
<canvas id="editChart" width="800" height="450" style="margin-top: 20px"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
var ctx = document.getElementById('editChart').getContext('2d');
const HIGHTLIGHT_MODEL = 'no no no no';
var leaderboardData = {
labels: [],
datasets: [{
label: 'Percent completed correctly',
data: [],
backgroundColor: function(context) {
const label = context.chart.data.labels[context.dataIndex] || '';
return (label && label.includes(HIGHTLIGHT_MODEL)) ? 'rgba(255, 99, 132, 0.2)' : 'rgba(54, 162, 235, 0.2)';
},
borderColor: function(context) {
const label = context.chart.data.labels[context.dataIndex] || '';
return (label && label.includes(HIGHTLIGHT_MODEL)) ? 'rgba(255, 99, 132, 1)' : 'rgba(54, 162, 235, 1)';
},
borderWidth: 1
}]
};
{% include leaderboard_graph.html
chart_id="editChart"
data=edit_sorted
row_prefix="edit-row"
pass_rate_key="pass_rate_2"
%}
var allData = [];
{% for row in edit_sorted %}
allData.push({
model: '{{ row.model }}',
pass_rate_2: {{ row.pass_rate_2 }},
percent_cases_well_formed: {{ row.percent_cases_well_formed }}
});
{% endfor %}
function updateChart() {
var selectedRows = document.querySelectorAll('tr.selected');
var showAll = selectedRows.length === 0;
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
allData.forEach(function(row, index) {
var rowElement = document.getElementById('edit-row-' + index);
if (showAll) {
rowElement.classList.remove('selected');
}
if (showAll || rowElement.classList.contains('selected')) {
leaderboardData.labels.push(row.model);
leaderboardData.datasets[0].data.push(row.pass_rate_2);
}
});
leaderboardChart.update();
}
var tableBody = document.querySelector('table tbody');
allData.forEach(function(row, index) {
var tr = tableBody.children[index];
tr.id = 'edit-row-' + index;
tr.style.cursor = 'pointer';
tr.onclick = function() {
this.classList.toggle('selected');
updateChart();
};
});
var leaderboardChart = new Chart(ctx, {
type: 'bar',
data: leaderboardData,
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
updateChart();
});
</script>
<style>
tr.selected {
color: #0056b3;
@@ -81,7 +152,7 @@ The model also has to successfully apply all its changes to the source file with
## Code refactoring leaderboard
[Aider's refactoring benchmark](https://github.com/paul-gauthier/refactor-benchmark) asks the LLM to refactor 89 large methods from large python classes. This is a more challenging benchmark, which tests the model's ability to output long chunks of code without skipping sections or making mistakes. It was developed to provoke and measure [GPT-4 Turbo's "lazy coding" habit](/2023/12/21/unified-diffs.html).
[Aider's refactoring benchmark](https://github.com/Aider-AI/refactor-benchmark) asks the LLM to refactor 89 large methods from large python classes. This is a more challenging benchmark, which tests the model's ability to output long chunks of code without skipping sections or making mistakes. It was developed to provoke and measure [GPT-4 Turbo's "lazy coding" habit](/2023/12/21/unified-diffs.html).
The refactoring benchmark requires a large context window to
work with large source files.
@@ -111,12 +182,78 @@ Therefore, results are available for fewer models.
</tbody>
</table>
{% include leaderboard_graph.html
chart_id="refacChart"
data=refac_sorted
row_prefix="refac-row"
pass_rate_key="pass_rate_1"
%}
<canvas id="refacChart" width="800" height="450" style="margin-top: 20px"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
var ctx = document.getElementById('refacChart').getContext('2d');
var leaderboardData = {
labels: [],
datasets: [{
label: 'Percent completed correctly',
data: [],
backgroundColor: 'rgba(54, 162, 235, 0.2)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1
}]
};
var allData = [];
{% for row in refac_sorted %}
allData.push({
model: '{{ row.model }}',
pass_rate_1: {{ row.pass_rate_1 }},
percent_cases_well_formed: {{ row.percent_cases_well_formed }}
});
{% endfor %}
function updateChart() {
var selectedRows = document.querySelectorAll('tr.selected');
var showAll = selectedRows.length === 0;
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
allData.forEach(function(row, index) {
var rowElement = document.getElementById('refac-row-' + index);
if (showAll) {
rowElement.classList.remove('selected');
}
if (showAll || rowElement.classList.contains('selected')) {
leaderboardData.labels.push(row.model);
leaderboardData.datasets[0].data.push(row.pass_rate_1);
}
});
leaderboardChart.update();
}
var tableBody = document.querySelectorAll('table tbody')[1];
allData.forEach(function(row, index) {
var tr = tableBody.children[index];
tr.id = 'refac-row-' + index;
tr.style.cursor = 'pointer';
tr.onclick = function() {
this.classList.toggle('selected');
updateChart();
};
});
var leaderboardChart = new Chart(ctx, {
type: 'bar',
data: leaderboardData,
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
updateChart();
});
</script>
## LLM code editing skill by model release date
@@ -151,10 +288,10 @@ since it is the easiest format for an LLM to use.
Contributions of benchmark results are welcome!
See the
[benchmark README](https://github.com/paul-gauthier/aider/blob/main/benchmark/README.md)
[benchmark README](https://github.com/Aider-AI/aider/blob/main/benchmark/README.md)
for information on running aider's code editing benchmarks.
Submit results by opening a PR with edits to the
[benchmark results data files](https://github.com/paul-gauthier/aider/blob/main/aider/website/_data/).
[benchmark results data files](https://github.com/Aider-AI/aider/blob/main/aider/website/_data/).
<p class="post-date">
@@ -181,6 +318,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.')}")
]]]-->
September 21, 2024.
November 11, 2024.
<!--[[[end]]]-->
</p>

View File

@@ -0,0 +1,111 @@
Individual Contributor License Agreement
Thank you for your interest in Aider AI LLC ("Aider AI").
To clarify the intellectual property license
granted with Contributions from any person or entity, Aider AI
must have on file a signed Contributor License Agreement ("CLA")
from each Contributor, indicating agreement with the license
terms below. This agreement is for your protection as a Contributor
as well as the protection of Aider AI and its users. It does not
change your rights to use your own Contributions for any other purpose.
Please complete and sign this Agreement. Read this document carefully
before signing and keep a copy for your records.
You accept and agree to the following terms and conditions for Your
Contributions (present and future) that you submit to Aider AI.
Except for the license granted herein to Aider AI and recipients
of software distributed by Aider AI, You reserve all right, title,
and interest in and to Your Contributions.
1. Definitions.
"You" (or "Your") shall mean the copyright owner or legal entity
authorized by the copyright owner that is making this Agreement
with Aider AI. For legal entities, the entity making a
Contribution and all other entities that control, are controlled
by, or are under common control with that entity are considered to
be a single Contributor. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"Contribution" shall mean any original work of authorship,
including any modifications or additions to an existing work, that
is intentionally submitted by You to Aider AI for inclusion
in, or documentation of, any of the products owned or managed by
Aider AI (the "Work"). For the purposes of this definition,
"submitted" means any form of electronic, verbal, or written
communication sent to Aider AI or its representatives,
including but not limited to communication on electronic mailing
lists, source code control systems, and issue tracking systems that
are managed by, or on behalf of, Aider AI for the purpose of
discussing and improving the Work, but excluding communication that
is conspicuously marked or otherwise designated in writing by You
as "Not a Contribution."
2. Grant of Copyright License. Subject to the terms and conditions of
this Agreement, You hereby grant to Aider AI and to
recipients of software distributed by Aider AI a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare derivative works of,
publicly display, publicly perform, sublicense, and distribute Your
Contributions and such derivative works.
3. Grant of Patent License. Subject to the terms and conditions of
this Agreement, You hereby grant to Aider AI and to
recipients of software distributed by Aider AI a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the
Work, where such license applies only to those patent claims
licensable by You that are necessarily infringed by Your
Contribution(s) alone or by combination of Your Contribution(s)
with the Work to which such Contribution(s) was submitted. If any
entity institutes patent litigation against You or any other entity
(including a cross-claim or counterclaim in a lawsuit) alleging
that your Contribution, or the Work to which you have contributed,
constitutes direct or contributory patent infringement, then any
patent licenses granted to that entity under this Agreement for
that Contribution or Work shall terminate as of the date such
litigation is filed.
4. You represent that you are legally entitled to grant the above
license. If your employer(s) has rights to intellectual property
that you create that includes your Contributions, you represent
that you have received permission to make Contributions on behalf
of that employer, that your employer has waived such rights for
your Contributions to Aider AI, or that your employer has
executed a separate Corporate CLA with Aider AI.
5. You represent that each of Your Contributions is Your original
creation (see section 7 for submissions on behalf of others). You
represent that Your Contribution submissions include complete
details of any third-party license or other restriction (including,
but not limited to, related patents and trademarks) of which you
are personally aware and which are associated with any part of Your
Contributions.
6. You are not expected to provide support for Your Contributions,
except to the extent You desire to provide support. You may provide
support for free, for a fee, or not at all. Unless required by
applicable law or agreed to in writing, You provide Your
Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied, including, without
limitation, any warranties or conditions of TITLE, NON-
INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
7. Should You wish to submit work that is not Your original creation,
You may submit it to Aider AI separately from any
Contribution, identifying the complete details of its source and of
any license or other restriction (including, but not limited to,
related patents, trademarks, and license agreements) of which you
are personally aware, and conspicuously marking the work as
"Submitted on behalf of a third-party: [named here]".
8. You agree to notify Aider AI of any facts or circumstances of
which you become aware that would make these representations
inaccurate in any respect.

View File

@@ -0,0 +1,104 @@
---
parent: More info
nav_order: 500
---
# Privacy policy
[Aider AI LLC](/docs/faq.html#what-is-aider-ai-llc)
(“Aider,” “we,” “our,” and/or “us”) values the privacy of individuals who use our website, programming tools, and related services (collectively, our “Services”). This privacy policy (the “Privacy Policy”) explains how we collect, use, and disclose information from users of our Services. By using our Services, you agree to the collection, use, disclosure, and procedures this Privacy Policy describes.
### Information We Collect
We may collect a variety of information from or about you or your devices from various sources, as described below.
### A. Information You Provide to Us.
**Communications.** If you contact us directly, we may receive additional information about you, such as your name, email address, the contents of a message or attachments that you may send to us, and other information you choose to provide.
### B. Information We Collect When You Use Our Services.
**Device Information.** We may receive information about the device and software you use to access our Services, including IP address, device type, device identifiers, web browser type and version, and operating system version.
**Usage Information.** We may automatically receive information about your interactions with our Services, like the pages or other content you view, referrer information (the website you visited before coming to our Services), and the dates and times of your visits.
**Analytics Information.** If you use our programming tools, we may receive information about your interactions with the tools, such as how often certain features or commands are used, information about exceptions and errors, and which large language models are used. This information is associated with a randomly generated identifier, not any directly identifiable user information such as your name or email address. Please see the “Your Choices” section below for information on how to disable the collection of this information.
**Information from Cookies and Other Tracking Technologies.** We and our third-party partners may collect information about your activities on our Services using cookies, pixel tags, SDKs, or other tracking technologies. Our third-party partners, such as analytics and security partners, may also use these technologies to collect information about your online activities over time and across different services.
### How We Use the Information We Collect
We use the information we collect:
- To provide, maintain, improve, and enhance our Services;
- To understand and analyze how you use our Services and develop new products, services, features, and functionality;
- To communicate with you, provide you with updates and other information relating to our Services, provide information that you request, respond to comments and questions, and otherwise provide customer support;
- To generate anonymized or aggregate data containing only de-identified, non-personal information that we may use for any lawful purposes such as to publish reports;
- To find and prevent fraud and abuse, and respond to trust and safety issues that may arise;
- For compliance purposes, including enforcing our legal rights, or as may be required by applicable laws and regulations or requested by any judicial process or governmental agency; and
- For other purposes for which we provide specific notice at the time the information is collected.
### How We Disclose the Information We Collect
**Affiliates.** We may disclose any information we receive to our current or future affiliates for any of the purposes described in this Privacy Policy.
**Vendors and Service Providers.** We may disclose any information we receive to vendors and service providers retained in connection with the provision of our Services.
**Analytics Partners.** We may use analytics services to collect and process certain analytics data to improve our Services, such as by improving the ability of our programming tools to work with LLMs, edit code, and complete user requests.
**As Required By Law and Similar Disclosures.** We may access, preserve, and disclose your information if we believe doing so is required or appropriate to: (a) comply with law enforcement requests and legal process, such as a court order or subpoena; (b) respond to your requests; or (c) protect your, our, or others rights, property, or safety. For the avoidance of doubt, the disclosure of your information may occur if you post any objectionable content on or through the Services.
**Merger, Sale, or Other Asset Transfers.** We may transfer your information to service providers, advisors, potential transactional partners, or other third parties in connection with the consideration, negotiation, or completion of a corporate transaction in which we are acquired by or merged with another company or we sell, liquidate, or transfer all or a portion of our assets. The use of your information following any of these events will be governed by the provisions of this Privacy Policy in effect at the time the applicable information was collected.
**Consent.** We may also disclose your information with your permission.
### Your Choices
**Analytics Information.** You can turn off analytics collection when using our programming tools. Please visit this
[documentation page](/docs/more/analytics.html)
for more information about the data collected and your options.
### Third Parties
Our Services may contain links to other websites, products, or services that we do not own or operate. We are not responsible for the privacy practices of these third parties. Please be aware that this Privacy Policy does not apply to your activities on these third-party services or any information you disclose to these third parties. We encourage you to read their privacy policies before providing any information to them.
### Security
We make reasonable efforts to protect your information by using physical and electronic safeguards designed to improve the security of the information we maintain. However, because no electronic transmission or storage of information can be entirely secure, we can make no guarantees as to the security or privacy of your information.
### Childrens Privacy
We do not knowingly collect, maintain, or use personal information from children under 18 years of age, and no part of our Service(s) is directed to children. If you learn that a child has provided us with personal information in violation of this Privacy Policy, then you may alert us at [INSERT EMAIL ADDRESS].
### International Visitors
Our Services are hosted in the United States and intended for visitors located within the United States. If you choose to use the Services from the European Union or other regions of the world with laws governing data collection and use that may differ from U.S. law, then please note that you are transferring your personal information outside of those regions to the U.S. for storage and processing. We may also transfer your data from the U.S. to other countries or regions in connection with storage and processing of data, fulfilling your requests, and operating the Services. By providing any information, including personal information, on or to the Services, you consent to such transfer, storage, and processing.
### Changes to this Privacy Policy
We will post any adjustments to the Privacy Policy on this page, and the revised version will be effective when it is posted. If we materially change the ways in which we use or disclose personal information previously collected from you through the Services, we will notify you through the Services, by email, or other communication.
### Contact Information
If you have any questions, comments, or concerns about our processing activities, please email us at privacy@aider.chat.
----
<p class="post-date">
Last updated
<!--[[[cog
import subprocess
import datetime
result = subprocess.run(['git', 'log', '-1', '--format=%ct', 'aider/website/docs/legal/privacy.md'], capture_output=True, text=True)
if result.returncode == 0:
timestamp = int(result.stdout.strip())
date = datetime.datetime.fromtimestamp(timestamp)
cog.out(f"{date.strftime('%B %d, %Y.')}")
]]]-->
October 31, 2024.
<!--[[[end]]]-->
</p>

View File

@@ -14,7 +14,7 @@ Aider has some built in shortcuts for the most popular Anthropic models and
has been tested and benchmarked to work well with them:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export ANTHROPIC_API_KEY=<key> # Mac/Linux
setx ANTHROPIC_API_KEY <key> # Windows, restart shell after setx

View File

@@ -8,7 +8,7 @@ nav_order: 500
Aider can connect to the OpenAI models on Azure.
```
python -m pip install aider-chat
python -m pip install -U aider-chat
# Mac/Linux:
export AZURE_API_KEY=<key>

View File

@@ -39,6 +39,14 @@ export AWS_PROFILE=your-profile
You can add these to your
[.env file](/docs/config/dotenv.html).
## Bedrock with `pipx` installation
The AWS Bedrock provider requires the `boto3` package in order to function correctly. To use aider installed via `pipx` with AWS Bedrock, you must add the `boto3` dependency to aider's virtual environment by running
```
pipx inject aider boto3
```
## Running Aider with Bedrock

View File

@@ -13,7 +13,7 @@ You'll need a [Cohere API key](https://dashboard.cohere.com/welcome/login).
To use **Command-R+**:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export COHERE_API_KEY=<key> # Mac/Linux
setx COHERE_API_KEY <key> # Windows, restart shell after setx

View File

@@ -9,7 +9,7 @@ Aider can connect to the DeepSeek.com API.
The DeepSeek Coder V2 model has a top score on aider's code editing benchmark.
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export DEEPSEEK_API_KEY=<key> # Mac/Linux
setx DEEPSEEK_API_KEY <key> # Windows, restart shell after setx

View File

@@ -12,7 +12,7 @@ with code editing capability that's comparable to GPT-3.5.
You'll need a [Gemini API key](https://aistudio.google.com/app/u/2/apikey).
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export GEMINI_API_KEY=<key> # Mac/Linux
setx GEMINI_API_KEY <key> # Windows, restart shell after setx

View File

@@ -13,7 +13,7 @@ You'll need a [Groq API key](https://console.groq.com/keys).
To use **Llama3 70B**:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export GROQ_API_KEY=<key> # Mac/Linux
setx GROQ_API_KEY <key> # Windows, restart shell after setx

View File

@@ -15,7 +15,7 @@ ollama pull <model>
ollama serve
# In another terminal window...
python -m pip install aider-chat
python -m pip install -U aider-chat
export OLLAMA_API_BASE=http://127.0.0.1:11434 # Mac/Linux
setx OLLAMA_API_BASE http://127.0.0.1:11434 # Windows, restart shell after setx

View File

@@ -8,7 +8,7 @@ nav_order: 500
Aider can connect to any LLM which is accessible via an OpenAI compatible API endpoint.
```
python -m pip install aider-chat
python -m pip install -U aider-chat
# Mac/Linux:
export OPENAI_API_BASE=<endpoint>

View File

@@ -14,7 +14,7 @@ Aider has some built in shortcuts for the most popular OpenAI models and
has been tested and benchmarked to work well with them:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export OPENAI_API_KEY=<key> # Mac/Linux
setx OPENAI_API_KEY <key> # Windows, restart shell after setx
@@ -22,12 +22,18 @@ setx OPENAI_API_KEY <key> # Windows, restart shell after setx
# Aider uses gpt-4o by default (or use --4o)
aider
# GPT-4 Turbo (1106)
aider --4-turbo
# GPT-4o
aider --4o
# GPT-3.5 Turbo
aider --35-turbo
# o1-mini
aider --model o1-mini
# o1-preview
aider --model o1-preview
# List models available from OpenAI
aider --list-models openai/
```

View File

@@ -9,7 +9,7 @@ Aider can connect to [models provided by OpenRouter](https://openrouter.ai/model
You'll need an [OpenRouter API key](https://openrouter.ai/keys).
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export OPENROUTER_API_KEY=<key> # Mac/Linux
setx OPENROUTER_API_KEY <key> # Windows, restart shell after setx
@@ -24,7 +24,7 @@ aider --list-models openrouter/
In particular, many aider users access Sonnet via OpenRouter:
```
python -m pip install aider-chat
python -m pip install -U aider-chat
export OPENROUTER_API_KEY=<key> # Mac/Linux
setx OPENROUTER_API_KEY <key> # Windows, restart shell after setx

View File

@@ -84,16 +84,17 @@ cog.out(''.join(lines))
- NVIDIA_NIM_API_KEY
- OLLAMA_API_KEY
- OPENAI_API_KEY
- OPENAI_LIKE_API_KEY
- OPENROUTER_API_KEY
- OR_API_KEY
- PALM_API_KEY
- PERPLEXITYAI_API_KEY
- PREDIBASE_API_KEY
- PROVIDER_API_KEY
- QDRANT_API_KEY
- REPLICATE_API_KEY
- TOGETHERAI_API_KEY
- VOLCENGINE_API_KEY
- VOYAGE_API_KEY
- XAI_API_KEY
- XINFERENCE_API_KEY
<!--[[[end]]]-->

View File

@@ -0,0 +1,110 @@
---
parent: More info
nav_order: 500
description: Opt-in, anonymous, no personal info.
---
# Analytics
Aider can collect anonymous analytics to help
improve aider's ability to work with LLMs, edit code and complete user requests.
## Opt-in, anonymous, no personal info
Analytics are only collected if you agree and opt-in.
Aider respects your privacy and never collects your code, chat messages, keys or
personal info.
Aider collects information on:
- which LLMs are used and with how many tokens,
- which of aider's edit formats are used,
- how often features and commands are used,
- information about exceptions and errors,
- etc
These analytics are associated with an anonymous,
randomly generated UUID4 user identifier.
This information helps improve aider by identifying which models, edit formats,
features and commands are most used.
It also helps uncover bugs that users are experiencing, so that they can be fixed
in upcoming releases.
## Enabling & disabling analytics
You can opt out of analytics forever by running this command one time:
```
aider --analytics-disable
```
To enable analytics for a single session, you can run aider with `--analytics`.
This will *not* have any effect if you have permanently disabled analytics with the previous command.
The first time, you will need to agree to opt-in.
```
aider --analytics
Aider respects your privacy and never collects your code, prompts, chats, keys or any personal
info.
For more info: https://aider.chat/docs/more/analytics.html
Allow collection of anonymous analytics to help improve aider? (Y)es/(N)o [Yes]:
```
If you've added `analytics: true` to your
[yaml config file](/docs/config/aider_conf.html),
you can disable analytics for a single session, you can run:
```
aider --no-analytics
```
## Details about data being collected
### Sample analytics data
To get a better sense of what type of data is collected, you can review some
[sample analytics logs](https://github.com/aider-ai/aider/blob/main/aider/website/assets/sample-analytics.jsonl).
These are the last 1,000 analytics events from the author's
personal use of aider, updated regularly.
### Analytics code
Since aider is open source, all the places where aider collects analytics
are visible in the source code.
They can be viewed using
[GitHub search](https://github.com/search?q=repo%3Aaider-ai%2Faider+%22.event%28%22&type=code).
### Logging and inspecting analytics
You can get a full log of the analytics that aider is collecting,
in case you would like to audit or inspect this data.
```
aider --analytics-log filename.jsonl
```
If you want to just log analytics without reporting them, you can do:
```
aider --analytics-log filename.jsonl --no-analytics
```
## Reporting issues
If you have concerns about any of the analytics that aider is collecting
or our data practices
please contact us by opening a
[GitHub Issue](https://github.com/aider-ai/aider/issues).
## Privacy policy
Please see aider's
[privacy policy](/docs/legal/privacy.html)
for more details.

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