Compare commits

...

2124 Commits

Author SHA1 Message Date
Paul Gauthier
3cb6ec9ddb set version to 0.76.2.dev 2025-03-10 17:41:32 -07:00
Paul Gauthier
c21619608e version bump to 0.76.1 2025-03-10 17:41:29 -07:00
Paul Gauthier
76a8789bc1 faster versionbump 2025-03-10 17:39:22 -07:00
Paul Gauthier
bbf538e06c copy 2025-03-10 17:15:29 -07:00
Paul Gauthier
d94ab3395b bump deps to pickup litellm bugfix for streaming openrouter resoning 2025-03-10 17:13:55 -07:00
Paul Gauthier
6d8457a61f copy 2025-03-10 16:28:57 -07:00
Paul Gauthier
303f8e1bc9 Merge branch 'main' of github.com:Aider-AI/aider 2025-03-10 16:27:32 -07:00
paul-gauthier
e638116a2f Merge pull request #3495 from maledorak/docs/remote-notifications
docs: Add remote notifications docs
2025-03-10 16:27:16 -07:00
Mariusz Korzekwa
5bac9133e6 docs: Add remote notifications docs 2025-03-11 00:19:51 +01:00
paul-gauthier
6fde4041ba Merge pull request #3488 from mopemope/ignore-permission-err
refactor: add ignore_permission_denied option to watch function
2025-03-10 13:47:12 -07:00
Paul Gauthier
d0c8b38ffc copy 2025-03-10 08:58:42 -07:00
Paul Gauthier
be7888ab18 copy 2025-03-10 08:51:05 -07:00
Paul Gauthier
11b71fa28c set version to 0.76.1.dev 2025-03-10 08:49:40 -07:00
Paul Gauthier
c838f9bfd5 version bump to 0.76.0 2025-03-10 08:47:14 -07:00
Paul Gauthier
8d073ce221 copy 2025-03-10 08:26:08 -07:00
Yutaka Matsubara
0be5d39453 refactor: add ignore_permission_denied option to watch function 2025-03-10 21:55:00 +09:00
Paul Gauthier
74ecdf2d3f copy 2025-03-09 13:43:41 -07:00
Paul Gauthier
20eacfab0f copy 2025-03-09 09:03:41 -07:00
Paul Gauthier
0396e15a3b refactor: remove unused debug dump() call 2025-03-09 08:49:30 -07:00
Paul Gauthier
3432a936ea copy 2025-03-09 08:47:41 -07:00
Paul Gauthier
87cd2b5dfe refactor: Remove deprecated reasoning_content attribute in test mock 2025-03-09 08:46:45 -07:00
Paul Gauthier (aider)
313b91edbe style: Fix trailing whitespace in test docstring 2025-03-09 08:43:51 -07:00
Paul Gauthier (aider)
a1f104cb4d style: wrap long lines in test docstrings and comments 2025-03-09 08:43:45 -07:00
Paul Gauthier (aider)
eadb8d5d0a style: fix linting issues in test_reasoning.py 2025-03-09 08:43:23 -07:00
Paul Gauthier (aider)
41ae947885 test: add tests for reasoning attribute handling in streaming and non-streaming cases 2025-03-09 08:43:18 -07:00
Paul Gauthier (aider)
84f610c0e9 style: Fix linting issues in test_reasoning.py 2025-03-09 08:40:40 -07:00
Paul Gauthier (aider)
0df959cf68 test: add reasoning attribute handling to MockStreamingChunk 2025-03-09 08:40:26 -07:00
Paul Gauthier
a15d10ea1e refactor: Simplify reasoning content handling in stream processing 2025-03-09 08:30:56 -07:00
Paul Gauthier (aider)
a37d6e86df feat: add support for both reasoning and reasoning_content fields 2025-03-09 08:24:12 -07:00
Paul Gauthier
a405063385 fix: Add fallback for reasoning_content attribute access 2025-03-09 08:24:09 -07:00
Paul Gauthier
f5a5b85e9d do not lint when updating history 2025-03-08 17:59:22 -08:00
Paul Gauthier
ba7d941e5b copy 2025-03-08 17:51:55 -08:00
Paul Gauthier
804a2d1af9 docs: improve deprecation warning message for remove_reasoning setting 2025-03-08 17:41:31 -08:00
Paul Gauthier (aider)
c1bc6e161e feat: add deprecation warning for remove_reasoning attribute 2025-03-08 17:40:03 -08:00
Paul Gauthier
af1b728b90 refactor: standardize reasoning_tag property name across model settings 2025-03-08 17:39:01 -08:00
Paul Gauthier (aider)
14e37a82ab fix: maintain backward compatibility for remove_reasoning field 2025-03-08 17:37:37 -08:00
Paul Gauthier (aider)
f8a7854efa fix: update model property name from remove_reasoning to reasoning_tag 2025-03-08 17:36:28 -08:00
Paul Gauthier (aider)
072ce87051 refactor: rename remove_reasoning to reasoning_tag in test files 2025-03-08 17:34:43 -08:00
Paul Gauthier (aider)
cac9b4460e style: fix whitespace in models.py 2025-03-08 17:33:44 -08:00
Paul Gauthier (aider)
67bf90a149 refactor: rename remove_reasoning to reasoning_tag with backward compatibility 2025-03-08 17:33:37 -08:00
Paul Gauthier
af8558b19e copy 2025-03-08 17:30:56 -08:00
Paul Gauthier
1903542f11 copy 2025-03-08 17:27:01 -08:00
Paul Gauthier (aider)
3ed16fb796 style: fix whitespace and format code 2025-03-08 17:26:20 -08:00
Paul Gauthier (aider)
6f99392eda feat: add thinking token budget configuration option 2025-03-08 17:26:09 -08:00
Paul Gauthier (aider)
680dbfbf77 style: fix whitespace in models.py 2025-03-08 17:20:06 -08:00
Paul Gauthier (aider)
51a72b497b refactor: move reasoning effort logic into Model class method 2025-03-08 17:19:58 -08:00
Paul Gauthier
d6e57dd194 chore: add comment about moving reasoning effort to Model class 2025-03-08 17:19:56 -08:00
Paul Gauthier (aider)
e92ab55da6 style: sort imports alphabetically in test_reasoning.py 2025-03-08 17:17:04 -08:00
Paul Gauthier (aider)
c78b3e0204 test: update reasoning tag tests to use imported constants 2025-03-08 17:16:59 -08:00
Paul Gauthier
ac1c05389a refactor: move deprecated model args to dedicated group 2025-03-08 17:13:50 -08:00
Paul Gauthier (aider)
95583fe2cd The changes look good. Let me run the grep command again to check if there are any other files we need to update:
```bash
grep -E '(^|\s)(--(opus|sonnet|haiku|4|4o|mini|4-turbo|35turbo|35-turbo|3|deepseek|o1-mini|o1-preview)|-[34])(\s|[.,)]|$)' --include="*.md" -r aider/website/docs | grep -v "model.*model"
```

If there are any remaining instances of deprecated switches, we should add those files to the chat and update them as well.
2025-03-08 17:12:05 -08:00
Paul Gauthier
ddedda9233 test: update model alias and add debug dump in deprecated tests 2025-03-08 17:09:04 -08:00
Paul Gauthier
d30b9d1513 test: simplify deprecated model flag tests 2025-03-08 17:06:45 -08:00
Paul Gauthier (aider)
4c35f88ea0 test: add variant flag formats for model switches 2025-03-08 13:47:31 -08:00
Paul Gauthier (aider)
e6623ae0a8 test: mock URL launches in deprecated args tests 2025-03-08 13:45:44 -08:00
Paul Gauthier (aider)
4755578822 style: format test_deprecated.py with black 2025-03-08 13:44:16 -08:00
Paul Gauthier (aider)
319d543ac2 fix: update deprecated model tests to handle multiple warnings 2025-03-08 13:44:11 -08:00
Paul Gauthier (aider)
9e668cda7f style: Format test_deprecated.py with black 2025-03-08 13:42:21 -08:00
Paul Gauthier (aider)
5447483da2 test: add tests for deprecated model argument handling 2025-03-08 13:42:16 -08:00
Paul Gauthier
8e22a8d107 test: add tests for deprecated functionality 2025-03-08 13:42:12 -08:00
Paul Gauthier (aider)
18d27ab4e4 style: fix linting issues and whitespace cleanup 2025-03-08 13:38:17 -08:00
Paul Gauthier (aider)
fe60832492 refactor: move model shortcut args to deprecated module with warnings 2025-03-08 13:38:06 -08:00
Paul Gauthier
6bf683409f copy 2025-03-08 08:30:25 -08:00
Paul Gauthier
634bfb1eae bump deps 2025-03-08 08:14:53 -08:00
Paul Gauthier
c9d597d2b1 update repomap fixture 2025-03-08 08:13:16 -08:00
Paul Gauthier
92c616f717 copy 2025-03-08 08:10:00 -08:00
Paul Gauthier
b1e8d29ae0 style: update reasoning tag formatting for better readability 2025-03-07 19:38:43 -08:00
Paul Gauthier
e0cef55fcd copy 2025-03-07 19:09:13 -08:00
Paul Gauthier
9aacf5c7db refactor: Remove unused parameter from remove_reasoning_content function 2025-03-07 19:06:15 -08:00
Paul Gauthier (aider)
4858749a20 style: Apply linter fixes to test_models.py 2025-03-07 17:54:34 -08:00
Paul Gauthier (aider)
b53c0b982a refactor: Move reasoning content removal tests to test_reasoning.py 2025-03-07 17:54:28 -08:00
Paul Gauthier (aider)
2aac9ff9c5 refactor: Remove unused re import from models.py 2025-03-07 17:51:25 -08:00
Paul Gauthier (aider)
bdaa70ada5 style: Apply linter formatting to remove extra whitespaces 2025-03-07 17:51:11 -08:00
Paul Gauthier (aider)
ca6abdfc61 refactor: Move remove_reasoning_content from Model to reasoning_tags.py 2025-03-07 17:50:57 -08:00
Paul Gauthier
e18593fe88 refactor: Remove commented-out code about reasoning tags 2025-03-07 17:42:22 -08:00
Paul Gauthier
08401aff26 refactor: Modify reasoning content removal method to update partial_response_content directly 2025-03-07 17:32:57 -08:00
Paul Gauthier (aider)
cddc67ad69 refactor: Extract reasoning content removal to helper method 2025-03-07 17:30:15 -08:00
Paul Gauthier
586af2a435 refactor: Extract reasoning content removal to a helper method 2025-03-07 17:30:13 -08:00
Paul Gauthier
97091fab60 refactor: Extract reasoning content removal to a helper method 2025-03-07 17:28:49 -08:00
Paul Gauthier (aider)
5f2cf75be8 style: Fix linting issues in test_reasoning.py 2025-03-07 17:20:11 -08:00
Paul Gauthier (aider)
37c7b81c95 test: Ensure partial_response_content contains only main content 2025-03-07 17:20:03 -08:00
Paul Gauthier (aider)
779a266713 style: Apply linter formatting to test_reasoning.py 2025-03-07 17:18:38 -08:00
Paul Gauthier (aider)
ebaedc6f05 fix: Resolve JSON serialization issue in test_send_with_think_tags_stream 2025-03-07 17:18:33 -08:00
Paul Gauthier (aider)
08a392787a style: Apply linter fixes to test_reasoning.py 2025-03-07 17:16:56 -08:00
Paul Gauthier (aider)
883bf74bad feat: Add streaming test for <think> tags in reasoning process 2025-03-07 17:16:50 -08:00
Paul Gauthier
80de3335b7 refactor: Move reasoning content flags initialization to send method 2025-03-07 17:15:44 -08:00
Paul Gauthier (aider)
794072bdf8 style: Format code with linter to improve readability 2025-03-07 17:06:14 -08:00
Paul Gauthier (aider)
e28fdb9cb1 refactor: Update test_send_with_reasoning_content_stream to be more robust 2025-03-07 17:06:09 -08:00
Paul Gauthier (aider)
7873d1c6b3 style: Fix linter warnings in test_reasoning.py 2025-03-07 17:04:07 -08:00
Paul Gauthier (aider)
f8c069132e fix: Add mdstream mock to resolve WholeFileCoder test failure 2025-03-07 17:04:03 -08:00
Paul Gauthier (aider)
c53833072f style: Format code with linter and remove trailing whitespaces 2025-03-07 17:03:21 -08:00
Paul Gauthier (aider)
16d7cf7a52 feat: Add test for streaming reasoning content with proper formatting and output 2025-03-07 17:03:16 -08:00
Paul Gauthier (aider)
3b9c2b9729 style: Organize and clean up import statements in test_reasoning.py 2025-03-07 17:00:25 -08:00
Paul Gauthier (aider)
b230fea66f feat: Add test for processing reasoning content in <think> tags 2025-03-07 17:00:19 -08:00
Paul Gauthier
f9b6501af1 refactor: Update test to use assistant_output instead of ai_output 2025-03-07 17:00:17 -08:00
Paul Gauthier (aider)
0cd8e3701d refactor: Move reasoning_content to choices[0].message in MockCompletion 2025-03-07 16:55:09 -08:00
Paul Gauthier (aider)
8545672839 fix: Add missing attributes to MockCompletion for test compatibility 2025-03-07 16:54:24 -08:00
Paul Gauthier
4a6c4b95f1 fix: Disable streaming for Coder in test_reasoning to ensure consistent output 2025-03-07 16:54:22 -08:00
Paul Gauthier (aider)
c893bc21ab style: Apply linter formatting to test_reasoning.py 2025-03-07 16:53:31 -08:00
Paul Gauthier (aider)
c8c5cbf8cc fix: Add mock hash object to resolve NoneType hexdigest error in test 2025-03-07 16:53:27 -08:00
Paul Gauthier (aider)
54ef8a1e19 fix: Update test mocking to match send_completion method signature 2025-03-07 16:52:51 -08:00
Paul Gauthier
82df218bcb test: Update test_reasoning to use generator and print partial response 2025-03-07 16:52:49 -08:00
Paul Gauthier (aider)
f613ad6c05 fix: Remove unused 'result' variable in test_reasoning.py 2025-03-07 16:50:36 -08:00
Paul Gauthier (aider)
4e732d0379 style: Apply linter formatting to test_reasoning.py 2025-03-07 16:50:19 -08:00
Paul Gauthier (aider)
ad8b5c9d29 refactor: Update test to simulate multi-response content formatting flow 2025-03-07 16:50:15 -08:00
Paul Gauthier (aider)
1ab4bf14dc fix: Remove unsupported 'stream' parameter from InputOutput initialization in test 2025-03-07 16:49:17 -08:00
Paul Gauthier (aider)
068a0b4576 refactor: Remove unused imports from test_reasoning.py 2025-03-07 16:48:52 -08:00
Paul Gauthier (aider)
5f694f228f style: Format code with linter and improve import sorting 2025-03-07 16:48:33 -08:00
Paul Gauthier (aider)
2ffe49130d feat: Add test for reasoning content formatting in Coder.send() method 2025-03-07 16:48:27 -08:00
Paul Gauthier
f7d18ef976 test: Add test_reasoning.py for basic reasoning tests 2025-03-07 16:48:23 -08:00
Paul Gauthier
8233eb6007 refactor: Simplify reasoning tag handling in base coder 2025-03-07 16:43:21 -08:00
Paul Gauthier
de4693cdf3 refactor: Simplify reasoning tag handling and remove unused function 2025-03-07 16:26:47 -08:00
Paul Gauthier (aider)
8fb235c3f5 refactor: Remove unused imports from reasoning_tags 2025-03-07 16:11:34 -08:00
Paul Gauthier (aider)
6feb00dcd9 style: Reorder imports and format code with linter 2025-03-07 16:10:57 -08:00
Paul Gauthier (aider)
4fc1847a70 refactor: Update reasoning tag formatting to use standalone function 2025-03-07 16:10:49 -08:00
Paul Gauthier (aider)
e7f16f07f7 refactor: Extract reasoning tag handling to separate module 2025-03-07 16:10:21 -08:00
Paul Gauthier
d9551b3106 refactor: Simplify reasoning tag handling and remove debug print statements 2025-03-07 16:08:11 -08:00
Paul Gauthier (aider)
854428795b style: Format code with linter and improve readability 2025-03-07 16:04:40 -08:00
Paul Gauthier (aider)
5c3b4bd987 refactor: Update reasoning tag handling in live_incremental_response method 2025-03-07 16:04:32 -08:00
Paul Gauthier (aider)
9d686d3e52 refactor: Update reasoning tag handling in base_coder.py 2025-03-07 16:04:19 -08:00
Paul Gauthier (aider)
b62e00b935 refactor: Use class attribute for reasoning tag name in replace_reasoning_tags method 2025-03-07 16:03:58 -08:00
Paul Gauthier
634745c818 fix: Adjust reasoning tag spacing to improve readability 2025-03-07 16:03:56 -08:00
Paul Gauthier (aider)
490c6d9a28 style: Apply linter formatting to base_coder.py 2025-03-07 16:00:47 -08:00
Paul Gauthier (aider)
e6dd9978cb refactor: Improve reasoning tag replacement with consistent newline handling 2025-03-07 16:00:40 -08:00
Paul Gauthier
240a5613a5 refactor: Simplify reasoning tag formatting in base_coder.py 2025-03-07 16:00:38 -08:00
Paul Gauthier (aider)
fb96cbcaaf feat: Apply reasoning tag formatting in non-pretty streaming output 2025-03-07 15:59:05 -08:00
Paul Gauthier
b58f879db7 refactor: Simplify reasoning tag replacement in live_incremental_response method 2025-03-07 15:59:02 -08:00
Paul Gauthier (aider)
1585c6095e style: Format code with linter and improve readability 2025-03-07 15:57:24 -08:00
Paul Gauthier (aider)
30a630412d refactor: Improve reasoning tag handling in base_coder.py 2025-03-07 15:57:16 -08:00
Paul Gauthier
e5ca79cd51 refactor: Prepare for AI tag conversion in incremental response rendering 2025-03-07 15:57:14 -08:00
Paul Gauthier (aider)
148353aca4 refactor: Revert reasoning content tag changes to original implementation 2025-03-07 15:56:13 -08:00
Paul Gauthier (aider)
7a098ce740 style: Apply linter formatting to base_coder.py 2025-03-07 15:54:00 -08:00
Paul Gauthier (aider)
f3b9831a0c refactor: Add helper function to replace reasoning tags in base_coder.py 2025-03-07 15:53:53 -08:00
Paul Gauthier
01454674c8 refactor: Update reasoning content formatting with improved XML-like tags 2025-03-07 15:53:50 -08:00
Paul Gauthier
5093b18ecc Merge branch 'main' into show-thinking 2025-03-07 10:29:44 -08:00
Paul Gauthier
c16cfd0668 copy 2025-03-07 09:30:43 -08:00
Paul Gauthier
1674cd5db9 Merge branch 'main' of github.com:Aider-AI/aider 2025-03-07 09:30:27 -08:00
Paul Gauthier
f111ab48fb chore: Update polyglot leaderboard data with new model test results 2025-03-07 09:26:32 -08:00
paul-gauthier
65309854ac Update README.md 2025-03-06 19:43:46 -08:00
paul-gauthier
cf0aff8c40 Update README.md 2025-03-06 19:43:16 -08:00
Paul Gauthier
16b768485a feat: Update reasoning tag and add reasoning content handling in Coder 2025-03-06 19:05:57 -08:00
Paul Gauthier
c2e7b533d3 feat: Add reasoning content indicators in response handling 2025-03-06 18:28:47 -08:00
Paul Gauthier
539859f1ab fix: Update reasoning tag message and comment out dump function 2025-03-06 18:21:45 -08:00
Paul Gauthier
d1d40a9a76 feat: Add reasoning content handling in Coder and Model classes 2025-03-06 18:16:44 -08:00
Paul Gauthier
52162a5604 initial 2025-03-06 17:19:45 -08:00
Paul Gauthier
84e84207a5 copy 2025-03-06 17:12:21 -08:00
Paul Gauthier (aider)
a4e1745eca fix: Remove unnecessary f-strings in args_formatter.py 2025-03-06 17:09:39 -08:00
Paul Gauthier
5931979b74 style: Update color configuration comments to use quotes 2025-03-06 17:09:29 -08:00
Paul Gauthier
a412a65315 bump 2025-03-06 17:00:13 -08:00
Paul Gauthier
25da0674bb special case tree-sitter deps 2025-03-06 16:50:05 -08:00
Paul Gauthier
c823bf4fbb refactor: Remove debug dump calls from repomap.py 2025-03-06 16:40:08 -08:00
Paul Gauthier
cfd0e67a6b feat: Add C# tree-sitter query with class definition and reference tags 2025-03-06 16:36:37 -08:00
Paul Gauthier (aider)
94f3af57f1 refactor: Update csharp-tags.scm to use @name.definition and @name.reference patterns 2025-03-06 16:34:22 -08:00
Paul Gauthier
0050a3fe6c feat: Add C# language tags query for tree-sitter parsing 2025-03-06 16:34:20 -08:00
Paul Gauthier
0e65ddee37 fix ruby with ts 0.23 2025-03-06 16:26:41 -08:00
Paul Gauthier
101f7de889 re-ran pip-compile.sh, now ts is 0.23.2? 2025-03-06 15:17:40 -08:00
Paul Gauthier
a21c1ff92d cleanup 2025-03-06 14:53:17 -08:00
Paul Gauthier
f9bb2e498e pin ts per python version 2025-03-06 13:20:59 -08:00
Paul Gauthier
f6bb803be5 copy 2025-03-06 13:10:37 -08:00
Paul Gauthier
204a88c171 fix: Improve LLM empty response handling with clearer warning messages 2025-03-06 13:07:27 -08:00
Paul Gauthier (aider)
012afc0708 feat: Add warning for empty LLM streaming responses 2025-03-06 12:52:32 -08:00
Paul Gauthier
cf089abb64 switch to tslp 2025-03-06 12:32:06 -08:00
Paul Gauthier
40e463cdc1 copy 2025-03-06 12:25:43 -08:00
Paul Gauthier (aider)
6a1284a5ca docs: Add documentation for new notifications feature 2025-03-06 12:24:17 -08:00
Paul Gauthier
60522ee474 docs: Add notifications documentation page 2025-03-06 12:24:15 -08:00
Paul Gauthier (aider)
0045641db7 fix: Move module-level constant after imports to resolve flake8 E402 errors 2025-03-06 12:17:33 -08:00
Paul Gauthier (aider)
97b5b1b669 style: Fix linter formatting in io.py 2025-03-06 12:14:50 -08:00
Paul Gauthier (aider)
448de8519a refactor: Extract notification message into a constant 2025-03-06 12:14:44 -08:00
Paul Gauthier (aider)
95e1fe0446 style: Format code with linter and improve whitespace consistency 2025-03-06 12:14:20 -08:00
Paul Gauthier (aider)
47254be254 feat: Add terminal-notifier support for macOS notifications 2025-03-06 12:14:14 -08:00
Paul Gauthier
3da15bfd19 fix: Handle NO_COLOR environment variable for disabling colored output 2025-03-06 12:14:11 -08:00
Paul Gauthier (aider)
c79db2581b style: Reformat code to improve linter compliance 2025-03-06 12:04:23 -08:00
Paul Gauthier (aider)
93b86a8800 feat: Add OS-specific default notification commands with custom message 2025-03-06 12:04:14 -08:00
Paul Gauthier (aider)
56ba7ef411 refactor: Remove redundant subprocess import in ring_bell method 2025-03-06 12:02:00 -08:00
Paul Gauthier (aider)
e2117fd8a9 feat: Add subprocess import for notifications command 2025-03-06 12:01:03 -08:00
Paul Gauthier (aider)
e817c76e38 style: Format code with linter and improve line breaks 2025-03-06 12:00:33 -08:00
Paul Gauthier (aider)
65e059a7d2 feat: Add notifications-command option to run custom notification commands 2025-03-06 12:00:21 -08:00
Paul Gauthier
f661025acc feat: Add notifications parameter to coder initialization 2025-03-06 12:00:19 -08:00
Paul Gauthier (aider)
2fe1b1e16e feat: Add --notifications flag to control terminal bell 2025-03-06 11:55:32 -08:00
Paul Gauthier
665ffe3984 Revert "feat: Add notification parameter to InputOutput initialization"
This reverts commit 09e998523f.
2025-03-06 11:54:05 -08:00
Paul Gauthier
c3401047e0 Revert "feat: Add desktop notification support with notify-py package"
This reverts commit 38e8d27416.
2025-03-06 11:53:58 -08:00
Paul Gauthier
996177ceaf add qwq32b 2025-03-06 11:46:32 -08:00
Paul Gauthier (aider)
09e998523f feat: Add notification parameter to InputOutput initialization 2025-03-06 11:45:59 -08:00
Paul Gauthier (aider)
38e8d27416 feat: Add desktop notification support with notify-py package 2025-03-06 11:45:37 -08:00
Paul Gauthier (aider)
813de04596 style: Remove trailing whitespaces in base_coder.py and io.py 2025-03-06 11:41:58 -08:00
Paul Gauthier (aider)
3c0eae4180 feat: Add terminal bell notification when LLM processing is complete 2025-03-06 11:41:32 -08:00
Paul Gauthier
99424a9f53 feat: Add configuration for Qwen 2.5 32b model with specific settings 2025-03-06 09:53:09 -08:00
Paul Gauthier
51d118fdb5 bump deps 2025-03-06 06:13:33 -08:00
Paul Gauthier
a26509a1fd Merge branch 'main' of github.com:Aider-AI/aider 2025-03-06 06:13:14 -08:00
paul-gauthier
0db70379e8 Merge pull request #3451 from claui/add-uv-dependency 2025-03-06 05:38:16 -08:00
Claudia Pellegrino
c612b5d17b fix: add uv as development dependency
`uv` is used in `pip-compile.sh`, so add it as a dev dependency.
2025-03-06 08:57:40 +01:00
Paul Gauthier
1b469cce49 copy 2025-03-05 18:59:33 -08:00
Paul Gauthier (aider)
c62cbd2d77 style: Fix linter warnings in test_main.py 2025-03-05 18:55:37 -08:00
Paul Gauthier (aider)
da1bc19052 fix: Correct indentation in test_no_verify_ssl_sets_model_info_manager test 2025-03-05 18:55:32 -08:00
Paul Gauthier (aider)
8e2246ec5c fix: Resolve MagicMock TypeError in test_no_verify_ssl_sets_model_info_manager 2025-03-05 18:55:17 -08:00
Paul Gauthier
5cf6945bcb pick up lox==0.13.0 for #3391 2025-03-05 18:46:46 -08:00
Paul Gauthier (aider)
7132ae47d7 test: Mock offer_url to prevent URL opening in SSL verification tests 2025-03-05 18:44:47 -08:00
Paul Gauthier (aider)
96bde4ad03 style: Format code with linter 2025-03-05 18:42:13 -08:00
Paul Gauthier (aider)
85b9bdd8f4 fix: Resolve TypeError in SSL verification tests by mocking Model class 2025-03-05 18:42:03 -08:00
Paul Gauthier (aider)
e5a85108d7 refactor: Remove unused result variable in test_verify_ssl_setting_before_cache_loading 2025-03-05 18:40:03 -08:00
Paul Gauthier (aider)
aaa3a8ebda style: Remove trailing whitespaces and fix code formatting 2025-03-05 18:39:29 -08:00
Paul Gauthier (aider)
9ceb766a67 feat: Add comprehensive tests for SSL verification in ModelInfoManager and main 2025-03-05 18:39:17 -08:00
Paul Gauthier (aider)
f894240fbb style: Remove trailing whitespaces in models.py 2025-03-05 18:37:47 -08:00
Paul Gauthier (aider)
4bac8e2ebe refactor: Lazy-load model cache to respect SSL verification settings 2025-03-05 18:37:40 -08:00
Paul Gauthier (aider)
d3ad1fd384 fix: Remove unused configparser import in main.py 2025-03-05 18:35:13 -08:00
Paul Gauthier (aider)
ed0e4189e4 style: Fix linting issues in models.py 2025-03-05 18:34:56 -08:00
Paul Gauthier (aider)
5f147242be refactor: Add SSL verification control to ModelInfoManager 2025-03-05 18:34:48 -08:00
Paul Gauthier
c7b4c22b94 fix: Add SSL verification option for model info request 2025-03-05 18:31:39 -08:00
Paul Gauthier (aider)
667bacf81e style: Remove unused imports from test_sanity_check_repo.py 2025-03-05 18:28:40 -08:00
Paul Gauthier
e896b0ea96 refactor: Remove corrupt index test and related function from sanity check test 2025-03-05 18:28:30 -08:00
Paul Gauthier (aider)
3b0a5a8b41 style: Format code with linter and remove extra whitespaces 2025-03-05 18:20:56 -08:00
Paul Gauthier (aider)
81d39e9bde test: Add tests for ensure_hash_prefix and color initialization 2025-03-05 18:20:50 -08:00
Paul Gauthier (aider)
59eabf03a6 style: Reformat color configuration lines for improved readability 2025-03-05 18:20:16 -08:00
Paul Gauthier (aider)
4fc4987c43 feat: Add helper function to ensure hex color values have a # prefix 2025-03-05 18:20:10 -08:00
Paul Gauthier
dbf5bb149a chore: Add sphinx version constraint to development requirements 2025-03-05 18:17:50 -08:00
Paul Gauthier (aider)
38acbf6970 fix: Handle ANY_GIT_ERROR when reading staged files in repo.py 2025-03-05 17:40:04 -08:00
Paul Gauthier
ad4bd91751 docs: Add comment about potential error in index.entries.keys usage 2025-03-05 17:39:53 -08:00
Paul Gauthier
1a6f290979 copy 2025-03-05 17:15:00 -08:00
Paul Gauthier
c6e02a620a test: Add unit tests for model dependency checks and sanity checks 2025-03-05 17:11:15 -08:00
Paul Gauthier (aider)
90efaa41c2 test: Add tests for check_for_dependencies function 2025-03-05 17:07:43 -08:00
Paul Gauthier (aider)
51a73ad8b5 style: Fix linter formatting in models.py 2025-03-05 17:07:01 -08:00
Paul Gauthier (aider)
93f2387d1b refactor: Move check_pip_install_extra import to top of file 2025-03-05 17:06:56 -08:00
Paul Gauthier (aider)
207a631a65 style: Fix linting issues in models.py 2025-03-05 17:06:39 -08:00
Paul Gauthier (aider)
74e60e98b7 refactor: Simplify model dependency checks with new check_for_dependencies function 2025-03-05 17:06:33 -08:00
Paul Gauthier (aider)
6ca6bf7457 refactor: Extract model-specific dependency checks into dedicated function 2025-03-05 17:06:23 -08:00
Paul Gauthier
ea49cdeb17 feat: Add google-cloud-aiplatform dependency to Dockerfile 2025-03-05 16:59:41 -08:00
Paul Gauthier (aider)
bcc8b1917a style: Fix linter warnings in models.py 2025-03-05 16:57:56 -08:00
Paul Gauthier (aider)
67b12d4416 feat: Add Vertex AI model package check for google-cloud-aiplatform 2025-03-05 16:57:51 -08:00
Paul Gauthier (aider)
dc02daecee style: Break long comment into two lines to fix flake8 line length issue 2025-03-05 16:56:55 -08:00
Paul Gauthier (aider)
6212b38ea6 style: Format code and remove unnecessary whitespace 2025-03-05 16:55:56 -08:00
Paul Gauthier (aider)
ce7e5726e7 feat: Add boto3 check for Bedrock models in sanity_check_model 2025-03-05 16:55:51 -08:00
Paul Gauthier
1156b3f22e feat: Add Pillow library to project requirements 2025-03-05 16:39:42 -08:00
Paul Gauthier
66097f3507 make torch 2.2.2 pin explicit 2025-03-05 16:34:45 -08:00
Paul Gauthier
146f02d314 refactor: Remove redundant numpy version constraint from requirements files 2025-03-05 16:32:16 -08:00
Paul Gauthier
77e5882ce7 Merge branch 'main' of github.com:Aider-AI/aider 2025-03-05 16:29:50 -08:00
Paul Gauthier
d44850a4f3 pickup pillow 11.1.0 2025-03-05 16:29:40 -08:00
paul-gauthier
e6e692dc43 Merge pull request #3423 from akirak/git-config
Retrieve the identity using git-config command
2025-03-05 16:21:00 -08:00
Paul Gauthier
dc65770ae3 Add qwq32b on fireworks 2025-03-05 16:19:19 -08:00
Paul Gauthier (aider)
8c15802277 refactor: Add comment explaining closing tag splitting logic 2025-03-05 16:03:00 -08:00
Paul Gauthier (aider)
3d666d9929 style: Apply linter formatting to models.py 2025-03-05 16:02:14 -08:00
Paul Gauthier (aider)
c0c960ec2e refactor: Enhance remove_reasoning_content to handle incomplete tag patterns 2025-03-05 16:02:08 -08:00
Paul Gauthier
2bb4db127c fix: Normalize path separators for git config include path on Windows 2025-03-05 15:51:45 -08:00
Paul Gauthier (aider)
dd1a5d4f58 fix: Improve git config include path handling for Windows tests 2025-03-05 15:50:06 -08:00
Paul Gauthier (aider)
961fdf7029 fix: Normalize git config include path for cross-platform compatibility 2025-03-05 15:37:30 -08:00
Paul Gauthier (aider)
ff3d2b006f refactor: Handle EOFError gracefully in confirm_ask and prompt_ask methods 2025-03-05 15:30:44 -08:00
Paul Gauthier (aider)
d7efbad3df fix: Update git config include directive assertion in test 2025-03-05 15:20:30 -08:00
Paul Gauthier (aider)
d70995bb1a fix: Remove unused variable and fix f-string in test_git_config_include_directive 2025-03-05 15:19:42 -08:00
Paul Gauthier (aider)
1b58e95dce style: Fix linting issues in test_main.py 2025-03-05 15:19:23 -08:00
Paul Gauthier (aider)
780f70d5c6 test: Enhance git config include tests with manual config file verification 2025-03-05 15:19:18 -08:00
Paul Gauthier (aider)
a01e1f96fa refactor: Remove unused original_config variable in git config setup 2025-03-05 15:17:35 -08:00
Paul Gauthier (aider)
3adb443ca5 style: Fix linting issues in test_main.py 2025-03-05 15:16:49 -08:00
Paul Gauthier (aider)
dc9ff3a004 feat: Add test for git config include directive in repository config 2025-03-05 15:16:43 -08:00
Paul Gauthier (aider)
f879f4f432 style: Fix linting issues in test_main.py 2025-03-05 15:15:15 -08:00
Paul Gauthier (aider)
183f831a7e test: Add test for git config include to verify aider respects user settings 2025-03-05 15:15:09 -08:00
Paul Gauthier
3c361be621 refactor: Simplify pip-compile script by removing annotation-style flag 2025-03-05 14:49:40 -08:00
Paul Gauthier (aider)
5764d44faf feat: Add verbosity and annotations to pip-compile script 2025-03-05 14:45:42 -08:00
Paul Gauthier
ce86677faa Merge branch 'main' of github.com:Aider-AI/aider 2025-03-05 14:43:26 -08:00
Paul Gauthier
17d93b39d5 bump deps with new uv compile 2025-03-05 14:38:41 -08:00
Paul Gauthier (aider)
1357b85a3d feat: Add --no-strip-extras flag to uv pip compile commands 2025-03-05 14:37:27 -08:00
Paul Gauthier (aider)
c67cb5c604 refactor: Replace pip-compile with uv pip compile in dependency management script 2025-03-05 09:24:43 -08:00
paul-gauthier
6ffb0df6cb Merge pull request #3443 from gmoz22/main 2025-03-05 00:37:01 -08:00
gmoz22
032b40c78d Merge branch 'main' of https://github.com/gmoz22/aider into main 2025-03-05 00:11:37 -06:00
gmoz22
742aea115b Adding OpenRouter deepseek-chat:free (V3) 2025-03-05 00:08:36 -06:00
gmoz22
0f16cd46f9 Adding OpenRouter deepseek-chat:free (V3) 2025-03-05 00:03:00 -06:00
Paul Gauthier
eea64cf272 copy 2025-03-04 14:03:10 -08:00
Paul Gauthier (aider)
3d5c5f8054 refactor: Rename check_push_access to check_ok_to_push 2025-03-04 14:02:30 -08:00
Paul Gauthier
748099a324 refactor: Improve git push access check logging and error handling 2025-03-04 14:02:27 -08:00
Paul Gauthier (aider)
9c1d050d8b feat: Add git command output display in check_push_access function 2025-03-04 14:00:51 -08:00
Paul Gauthier
4ef834e295 copy 2025-03-04 13:59:34 -08:00
Paul Gauthier (aider)
50bead172b style: Apply linter formatting to versionbump.py script 2025-03-04 13:57:07 -08:00
Paul Gauthier (aider)
ee4508af03 refactor: Move check functions to top level of script 2025-03-04 13:57:01 -08:00
Paul Gauthier
6638959d66 Merge branch 'claui-fix-requirements-conflicts' 2025-03-04 13:35:10 -08:00
Paul Gauthier
f266a9d25d bumped deps 2025-03-04 13:31:25 -08:00
Paul Gauthier
6cb8e1a518 Merge branch 'fix-requirements-conflicts' of github.com:claui/aider into claui-fix-requirements-conflicts 2025-03-04 13:28:56 -08:00
Paul Gauthier (aider)
85375359ed style: Apply linter formatting to versionbump.py script 2025-03-04 13:24:28 -08:00
Paul Gauthier (aider)
17c9ba2c68 feat: Add git push dry-run check before version bump 2025-03-04 13:24:22 -08:00
Paul Gauthier
34334ad8b8 chore: Add dry run git push check before version bump 2025-03-04 13:24:18 -08:00
Paul Gauthier
4527714094 set version to 0.75.3.dev 2025-03-04 13:23:17 -08:00
Paul Gauthier
b43d74dbb7 version bump to 0.75.2 2025-03-04 13:20:35 -08:00
Paul Gauthier
0c4140ff02 copy 2025-03-04 13:20:31 -08:00
Paul Gauthier
b074c02fa2 bump deps 2025-03-04 12:45:00 -08:00
Paul Gauthier
7636c97f9f copy 2025-03-04 12:42:36 -08:00
Paul Gauthier
4211ab28b0 Merge branch 'main' of github.com:Aider-AI/aider 2025-03-04 12:41:29 -08:00
paul-gauthier
cecfbc7e20 Merge pull request #3435 from matfat55/main 2025-03-03 15:14:25 -08:00
Mattias
31a6aff932 update default model to 3.7 sonnet 2025-03-03 18:07:25 -05:00
Claudia Pellegrino
c4a67c4356 chore: bump dependencies according to latest fix
Now that the fix from the previous commit is active, sync up the
dependencies via `scripts/pip-compile.sh --upgrade`.
2025-03-03 22:02:22 +01:00
Akira Komamura
9f5765134b fix: Use git command to get the identity
This takes the global git configuration into account, so it will become
unnecessary to set a local identity in every repository.
2025-03-03 19:19:01 +09:00
Paul Gauthier
0c5b51d2ac copy 2025-03-02 07:47:39 -08:00
Claudia Pellegrino
31c4198cee fix: let fewer conflicts occur across requirements
**tl;dr** Introduce a common umbrella constraints file (that works
across requirement extras) to avoid package version conflicts and
to reduce the need for manual pinning in `*.in` files.

Previously, spurious package version conflicts could sometimes occur
across requirements for `pip install -e .`, `pip install -e .[help]`,
`pip install -e .[playwright]`, and so on. Here’s why:

- There are five different requirement configs: the set of base
  requirements (`requirements.txt`) and four additional requirement sets\
  (aka "extras"): `dev`, `help`, `browser`, and `playwright`.

- Each of those five configurations spans its own tree of dependencies
  [1]. Those five trees can slightly overlap. (For example, `greenlet`
  is a transitive requirement for both the `help` and `playwright`
  trees, respectively.)

- If you want to resolve those dependency trees so you get concrete
  version numbers, you can’t just look at each tree independently.
  This is because when trees overlap, they sometimes pull in the same
  package for different reasons, respectively, and maybe with different
  version constraints.
  For example, the `help` tree pulls in `greenlet`, because `sqlalchemy`
  requires it. At the same time, the `playwright` tree also pulls in
  `greenlet` because it’s needed by the `playwright` package.
  Resolving those constraints strictly individually (i.e., per tree) is
  usually a mistake. It may work for a while, but occasionally you’re
  going to end up with two conflicting versions of the same package.

To prevent those version conflicts from occurring, the five
`pip-compile` invocations were designed as a chain.
The process starts at the smallest tree (i.e., the base
`requirements.in` file). It calculates the version numbers for the tree,
remembers the result, and feeds it into the calculation of the next
tree.

The chain design somewhat helped mitigate conflicts, but not always.
The reason for that is that the chain works like a greedy algorithm:
once a decision has been made for a given package in a tree, that
decision is immediately final, and the compilation process isn’t allowed
to go back and change that decision if it learns new information.
New information comes in all the time, because larger trees usually have
more complex constraints than smaller trees, and the process visits
larger trees later, facing additional constraints as it hops from tree
to tree. Sometimes it bumps into a new constraint against a package for
which it has already made a decision earlier (i.e., it has pinned the
concrete version number in the `requirements*.txt` file of an earlier
tree).

That’s why the greedy chain-based method, even though it mostly works
just fine, can never avoid spurious conflicts entirely.
To help mitigate those conflicts, pinning entries were manually added to
`requirements.in` files on a case-by-case basis as conflicts occurred.
Those entries can make the file difficult to reason about, and they must
be kept in sync manually as packages get upgraded. That’s a maintenance
burden.

Turning the chain into an umbrella may help. Instead of hopping from
tree to tree, look at the entire forest at once, calculate all the
concrete version numbers for all trees in one fell swoop, and save the
results in a common, all-encompassing umbrella file.

Armed with the umbrella file (called `common-constraints.txt`), visit
each tree (in any order – it no longer matters) and feed it just the
umbrella file as a constraint, along with its own `*.in` file as the
input.
Chaining is no longer necessary, because the umbrella file already
contains all version constraints for all the packages one tree could
possibly need, and then some.

This technique should reduce manual pinning inside `*.in` files, and
makes sure that computed version numbers no longer contradict each other
across trees.

[1]: From a graph theory point of view, I’m being blatantly incorrect
here; those dependency graphs are usually not trees, because they have
cycles. I’m still going to call them "trees" for the sake of this
discussion, because the word "tree" feels less abstract and intimidating
and hopefully more relatable.
2025-03-02 02:50:03 +01:00
Paul Gauthier
a94c4b4ce4 pricing 2025-02-27 14:34:47 -08:00
Paul Gauthier (aider)
088dd99ec1 refactor: Change cost chart to scatter plot with markers 2025-02-27 14:15:23 -08:00
Paul Gauthier (aider)
4f9b907b4d feat: Conditionally plot cost data only when non-zero 2025-02-27 14:12:59 -08:00
Paul Gauthier (aider)
e7dc3e6062 feat: Add line plot of total costs with right y-axis scale 2025-02-27 13:43:30 -08:00
Paul Gauthier
53055e78eb Merge branch 'main' of github.com:Aider-AI/aider 2025-02-27 13:19:56 -08:00
Paul Gauthier
9a9c34aa18 add gpt-4.5 to leaderboard 2025-02-27 13:07:07 -08:00
Paul Gauthier
2f1384840c feat: Add metadata and settings for GPT-4.5-preview and GPT-4o models 2025-02-27 13:01:52 -08:00
Paul Gauthier
b462e55799 feat: Add gpt-4.5-preview model metadata and settings 2025-02-27 12:20:15 -08:00
paul-gauthier
263ec60ba6 Merge pull request #3399 from pcgeek86/patch-1
Update Aider documentation for Amazon Bedrock 📄
2025-02-27 10:08:32 -08:00
Trevor Sullivan
8d44a57200 Update Aider documentation for Amazon Bedrock 📄 2025-02-27 10:33:06 -07:00
Paul Gauthier (aider)
976722c129 refactor: Update problem_stats.py to use polyglot_leaderboard.yml 2025-02-27 08:56:54 -08:00
Paul Gauthier
4a9447d344 bump deps 2025-02-26 09:07:15 -08:00
Paul Gauthier
ac2ed9aa87 copy 2025-02-26 09:05:46 -08:00
Paul Gauthier
51cf241dae copy 2025-02-26 09:05:16 -08:00
Paul Gauthier
f239b8e26d copy 2025-02-26 09:03:53 -08:00
Paul Gauthier (aider)
ab9f4161ea refactor: Update weak_model_name to match main model name pattern 2025-02-26 09:03:38 -08:00
Paul Gauthier (aider)
1d10e649b7 feat: Add Claude 3.7 Sonnet models to model-settings.yml 2025-02-26 08:59:45 -08:00
Paul Gauthier (aider)
a95b40aac6 docs: Update LM Studio example commands with dummy key and default URL 2025-02-26 08:54:46 -08:00
Paul Gauthier
1b5777821f Merge branch 'main' of github.com:Aider-AI/aider 2025-02-26 08:53:52 -08:00
paul-gauthier
587d469193 Merge pull request #3388 from jklina/clarify-llm-studio-instructions
Add clarifying instructions to LM Studio config
2025-02-26 08:53:38 -08:00
Paul Gauthier
6c3e30f3ea copy 2025-02-26 07:50:52 -08:00
Paul Gauthier
91dbcae9e2 Merge branch 'main' of github.com:Aider-AI/aider 2025-02-26 07:50:43 -08:00
Paul Gauthier
fb5db4f6b7 copy 2025-02-26 07:50:30 -08:00
Paul Gauthier
a1e029a825 added settings for openrouter/anthropic/claude-3.7-sonnet:beta 2025-02-26 07:49:55 -08:00
paul-gauthier
54dbf9b6f2 Merge pull request #3389 from filiptrplan/patch-1 2025-02-26 07:28:31 -08:00
Filip Trplan
b6344951fe add gemini-2.0-pro-exp-02-05 polyglot benchmark 2025-02-26 15:04:48 +01:00
Josh Klina
ea972118b5 Add clarifying instructions to LM Studio config
There are a few small gotchas when configuring LM Studio to work with aider. This adds a few clarifying instructions.
2025-02-26 08:59:39 -05:00
paul-gauthier
2fccd4799d Merge pull request #3363 from MatthewZMD/typo 2025-02-25 07:40:56 -08:00
Paul Gauthier
a3937e4d0d copy 2025-02-25 06:35:35 -08:00
Mingde (Matthew) Zeng
acb022d5d5 Fix typo 2025-02-25 02:46:29 -05:00
Paul Gauthier
b6e46d6101 copy 2025-02-24 20:20:55 -08:00
Paul Gauthier
347f75f804 copy 2025-02-24 17:23:14 -08:00
Paul Gauthier
4005ced505 copy 2025-02-24 17:17:34 -08:00
Paul Gauthier
c748c35b37 set version to 0.75.2.dev 2025-02-24 15:41:02 -08:00
Paul Gauthier
a73836ca43 version bump to 0.75.1 2025-02-24 15:39:16 -08:00
Paul Gauthier
b357fab326 copy 2025-02-24 15:39:02 -08:00
Paul Gauthier
16a3000451 feat: Add OpenRouter Claude 3.7 Sonnet model configuration 2025-02-24 15:36:25 -08:00
Paul Gauthier
c4fac2d179 added sonnet 37 w/32k think 2025-02-24 15:15:24 -08:00
Paul Gauthier
60d11a6eba use LONG_TIMEOUT 2025-02-24 13:51:21 -08:00
Paul Gauthier
93edbda984 copy 2025-02-24 13:29:22 -08:00
Paul Gauthier
75bd94d757 updated blame 2025-02-24 12:53:46 -08:00
Paul Gauthier
a5cf0b6ef5 set version to 0.75.1.dev 2025-02-24 12:34:55 -08:00
Paul Gauthier
506280d645 version bump to 0.75.0 2025-02-24 12:33:23 -08:00
Paul Gauthier (aider)
2f79b4fde7 test: Update sonnet model name in test_models.py 2025-02-24 12:32:47 -08:00
Paul Gauthier
846f98628d copy 2025-02-24 12:28:11 -08:00
Paul Gauthier
eed9be5a9e added sonnet 37 to leaderboard 2025-02-24 12:16:14 -08:00
Paul Gauthier
27c77afafc copy 2025-02-24 12:13:47 -08:00
Paul Gauthier
c156b2f817 feat: Update Claude Sonnet model to latest version 2025-02-24 12:11:49 -08:00
Paul Gauthier (aider)
96fcc5df6b fix: Resolve Windows path escaping issue in test_editor.py 2025-02-24 12:09:33 -08:00
Paul Gauthier (aider)
3c775fd5de fix: Resolve Windows path handling and editor command test issues 2025-02-24 12:09:26 -08:00
Paul Gauthier
75e9ee6528 added claude 37 2025-02-24 11:53:07 -08:00
Paul Gauthier
ea0ee96398 test: Add error message to editor file extension assertion 2025-02-24 11:45:48 -08:00
Paul Gauthier (aider)
3fd4a2841a fix: Use separate temp file for log in editor test script 2025-02-24 10:39:16 -08:00
Paul Gauthier (aider)
6ecf44c87a refactor: Remove unused shlex import from editor.py 2025-02-24 10:22:04 -08:00
Paul Gauthier
031e8cea6e feat: Add pipe_editor function for system editor interaction 2025-02-24 10:21:59 -08:00
Paul Gauthier (aider)
757fbb0124 refactor: Remove unused pytest import in test_editor.py 2025-02-24 10:21:51 -08:00
Paul Gauthier
d65e3f73df refactor: Simplify editor discovery and command handling logic 2025-02-24 10:21:45 -08:00
Paul Gauthier (aider)
5b13105d58 fix: Update tests to match string return type of discover_editor() 2025-02-24 10:20:46 -08:00
Paul Gauthier (aider)
c8745afb37 fix: Preserve Windows paths in editor command parsing 2025-02-24 10:18:22 -08:00
Paul Gauthier (aider)
85189c0bde fix: Update temporary script logging to use f-string and full sys.argv 2025-02-24 10:11:58 -08:00
Paul Gauthier (aider)
a8635bade2 fix: Improve test_pipe_editor_with_fake_editor reliability by using explicit log file path 2025-02-24 10:11:45 -08:00
Paul Gauthier (aider)
4560572ff2 style: Fix code formatting in test_editor.py 2025-02-24 09:47:24 -08:00
Paul Gauthier (aider)
c7fa57fd14 refactor: Make test_pipe_editor cross-platform using Python script 2025-02-24 09:47:20 -08:00
Paul Gauthier (aider)
54965fdf2e style: Fix linter warnings in test_editor.py 2025-02-24 09:46:33 -08:00
Paul Gauthier (aider)
30361aa685 fix: Remove unused 'result' variable in test_pipe_editor_with_shell_script 2025-02-24 09:46:29 -08:00
Paul Gauthier (aider)
8be93b72c4 style: Format code and organize imports in test_editor.py 2025-02-24 09:46:20 -08:00
Paul Gauthier (aider)
c7e9d645e5 test: Add test for pipe_editor with shell script logging arguments 2025-02-24 09:46:16 -08:00
Paul Gauthier
fe6a3c89f3 copy 2025-02-24 09:44:57 -08:00
Paul Gauthier
686a32cbc0 refactor: Remove debug dump call in pipe_editor function 2025-02-24 09:28:31 -08:00
Paul Gauthier (aider)
55d7397ff5 style: Organize imports and remove unused import 2025-02-24 09:22:40 -08:00
Paul Gauthier (aider)
3714d554df refactor: Update subprocess call to use shell=True with properly quoted command string 2025-02-24 09:22:34 -08:00
Paul Gauthier
0415de853b fix: Remove shell=True and add debug dump in pipe_editor 2025-02-24 09:22:28 -08:00
Paul Gauthier
0ba1e8f904 set version to 0.74.4.dev 2025-02-23 08:54:05 -08:00
Paul Gauthier
58bfcb0953 version bump to 0.74.3 2025-02-23 08:52:31 -08:00
Paul Gauthier
fa281d89d2 copy 2025-02-23 08:52:06 -08:00
Paul Gauthier
908b10dae0 copy 2025-02-23 08:50:49 -08:00
paul-gauthier
ea03f9def0 Merge pull request #3333 from akaihola/editor-test-fix 2025-02-22 05:22:52 -08:00
Antti Kaihola
3510799fca fix: test for get_environment_editor()
The test for `EDITOR` preference failed to clean up any existing value
of `VISUAL` which may be present in the environment pytest is run in.
2025-02-22 10:12:08 +02:00
Paul Gauthier
1f4a63d6db add socksio dep #3048 2025-02-19 14:37:48 -08:00
Paul Gauthier
dd94a444d2 feat: Add OpenRouter O3 Mini High model configuration to metadata and settings 2025-02-19 13:51:51 -08:00
Paul Gauthier
50fafc9ff6 bump deps; downgrade streamlit per #3221 2025-02-19 13:47:21 -08:00
Paul Gauthier
47fc6a689d Revert "fix: Ignore decoding errors when reading text files"
This reverts commit f67ea5d010.
2025-02-19 13:18:17 -08:00
paul-gauthier
86175a1827 Merge pull request #3127 from FeepingCreature/fix/sort-file-tokens
refactor: Sort files by token count in cmd_tokens
2025-02-18 11:50:36 -08:00
FeepingCreature (aider)
6d6e25df4e refactor: Sort files by token count in cmd_tokens 2025-02-18 20:11:50 +01:00
paul-gauthier
5402ed112c Merge pull request #3283 from ffluk3/add-build-gradle-kts
fix: add build.gradle.kts to special.py
2025-02-17 08:07:41 -08:00
Lucas Shadler
235b83d02e fix: add build.gradle.kts to special.py
Now that aider supports Kotlin syntax, this change will allow for indexing of kotlin-based gradle project files
2025-02-17 06:22:43 -08:00
Paul Gauthier
6ffbec969a copy 2025-02-15 12:01:40 -08:00
Paul Gauthier
185ea71646 Merge branch 'main' of github.com:Aider-AI/aider 2025-02-15 12:00:47 -08:00
Paul Gauthier
69fcc3acd7 fix: Change file reading error handling from "ignore" to "replace" 2025-02-15 12:00:39 -08:00
paul-gauthier
da94cf4aab Merge pull request #3252 from devriesd/editor-shell-true
subprocess called with shell true
2025-02-14 09:15:17 -08:00
Daniel de Vries
8799cf95b4 subprocess now called with shell true 2025-02-14 11:47:45 -05:00
Paul Gauthier (aider)
108ce18d51 style: Fix linting issues in io.py file 2025-02-13 12:12:40 -08:00
Paul Gauthier (aider)
f67ea5d010 fix: Ignore decoding errors when reading text files 2025-02-13 12:12:35 -08:00
Paul Gauthier
dd857aeccf fix: Handle file reading with encoding, ignore decoding errors 2025-02-13 12:12:33 -08:00
Paul Gauthier
44b1acd385 feat: Add tree-sitter language pack configuration and version pinning 2025-02-10 14:25:42 -08:00
Paul Gauthier
b2f6018e05 Merge branch 'main' into ts-pack 2025-02-10 13:59:10 -08:00
Paul Gauthier
bca6507f11 bump deps 2025-02-10 11:48:19 -08:00
Paul Gauthier (aider)
30332c2ba5 style: Apply linter formatting to issues.py script 2025-02-10 11:37:35 -08:00
Paul Gauthier (aider)
17919d7503 refactor: Add priority label check to prevent bot actions on priority issues 2025-02-10 11:37:30 -08:00
Paul Gauthier
42237ced80 feat: Add CLI option to install tree-sitter language pack 2025-02-09 17:19:19 -08:00
Paul Gauthier
737021ccdf Merge branch 'main' into ts-pack 2025-02-09 17:13:53 -08:00
Paul Gauthier
22ed9d8d7c set version to 0.74.3.dev 2025-02-09 15:27:49 -08:00
Paul Gauthier
49dcd11813 version bump to 0.74.2 2025-02-09 15:26:05 -08:00
Paul Gauthier
7c30086d78 copy 2025-02-09 15:25:49 -08:00
Paul Gauthier
e2dbfdc537 feat: Add configurable cache keepalive delay and pings option 2025-02-09 15:22:19 -08:00
Paul Gauthier
674eb109c2 copy 2025-02-08 06:49:14 -08:00
Paul Gauthier
927b5bc8cc Merge branch 'main' into ts-pack 2025-02-07 18:10:37 -08:00
Paul Gauthier
f7dd0fc582 refactor: Modify cache warming mechanism with ok_to_warm_cache flag 2025-02-07 16:39:35 -08:00
Paul Gauthier (aider)
35f30bde04 style: Apply linter formatting to base_coder.py 2025-02-07 16:26:09 -08:00
Paul Gauthier (aider)
a682b50fd4 refactor: Improve cache warming thread cleanup in Coder class 2025-02-07 16:26:02 -08:00
Paul Gauthier
3b5024749f fix: Modify cache warming logic with debug dump statements 2025-02-07 16:26:00 -08:00
Paul Gauthier
2a56d892d7 works with both tsl and tsl-pack 2025-02-07 16:18:09 -08:00
Paul Gauthier
e3d5eaf388 reorg scm files 2025-02-07 15:29:28 -08:00
Paul Gauthier (aider)
5d1f50117b refactor: Improve file lookup logic in get_scm_fname 2025-02-07 15:23:50 -08:00
Paul Gauthier
f6a2ec15d7 refactor: Update get_scm_fname to support multiple query subdirectories 2025-02-07 15:23:48 -08:00
Paul Gauthier
64a8d56725 reorg scm files 2025-02-07 15:17:59 -08:00
Paul Gauthier
71caea32e7 cleanup 2025-02-07 15:11:21 -08:00
Paul Gauthier
17993ef9ff works 2025-02-07 14:26:59 -08:00
Paul Gauthier
b0aa4ef4c8 wip 2025-02-07 11:34:33 -08:00
Paul Gauthier
5c4aaa27d9 Merge branch 'main' into ts-pack 2025-02-07 11:15:10 -08:00
Paul Gauthier
53586d95d0 updated blame 2025-02-07 11:06:30 -08:00
Paul Gauthier (aider)
3877ab1f00 style: Apply linter formatting to blame.py 2025-02-07 10:57:42 -08:00
Paul Gauthier (aider)
2425322e8d refactor: Improve test file filtering logic in blame script 2025-02-07 10:57:38 -08:00
Paul Gauthier (aider)
3f80a113d1 style: Lint and format blame.py script 2025-02-07 10:56:50 -08:00
Paul Gauthier (aider)
9ad20849d3 feat: Include language test files in blame script 2025-02-07 10:56:46 -08:00
Paul Gauthier
c8c58280d8 refactor: Modify file filtering logic in blame script 2025-02-07 10:56:44 -08:00
Paul Gauthier
d40505cd16 copy 2025-02-07 10:55:10 -08:00
Paul Gauthier
25c5f84090 rename 2025-02-07 10:55:01 -08:00
Paul Gauthier (aider)
a58293f04b feat: Add sample Terraform code for HCL language testing 2025-02-07 10:53:28 -08:00
Paul Gauthier
1408fb41b8 feat: Add Terraform HCL fixture file for testing 2025-02-07 10:53:27 -08:00
Paul Gauthier
cb7cb8e527 Add attribution 2025-02-07 10:51:00 -08:00
Paul Gauthier
d750dbc703 bump deps to pickup grep-ast 0.5.0 2025-02-07 10:50:49 -08:00
paul-gauthier
91b417138a Merge pull request #3173 from krewenki/main
Add support for terraform/hcl repomaps
2025-02-07 10:49:02 -08:00
Warren Krewenki
db5eabd927 Add hcl queries and bump required grep-ast 2025-02-07 14:42:19 -04:00
Paul Gauthier
cbcc0fde04 copy 2025-02-07 08:56:02 -08:00
Paul Gauthier
cca3b98a09 set version to 0.74.2.dev 2025-02-07 08:55:43 -08:00
Paul Gauthier
e63b8ff35d version bump to 0.74.1 2025-02-07 08:54:04 -08:00
Paul Gauthier
b6a37bf0e2 copy 2025-02-07 08:51:29 -08:00
Paul Gauthier
249ca4fd75 remove useless tests 2025-02-07 08:51:20 -08:00
Paul Gauthier (aider)
d382869b98 style: Apply linter formatting to test_coder.py 2025-02-07 08:47:39 -08:00
Paul Gauthier (aider)
41a3c27aba feat: Update system prompt prefix tests to check first line 2025-02-07 08:47:33 -08:00
Paul Gauthier (aider)
af48c46c30 style: Fix linting issues in test_coder.py 2025-02-07 08:39:39 -08:00
Paul Gauthier (aider)
52bc51a197 test: Add tests for system_prompt_prefix functionality 2025-02-07 08:39:33 -08:00
Paul Gauthier (aider)
57ca9cc840 feat: Add continuation prompt for multiline input in prompt_toolkit 2025-02-07 08:36:52 -08:00
Paul Gauthier
56d6a47ad3 remove ". " from multiline input 2025-02-07 08:34:16 -08:00
Paul Gauthier
b806360a49 copy 2025-02-06 16:47:41 -08:00
Paul Gauthier
739a88ed00 Add -DEXERCISM_RUN_ALL_TESTS to cpp tests 2025-02-06 16:41:59 -08:00
Paul Gauthier (aider)
38d4341e59 build: Add libboost-all-dev to Dockerfile for C++ support 2025-02-06 16:41:45 -08:00
Paul Gauthier
6118d91922 improve unit tests in benchmark 2025-02-06 16:27:29 -08:00
Paul Gauthier
71ac7efafe copy 2025-02-06 15:35:10 -08:00
Paul Gauthier
cf0710225c Tell o1 & o3-mini to use markdown 2025-02-06 15:32:21 -08:00
Paul Gauthier
21e96df85a copy 2025-02-06 14:56:58 -08:00
Paul Gauthier
79f32c2ebd set version to 0.74.1.dev 2025-02-06 14:36:46 -08:00
Paul Gauthier
492a1f69b3 version bump to 0.74.0 2025-02-06 14:35:10 -08:00
Paul Gauthier
32b962e186 copy 2025-02-06 14:32:59 -08:00
Paul Gauthier
37beb8e6b2 copy 2025-02-06 14:29:02 -08:00
Paul Gauthier
1ee9f3815d copy 2025-02-06 14:28:56 -08:00
Paul Gauthier
65a5e8721c copy 2025-02-06 14:28:07 -08:00
Paul Gauthier (aider)
036c7a2117 fix: Remove unnecessary f-string without placeholders 2025-02-06 14:15:17 -08:00
Paul Gauthier
229e8e1ad1 refactor: Update file addition confirmation message and add TimeoutError to git error handling 2025-02-06 14:15:09 -08:00
Paul Gauthier
390bb1bdc5 copy 2025-02-06 14:11:18 -08:00
Paul Gauthier
83b401b241 feat: Add dot after newline in multiline input mode 2025-02-06 14:10:22 -08:00
Paul Gauthier (aider)
cfb2c1f62a style: Format code with linter 2025-02-06 14:07:38 -08:00
Paul Gauthier (aider)
4ad7df746e style: Move imports to top of file to fix E402 errors 2025-02-06 14:07:33 -08:00
Paul Gauthier (aider)
a218b1d3d0 style: Run linter on aider/io.py 2025-02-06 14:06:42 -08:00
Paul Gauthier (aider)
6f61aff735 fix: Replace bare except and reorganize imports in io.py 2025-02-06 14:06:36 -08:00
Paul Gauthier (aider)
4893f78286 style: Format code with linter 2025-02-06 14:05:55 -08:00
Paul Gauthier (aider)
97296f3169 fix: Remove unused variable and add missing decorator 2025-02-06 14:05:47 -08:00
Paul Gauthier (aider)
ebcf4364f5 fix: Restore multiline mode after interruptions using decorator 2025-02-06 14:05:14 -08:00
Paul Gauthier (aider)
6d0078d39b style: Remove trailing whitespace in test_io.py 2025-02-06 13:56:22 -08:00
Paul Gauthier (aider)
9b80b693c1 test: add tests for multiline mode restoration after prompt interrupts 2025-02-06 13:56:14 -08:00
Paul Gauthier
2e1e26fdb9 copy 2025-02-06 13:45:23 -08:00
Paul Gauthier
ddeb43783c refactor: Update model switching to preserve weak model configuration 2025-02-06 13:43:58 -08:00
Paul Gauthier
b61e527baa copy 2025-02-06 13:25:05 -08:00
Paul Gauthier
53ce96b48f refactor: Remove redundant test case for request timeout in send_completion 2025-02-06 11:48:55 -08:00
Paul Gauthier (aider)
36ea166c20 test: add request_timeout tests for Model class 2025-02-06 11:47:57 -08:00
Paul Gauthier (aider)
f9fd4c71f1 fix: Add missing timeout parameter to test assertion 2025-02-06 11:47:08 -08:00
Paul Gauthier (aider)
44171417e3 fix: Update test assertions to include timeout parameter 2025-02-06 11:46:39 -08:00
Paul Gauthier
b554a46a4c copy 2025-02-06 11:41:03 -08:00
Paul Gauthier (aider)
19a2c37678 style: Apply linting to models.py file 2025-02-06 11:37:52 -08:00
Paul Gauthier (aider)
23d74040ed refactor: Improve timeout handling in litellm.completion method 2025-02-06 11:37:47 -08:00
Paul Gauthier
685e63b9da fix: Adjust timeout handling in litellm.completion method 2025-02-06 11:37:44 -08:00
Paul Gauthier
39855f4d2b refactor: Change timeout handling to use float type and global request_timeout 2025-02-06 11:36:15 -08:00
Paul Gauthier
ae6fc41ca9 feat: Add new OpenAI model names to supported models list 2025-02-06 11:21:18 -08:00
Paul Gauthier
1bb41bec2a copy 2025-02-06 09:55:12 -08:00
Paul Gauthier
041d679a54 refactor: Remove debug dump call in LiteLLMExceptions class 2025-02-06 09:53:53 -08:00
Paul Gauthier
46058c275c refactor: Simplify exception handling and remove redundant validation in LiteLLMExceptions 2025-02-06 09:53:42 -08:00
Paul Gauthier
b9e15a1340 copy 2025-02-06 09:53:31 -08:00
Paul Gauthier (aider)
f9eb4ffee2 style: Remove trailing whitespace in exceptions.py 2025-02-06 09:51:38 -08:00
Paul Gauthier (aider)
419952f33b refactor: Convert exception_names to dict mapping names to ExInfo 2025-02-06 09:51:33 -08:00
Paul Gauthier
af8bdcd9e0 refactor: Simplify exception validation logic in LiteLLMExceptions 2025-02-06 09:51:31 -08:00
Paul Gauthier (aider)
54122af9d7 style: Reorder imports in exceptions.py 2025-02-06 09:49:44 -08:00
Paul Gauthier (aider)
5e4852bd32 refactor: Optimize exception lookup using a set in LiteLLMExceptions 2025-02-06 09:49:40 -08:00
Paul Gauthier
3714f9fdbd refactor: Add dump import and debug output in LiteLLMExceptions 2025-02-06 09:49:37 -08:00
Paul Gauthier (aider)
a9dd6e0f3d style: Remove trailing whitespace in test_models.py 2025-02-06 09:33:30 -08:00
Paul Gauthier (aider)
3c9f4ee555 test: Add tests for use_temperature behavior in Model class 2025-02-06 09:33:23 -08:00
Paul Gauthier
7ff0b4c6b9 copy 2025-02-06 08:52:50 -08:00
Paul Gauthier
648662469b copy 2025-02-06 08:51:24 -08:00
Paul Gauthier
c37ddd7872 refactor: Update test_get_roots_to_watch to include .gitignore in watched roots 2025-02-06 08:50:49 -08:00
Paul Gauthier (aider)
17f35cde19 refactor: Move MinimalCoder class definition to module level in test_watch.py 2025-02-06 08:43:26 -08:00
Paul Gauthier (aider)
b5d17b99df style: Format code and fix whitespace issues 2025-02-06 08:43:11 -08:00
Paul Gauthier (aider)
5c9746e209 refactor: Split watch_files() into testable components and add tests 2025-02-06 08:43:04 -08:00
Paul Gauthier (aider)
51938affc2 style: Format test_models.py with linter 2025-02-06 08:36:38 -08:00
Paul Gauthier (aider)
856006a68d test: add tests for remove_reasoning_content and simple_send_with_retries 2025-02-06 08:36:33 -08:00
Paul Gauthier (aider)
a2622263ce test: add cases for 's'/'skip' and 'a'/'all' in confirm_ask without group 2025-02-06 08:29:00 -08:00
Paul Gauthier (aider)
7db1613b1a test: Add provider-prefixed deepseek model test cases 2025-02-06 08:25:59 -08:00
Paul Gauthier
3add686e9b test: Remove gpt-4-turbo test case from test_models.py 2025-02-06 08:25:38 -08:00
Paul Gauthier (aider)
a9f0983f0f test: add tests for configure_model_settings covering all cases 2025-02-06 08:23:34 -08:00
Paul Gauthier (aider)
3b16d6c291 fix: Update test_ollama_uses_existing_num_ctx to match actual call parameters 2025-02-06 08:22:19 -08:00
Paul Gauthier (aider)
85399bd6e2 style: Format code with linter in test_models.py 2025-02-06 08:21:48 -08:00
Paul Gauthier (aider)
aef2b95d41 fix: Reset MODEL_SETTINGS between tests to prevent parameter leakage 2025-02-06 08:21:42 -08:00
Paul Gauthier (aider)
11a233da84 fix: Update test assertions to match actual model completion call parameters 2025-02-06 08:20:38 -08:00
Paul Gauthier (aider)
016aa87e34 style: Format strings with double quotes in test_models.py 2025-02-06 08:19:25 -08:00
Paul Gauthier (aider)
9094af565f test: add tests for Ollama model num_ctx handling 2025-02-06 08:19:19 -08:00
Paul Gauthier
d7de908c66 copy 2025-02-06 08:13:46 -08:00
Paul Gauthier
a3985ac94c copy 2025-02-06 08:07:05 -08:00
Paul Gauthier
b48f26020a Merge branch 'main' of github.com:Aider-AI/aider 2025-02-06 07:52:43 -08:00
Paul Gauthier
630d3679b5 copy 2025-02-06 07:51:08 -08:00
Paul Gauthier
78c89eb29b refactor: Expand valid responses and options for user prompts 2025-02-06 07:50:47 -08:00
Paul Gauthier
7fe4996bbe add gemini/gemini-2.0-flash 2025-02-06 07:50:39 -08:00
paul-gauthier
370deda5a7 Merge pull request #3152 from daysm/patch-1 2025-02-06 06:05:14 -08:00
Dayyan Smith
d0d8ff8313 Fix typo 2025-02-06 10:27:06 +01:00
Paul Gauthier
550b9ebf4d limit benchmark docker memory 2025-02-05 16:40:03 -08:00
Paul Gauthier
2265456bda copy 2025-02-05 13:45:32 -08:00
Paul Gauthier
b0f1cde33f copy 2025-02-05 13:02:26 -08:00
Paul Gauthier
cdd150be42 cleanup 2025-02-05 13:02:16 -08:00
Paul Gauthier (aider)
0d24d75d8f style: Format code with linter for improved readability 2025-02-05 13:01:04 -08:00
Paul Gauthier (aider)
5c866c67b5 fix: Handle summarizer failure gracefully with fallback and warning 2025-02-05 13:00:57 -08:00
Paul Gauthier
b49fea87ab quad_backtick_reminder 2025-02-05 12:59:15 -08:00
Paul Gauthier
1c262d22ce add test case for #2879 2025-02-05 12:53:32 -08:00
Paul Gauthier
0dde77009e re-enabled quad-backticks, but allow triple-backticks as fences when searching for filenames #2879 2025-02-05 12:50:02 -08:00
Paul Gauthier
3e71c35fdd stop using quad-backticks: LLMs ignore and revert to triple-backtick, causing #2879 2025-02-05 12:42:19 -08:00
Paul Gauthier
10f1fc5e92 Merge branch 'main' of github.com:Aider-AI/aider 2025-02-04 17:04:01 -08:00
Paul Gauthier
8fbad757bf copy 2025-02-04 16:34:21 -08:00
Paul Gauthier
5755aa3eb8 feat: Improve model metadata handling and startup performance 2025-02-04 16:34:07 -08:00
Paul Gauthier (aider)
f76d14f613 chore: Run linter on test_main.py for code quality improvements 2025-02-04 16:30:06 -08:00
Paul Gauthier (aider)
0c3470bab2 feat: Update test_model_metadata_file to reset local model metadata 2025-02-04 16:30:01 -08:00
Paul Gauthier
315ad06ecc docs: Add comment to reset model_info_manager in test_model_metadata_file 2025-02-04 16:29:52 -08:00
Paul Gauthier (aider)
c1627612cf refactor: Move LOCAL_MODEL_METADATA to ModelInfoManager as an instance attribute 2025-02-04 16:28:10 -08:00
Paul Gauthier
b5cfceeed6 refactor: Rename LITELLM_MODEL_DEFS to LOCAL_MODEL_METADATA for clarity 2025-02-04 16:21:56 -08:00
Paul Gauthier
7fe7dd743c refactor: Remove debug logging and simplify model data retrieval 2025-02-04 16:13:28 -08:00
Paul Gauthier
3e36f27987 feat: Add Fireworks AI API key support to model configuration 2025-02-04 16:12:02 -08:00
Paul Gauthier (aider)
b9f4f3f71c style: Apply linter formatting to models.py 2025-02-04 16:10:56 -08:00
Paul Gauthier (aider)
ff1230c3ae feat: Add API key mappings for various model providers 2025-02-04 16:10:51 -08:00
Paul Gauthier
e71ec574e1 refactor: Improve model environment key validation and detection 2025-02-04 16:10:49 -08:00
Paul Gauthier
c2e716ec4a refactor: Change LITELLM_MODEL_DEFS from list to dict for efficient model registration 2025-02-04 16:00:20 -08:00
Paul Gauthier (aider)
5ad8bb1830 refactor: Defer litellm registration to improve loading performance 2025-02-04 15:56:18 -08:00
paul-gauthier
751e78baa9 Merge pull request #3137 from aroffe99/patch-1 2025-02-04 14:12:30 -08:00
Ari Roffe
be620bd437 Update adv-model-settings.md 2025-02-04 16:09:11 -06:00
Paul Gauthier
44365651a6 copy 2025-02-04 14:03:00 -08:00
Paul Gauthier
7b557c0586 refactor: Change default temperature to None and remove debug dump 2025-02-04 14:00:25 -08:00
Paul Gauthier (aider)
495a27c0a7 refactor: Make use_temperature support both bool and float types 2025-02-04 13:58:54 -08:00
Paul Gauthier
e07fddb20b refactor: Update temperature handling in Model class 2025-02-04 13:58:53 -08:00
Paul Gauthier
56eb1d106f default to remove_reasoning:think for any unknown r1 model 2025-02-04 13:51:05 -08:00
Paul Gauthier (aider)
c8b6d61ae2 fix: Add missing 're' import for regex operations 2025-02-04 13:37:50 -08:00
Paul Gauthier
47e91e943c refactor: Modify response content handling and reasoning removal logic 2025-02-04 13:37:43 -08:00
Paul Gauthier
4f8c52f09e copy 2025-02-04 13:23:05 -08:00
Paul Gauthier
f20b32b01b refactor: Remove debug dump statement from file watcher 2025-02-04 13:14:45 -08:00
Paul Gauthier (aider)
37cbb5ed01 style: Format code to comply with linter standards 2025-02-04 13:14:27 -08:00
Paul Gauthier (aider)
289e13cb46 fix: Convert paths to POSIX format for .gitignore matching on Windows 2025-02-04 13:14:23 -08:00
Paul Gauthier (aider)
fb03c4c311 style: Run linter and format code in FileWatcher class 2025-02-04 13:12:13 -08:00
Paul Gauthier (aider)
a65aecaf74 fix: Append trailing slash for directory paths in roots_to_watch filtering 2025-02-04 13:12:10 -08:00
Paul Gauthier
da9ba0a26a refactor: Update dump to filter roots_to_watch for tmp.benchmarks 2025-02-04 13:12:09 -08:00
Paul Gauthier (aider)
8440e881c0 fix: Use relative path for matching files against .gitignore patterns 2025-02-04 13:10:45 -08:00
Paul Gauthier
85fa8a4761 feat: Add debug statement to log presence of 'tmp.benchmarks' in roots_to_watch 2025-02-04 13:10:43 -08:00
Paul Gauthier (aider)
5c8c78ca69 style: Format code with linter adjustments for readability 2025-02-04 13:03:32 -08:00
Paul Gauthier (aider)
e9097c3b29 feat: Filter top-level directories based on .gitignore in file watcher 2025-02-04 13:03:29 -08:00
Paul Gauthier (aider)
d53ee24741 build: Add boto3 to Dockerfile pip install commands 2025-02-04 12:52:05 -08:00
Paul Gauthier
6517cb15ef copy 2025-02-04 12:47:33 -08:00
Paul Gauthier (aider)
7b78f92feb refactor: Remove unused proceed variable in check_tokens method 2025-02-04 12:45:59 -08:00
Paul Gauthier
0af6dc3838 refactor: Simplify context window handling and remove Ollama-specific warnings 2025-02-04 12:45:44 -08:00
Paul Gauthier (aider)
e313a2ea45 feat: Update kwargs to include num_ctx for ollama if not set 2025-02-04 12:31:48 -08:00
Paul Gauthier
f21ef30482 feat: Add methods to identify deepseek and ollama models 2025-02-04 12:31:10 -08:00
Paul Gauthier (aider)
606fce65ab test: Fix assertion errors in commit message tests for mock calls 2025-02-04 12:22:09 -08:00
Paul Gauthier (aider)
b4084484ff fix: Update test patches to mock simple_send_with_retries correctly 2025-02-04 12:20:13 -08:00
Paul Gauthier (aider)
80062908d9 test: Fix mocking setup for simple_send_with_retries in tests 2025-02-04 12:17:45 -08:00
Paul Gauthier (aider)
af8f7e95b0 test: Mock simple_send_with_retries method in test setup 2025-02-04 12:11:43 -08:00
Paul Gauthier (aider)
9553478384 test: Fix patch target for simple_send_with_retries in tests 2025-02-04 12:06:59 -08:00
Paul Gauthier (aider)
535b3ce286 refactor: Update calls to simple_send_with_retries to use model method 2025-02-04 12:04:25 -08:00
Paul Gauthier (aider)
cfe9c86edd fix: Remove unused import from test_sendchat.py 2025-02-04 12:03:10 -08:00
Paul Gauthier (aider)
ee66044425 refactor: Update send_completion calls to use model method syntax 2025-02-04 12:02:38 -08:00
Paul Gauthier
30d56e1af0 refactor: Simplify model completion parameters and remove extra configuration 2025-02-04 11:50:42 -08:00
Paul Gauthier (aider)
354630770b style: Run linter and fix import formatting in base_coder.py and models.py 2025-02-04 11:45:49 -08:00
Paul Gauthier (aider)
74da63e3ca refactor: Move RETRY_TIMEOUT constant to models.py 2025-02-04 11:45:40 -08:00
Paul Gauthier
faa438bc51 refactor: Simplify send_completion method by removing extra_params argument 2025-02-04 11:45:39 -08:00
Paul Gauthier (aider)
6de6fb1932 chore: Run linter and fix import order in base_coder.py 2025-02-04 11:45:09 -08:00
Paul Gauthier (aider)
6a8acefa30 fix: Import RETRY_TIMEOUT to resolve undefined name error 2025-02-04 11:45:05 -08:00
Paul Gauthier
ddec8325e7 fix: Simplify temperature handling in model completion call 2025-02-04 11:45:04 -08:00
Paul Gauthier (aider)
b1852526f5 style: Run linter and format import statements in models.py 2025-02-04 11:38:30 -08:00
Paul Gauthier (aider)
20aaf58ee9 refactor: Move aider.sendchat imports to the top of the file 2025-02-04 11:38:26 -08:00
Paul Gauthier (aider)
b3db597c4b fix: Remove unused import of simple_send_with_retries in history.py 2025-02-04 11:37:15 -08:00
Paul Gauthier (aider)
d302f228f9 fix: Update method call to use model's simple_send_with_retries 2025-02-04 11:37:01 -08:00
Paul Gauthier (aider)
74d5e2b0c1 style: Run linter and fix formatting issues in repo.py 2025-02-04 11:36:16 -08:00
Paul Gauthier (aider)
dd42d24d8a fix: Remove unused import of simple_send_with_retries in repo.py 2025-02-04 11:36:13 -08:00
Paul Gauthier (aider)
5692fb32cd fix: Remove unused imports from repo.py and base_coder.py 2025-02-04 11:35:58 -08:00
Paul Gauthier (aider)
dbf80d564b refactor: Update method calls to use model's instance methods 2025-02-04 11:35:35 -08:00
Paul Gauthier (aider)
72b82a8d19 style: Run linter and fix whitespace issues in models.py and sendchat.py 2025-02-04 11:34:45 -08:00
Paul Gauthier (aider)
c3beaedaa6 chore: remove CACHE logic from sendchat and models files 2025-02-04 11:34:38 -08:00
Paul Gauthier (aider)
db694b20df style: Run linter and fix import order in models.py and sendchat.py 2025-02-04 11:33:49 -08:00
Paul Gauthier (aider)
34227ce738 fix: Remove unused imports from sendchat.py and add hashlib import in models.py 2025-02-04 11:33:43 -08:00
Paul Gauthier (aider)
24b1360eb8 style: Run linter and fix whitespace issues in models.py and sendchat.py 2025-02-04 11:33:05 -08:00
Paul Gauthier (aider)
60aff26d94 refactor: Move send_completion and simple_send_with_retries to Model class 2025-02-04 11:32:58 -08:00
Paul Gauthier
144bdf7dc7 cleanup 2025-02-04 11:28:40 -08:00
Paul Gauthier (aider)
8db4bb298e style: Apply linter fixes to models.py 2025-02-04 11:25:09 -08:00
Paul Gauthier (aider)
028477f34d refactor: Prevent overwriting existing num_ctx for Ollama models 2025-02-04 11:25:04 -08:00
Paul Gauthier
6725c9e3cd feat: Add Ollama model context size configuration in model settings 2025-02-04 11:25:02 -08:00
paul-gauthier
a14dee5b8d Merge pull request #3136 from szepeviktor/typos
Correct a typo
2025-02-04 11:02:35 -08:00
Paul Gauthier
2f8a1fc58f copy 2025-02-04 10:59:14 -08:00
Viktor Szépe
f250c4310e Correct a typo 2025-02-04 18:57:42 +00:00
Paul Gauthier
ad46e8a5e0 feat: Add model-specific configuration settings for various AI models 2025-02-04 10:44:50 -08:00
Paul Gauthier
1e7031e5f4 copy 2025-02-04 09:50:25 -08:00
Paul Gauthier
8c736e979d copy 2025-02-04 09:48:40 -08:00
Paul Gauthier
335742a023 copy 2025-02-04 09:46:26 -08:00
Paul Gauthier
384ff3484c copy 2025-02-04 09:33:56 -08:00
Paul Gauthier (aider)
e17c29c258 style: Fix linter warnings in main.py 2025-02-04 08:04:23 -08:00
Paul Gauthier (aider)
e7d979ca74 feat: Conditionally add .env to .gitignore based on file existence 2025-02-04 08:04:17 -08:00
Paul Gauthier
bc2f38c790 refactor: Simplify gitignore check and error handling logic 2025-02-04 08:04:16 -08:00
Paul Gauthier (aider)
88ee089d86 style: Apply linter formatting to main.py 2025-02-04 07:59:32 -08:00
Paul Gauthier (aider)
d9adaa5020 fix: Handle git errors in check_gitignore function 2025-02-04 07:59:26 -08:00
Paul Gauthier (aider)
4a963adbcb refactor: Simplify check_gitignore function and remove AI comments 2025-02-04 07:58:32 -08:00
Paul Gauthier
56ac57b4cf feat: Enhance gitignore checking with improved repo ignore detection and pattern handling 2025-02-04 07:58:28 -08:00
Paul Gauthier
cdbe2393c4 copy 2025-02-04 07:55:01 -08:00
Paul Gauthier
2f4490d059 fix: Update Dockerfile HOME env to persist container data in host filesystem 2025-02-04 07:51:00 -08:00
Paul Gauthier
447660504c added azure/o3-mini 2025-02-04 07:50:06 -08:00
Paul Gauthier
5e44d18d54 feat: Enhance gitignore prompt with option to skip check 2025-02-03 19:02:51 -08:00
Paul Gauthier
7a9edae227 copy 2025-02-03 18:58:25 -08:00
Paul Gauthier (aider)
81b7bd35f4 fix: Adjust permissions for directories to allow writing with -u switch 2025-02-03 18:53:16 -08:00
Paul Gauthier
4b946a23ca chore: Set HOME environment variable in Dockerfile 2025-02-03 18:53:15 -08:00
Paul Gauthier
5ab92b1833 chat:free -> r1:free 2025-02-03 10:28:07 -08:00
Paul Gauthier
1a6a16e061 chore: Update polyglot leaderboard with new test run data 2025-01-31 15:13:34 -08:00
Paul Gauthier
061b602334 feat: Add OpenRouter O3-Mini and GPT-4O-Mini model configurations 2025-01-31 15:09:40 -08:00
Paul Gauthier
f7deb02560 copy 2025-01-31 14:00:43 -08:00
Paul Gauthier
9dfe85eca3 copy 2025-01-31 14:00:22 -08:00
Paul Gauthier
cd5823d9f6 set version to 0.73.1.dev 2025-01-31 13:48:42 -08:00
Paul Gauthier
1af0a6cc8f version bump to 0.73.0 2025-01-31 13:46:55 -08:00
Paul Gauthier
9ed8ebab78 refactor: Use getattr with default for checking main_model.extra_params 2025-01-31 13:40:54 -08:00
Paul Gauthier
7f82a33bf5 copy 2025-01-31 13:36:04 -08:00
Paul Gauthier
41a7e5c915 copy 2025-01-31 13:32:39 -08:00
Paul Gauthier
8d22c0ba90 add o3mini high 2025-01-31 13:32:30 -08:00
Paul Gauthier (aider)
4636ae7237 feat: Add total cost column to polyglot leaderboard table 2025-01-31 13:24:27 -08:00
Paul Gauthier (aider)
ee9d0c4a99 style: Format code with linter and improve readability 2025-01-31 13:13:10 -08:00
Paul Gauthier (aider)
476a0ad6ad test: Add test for --reasoning-effort CLI option 2025-01-31 13:13:05 -08:00
Paul Gauthier
14612fc116 better arg desc 2025-01-31 13:10:19 -08:00
Paul Gauthier (aider)
5c87787351 style: Apply linter formatting to main.py 2025-01-31 13:07:15 -08:00
Paul Gauthier (aider)
3fa796382e feat: Add --reasoning-effort CLI parameter to control model reasoning effort 2025-01-31 13:07:08 -08:00
Paul Gauthier
f4f4761517 feat: Add CLI parameter for reasoning effort in main model configuration 2025-01-31 13:07:06 -08:00
Paul Gauthier
c78de41ccf copy 2025-01-31 12:51:33 -08:00
Paul Gauthier
b0d58d10bd o3-mini 2025-01-31 12:37:10 -08:00
Paul Gauthier
f778741ee3 added o3-mini 2025-01-31 12:35:49 -08:00
Paul Gauthier
2fb517b293 copy 2025-01-31 09:13:50 -08:00
Paul Gauthier
aecc32fbfb copy 2025-01-31 09:13:36 -08:00
Paul Gauthier
64c8c0590c copy 2025-01-31 09:06:48 -08:00
Paul Gauthier
24dc436122 copy 2025-01-31 09:04:40 -08:00
Paul Gauthier
1e1fef52c4 fix: Improve default input handling and model selection logic 2025-01-31 09:04:27 -08:00
Paul Gauthier (aider)
c8b9e2ff37 fix: Update model name assertion tests to use partial matching 2025-01-31 09:02:00 -08:00
Paul Gauthier (aider)
34a6902986 style: Format test code with consistent line breaks and indentation 2025-01-31 09:01:14 -08:00
Paul Gauthier (aider)
0c47b0eb53 test: Add tests for default model selection and API key precedence 2025-01-31 09:01:09 -08:00
Paul Gauthier (aider)
5d4ef7d009 fix: Remove incorrect self. reference in main() function 2025-01-31 08:59:36 -08:00
Paul Gauthier
31d23bc9a7 feat: Add model and API key validation with documentation link 2025-01-31 08:59:26 -08:00
Paul Gauthier
b4b54d1796 feat: Add support for OpenRouter and GPT-4o model selection with improved model detection 2025-01-31 08:46:16 -08:00
Paul Gauthier (aider)
5023dfeb24 refactor: Replace if/else chain with list of tuples for model selection 2025-01-31 08:42:25 -08:00
Paul Gauthier (aider)
dad3092d8d feat: Add dynamic model selection based on available API keys 2025-01-31 08:42:02 -08:00
Paul Gauthier
ab77c032de feat: Add dynamic model selection based on available API keys 2025-01-31 08:42:00 -08:00
Paul Gauthier
778e54ef32 copy 2025-01-30 08:44:32 -08:00
Paul Gauthier
699db63615 copy 2025-01-30 08:38:38 -08:00
Paul Gauthier
01d0e13884 chore: Update polyglot leaderboard with Qwen Max test results 2025-01-30 08:38:28 -08:00
Paul Gauthier
d743c196be undo 2025-01-30 08:38:19 -08:00
Paul Gauthier (aider)
c60ec18f34 feat: Update leaderboard highlight to extract model from URL query 2025-01-30 08:37:01 -08:00
Paul Gauthier
1be1274d40 fix: Update default highlight model in leaderboard documentation 2025-01-30 08:36:53 -08:00
Paul Gauthier (aider)
a65b49ea30 feat: Use URL query parameter for highlighting models in leaderboard 2025-01-30 08:35:13 -08:00
Paul Gauthier
762d14c5a1 docs: Add comment about potential highlight parameter usage in leaderboard 2025-01-30 08:35:10 -08:00
Paul Gauthier
bd44c52cbb copy 2025-01-30 08:23:43 -08:00
Paul Gauthier
4cbdd27862 Merge branch 'main' of github.com:Aider-AI/aider 2025-01-30 08:22:32 -08:00
Paul Gauthier
62cf42efb4 feat: Add DeepSeek R1 Distill LLaMA 70B model configuration 2025-01-30 08:22:01 -08:00
paul-gauthier
47dc30ea79 Merge pull request #3074 from kennyfrc/fireworks_ai
Add `fireworks_ai/deepseek` models
2025-01-30 08:21:20 -08:00
kennyfrc
55abdff58c feat: Add extra_params with max_tokens to model settings configuration 2025-01-30 21:38:45 +08:00
kennyfrc
27cde532be feat: Add model metadata and settings for fireworks_ai/deepseek 2025-01-30 21:08:51 +08:00
Paul Gauthier
9c2bd58488 refactor: Update OpenRouter model metadata with zero token costs 2025-01-29 13:31:57 -08:00
Paul Gauthier
a3c898fc4f Merge branch 'main' of github.com:Aider-AI/aider 2025-01-29 13:29:50 -08:00
paul-gauthier
da380119ef Merge pull request #3061 from bphd/addingDeepSeekR1Free
Adding deep seek r1 free
2025-01-29 13:29:38 -08:00
Paul Gauthier
db631e3d57 copy 2025-01-29 13:27:52 -08:00
paul-gauthier
fb63f9cc92 Merge pull request #3064 from bphd/addingDirectoriesAutoCreation
Adding directories auto creation
2025-01-29 13:15:37 -08:00
xqyz
31e738a5a3 Merge branch 'Aider-AI:main' into addingDirectoriesAutoCreation 2025-01-29 18:12:57 +00:00
xqyz
f3b1b351e8 Update HISTORY.md: Adding R1 free 2025-01-29 17:41:49 +00:00
xqyz
149ecb380b Update model-metadata.json: Adding R1 free 2025-01-29 17:40:42 +00:00
xqyz
67a43ff549 Update model-settings.yml: Adding R1 free 2025-01-29 17:40:01 +00:00
xqyz
69f29d6fac Update adv-model-settings.md: Adding R1 free 2025-01-29 17:39:11 +00:00
xqyz
51c12ef745 Update infinite-output.md: Adding R1 free 2025-01-29 17:38:19 +00:00
xqyz
d0e89ec72a Update HISTORY.md: R1 free 2025-01-29 17:37:44 +00:00
Paul Gauthier
74c8b381e6 copy 2025-01-29 08:43:53 -08:00
Paul Gauthier
ddbd4236ab Merge branch 'main' of github.com:Aider-AI/aider 2025-01-29 08:43:38 -08:00
Paul Gauthier
c0cbb5c75d copy 2025-01-29 08:43:29 -08:00
paul-gauthier
717d00e64a Merge pull request #3054 from zhyu/patch-1 2025-01-29 05:58:00 -08:00
Yu Zhang
19e9e52c4f remove redundant extra_params 2025-01-29 15:27:32 +09:00
Yu Zhang
1df2465222 Fix docs regarding extra_body 2025-01-29 15:18:59 +09:00
Paul Gauthier (aider)
70883d7fdc refactor: Remove total cost column from markdown table 2025-01-28 19:05:55 -08:00
Paul Gauthier
f3f5f0f896 docs: Remove total cost column from DeepSeek performance table 2025-01-28 19:05:53 -08:00
Paul Gauthier
a7828809e9 copy 2025-01-28 19:05:05 -08:00
Paul Gauthier (aider)
b80a2b0bc2 feat: Add Hyperbolic section with DeepSeek V3 configuration details 2025-01-28 19:01:12 -08:00
Paul Gauthier
88d897eb14 copy 2025-01-28 18:47:17 -08:00
Paul Gauthier
2e9f562329 copy 2025-01-28 18:44:45 -08:00
Paul Gauthier
7aa6a30169 fix: Update Ollama context window handling and input confirmation logic 2025-01-28 18:44:34 -08:00
Paul Gauthier
298f713e9b copy 2025-01-28 16:33:25 -08:00
Paul Gauthier
aa339d0851 refactor: Improve text processing by stripping whitespace after removing reasoning tags 2025-01-28 14:16:02 -08:00
Paul Gauthier
ebb8596f03 move model settings to resources/yml 2025-01-28 13:36:31 -08:00
Paul Gauthier (aider)
fb57d3beef refactor: Sort MODEL_SETTINGS by name in get_model_settings_as_yaml 2025-01-28 13:35:35 -08:00
Paul Gauthier
8488175ee8 refactor: Sort model settings by name in get_model_settings_as_yaml 2025-01-28 13:35:33 -08:00
Paul Gauthier (aider)
e68191dcd9 fix: Move importlib.resources import to top of file 2025-01-28 13:31:49 -08:00
Paul Gauthier (aider)
0019a1f7dc style: Apply linter formatting to models.py 2025-01-28 13:31:38 -08:00
Paul Gauthier (aider)
5095a9e1c3 feat: Load model settings from package resource using importlib.resources 2025-01-28 13:31:32 -08:00
Paul Gauthier
ddbaa8b32b refactor: Move model settings to external YAML configuration file 2025-01-28 13:31:31 -08:00
Paul Gauthier
9f7275eced copy 2025-01-28 13:28:10 -08:00
Paul Gauthier
3d8e6823f7 copy 2025-01-28 13:23:11 -08:00
Paul Gauthier (aider)
1368348cd9 refactor: Optimize model settings YAML generation by omitting default values 2025-01-28 13:20:57 -08:00
Paul Gauthier
b31cf90596 refactor: Optimize model settings YAML generation by skipping default values 2025-01-28 13:20:55 -08:00
Paul Gauthier
66025a06d5 copy 2025-01-28 13:06:40 -08:00
Paul Gauthier
65c8504141 copy 2025-01-28 13:00:35 -08:00
Paul Gauthier
cd16e001f6 verbose 2025-01-28 11:52:07 -08:00
Paul Gauthier
77d2bc58fd copy 2025-01-28 11:30:22 -08:00
Paul Gauthier
bfc57459e1 copy 2025-01-28 11:24:32 -08:00
Paul Gauthier
3422718415 copy 2025-01-28 11:22:09 -08:00
Paul Gauthier
0b5e0a1113 copy 2025-01-28 11:16:48 -08:00
Paul Gauthier (aider)
b6b44e0f2d feat: Add table of contents to DeepSeek V3 providers post 2025-01-28 11:15:35 -08:00
Paul Gauthier
b642543600 docs: Add Ollama model configuration instructions to DeepSeek post 2025-01-28 11:15:31 -08:00
Paul Gauthier (aider)
095a05a8e1 feat: Add Ollama setup instructions for DeepSeek V3 in documentation 2025-01-28 11:13:57 -08:00
Paul Gauthier
4783204f31 docs: Add Ollama configuration details for DeepSeek V3 model 2025-01-28 11:13:55 -08:00
Paul Gauthier
82d819a6c7 copy 2025-01-28 11:04:01 -08:00
Paul Gauthier
10e7875680 copy 2025-01-28 11:03:38 -08:00
Paul Gauthier (aider)
2aad566857 docs: Add Fireworks API key setup instructions for aider 2025-01-28 10:59:52 -08:00
Paul Gauthier
a3e0a3ff1a docs: Update DeepSeek V3 alternative providers article 2025-01-28 10:59:50 -08:00
paul-gauthier
8fe9ad80bb Merge pull request #3043 from andreakeesys/patch-1
Update deepseek.md
2025-01-28 10:55:25 -08:00
Paul Gauthier
531262387d copy 2025-01-28 10:53:18 -08:00
Paul Gauthier
a73cd87b50 copy 2025-01-28 10:50:18 -08:00
Paul Gauthier
4601940f8d copy 2025-01-28 10:49:44 -08:00
Paul Gauthier
6e5b2c7368 cleanup 2025-01-28 10:49:40 -08:00
Paul Gauthier
8a3cc6041d sync model settings 2025-01-28 10:49:21 -08:00
Paul Gauthier
25687c2db1 bump deps 2025-01-28 10:49:09 -08:00
Paul Gauthier (aider)
871229d0c5 style: Remove duplicate import of re module 2025-01-28 10:08:48 -08:00
Paul Gauthier (aider)
74d179e479 refactor: Move re import to top and remove AI comment 2025-01-28 10:08:42 -08:00
Paul Gauthier
910d384ed8 refactor: Move re import comment for clarity 2025-01-28 10:08:38 -08:00
Paul Gauthier (aider)
da89d6ab9c style: Format code with linter and improve readability 2025-01-28 10:06:29 -08:00
Paul Gauthier (aider)
8d2159761f refactor: Implement reasoning removal with regex in base_coder 2025-01-28 10:06:21 -08:00
Paul Gauthier
d434f8641d refactor: Prepare for potential reasoning tag removal in text merging 2025-01-28 10:06:19 -08:00
Paul Gauthier (aider)
f49733d1d2 feat: Add remove_reasoning setting to ModelSettings 2025-01-28 10:04:12 -08:00
Paul Gauthier (aider)
a3726d72f5 fix: Update DeepSeek model name from v3 to chat in documentation 2025-01-28 09:58:50 -08:00
Paul Gauthier (aider)
fe89ae13af docs: Add API key configuration methods for OpenRouter 2025-01-28 09:58:21 -08:00
Paul Gauthier (aider)
6b90cd1277 feat: Add Fireworks configuration example and provider adaptation guidance 2025-01-28 09:54:27 -08:00
Paul Gauthier (aider)
ce64ec5397 docs: Add documentation for configuring model settings and provider selection 2025-01-28 09:53:51 -08:00
Paul Gauthier (aider)
bf6ca2dc78 docs: Update article to address DeepSeek API reliability issues and provide alternatives 2025-01-28 09:52:20 -08:00
Paul Gauthier (aider)
204c68d475 feat: Add blog post template for DeepSeek V3 polyglot benchmark results 2025-01-28 09:51:26 -08:00
Paul Gauthier
5a7e59d833 docs: Add blog post about DeepSeek model downtime 2025-01-28 09:51:24 -08:00
Paul Gauthier (aider)
0336a982ff feat: Add model settings loading and registration to benchmark script 2025-01-28 09:39:39 -08:00
Paul Gauthier (aider)
aa18b63c16 refactor: Simplify model settings loading in benchmark script 2025-01-28 09:38:57 -08:00
Paul Gauthier (aider)
3f890551e7 fix: Add missing read_model_settings parameter to run_test_real function 2025-01-28 09:33:14 -08:00
Paul Gauthier (aider)
823127c87e style: Apply linter formatting to benchmark.py 2025-01-28 09:32:55 -08:00
Paul Gauthier (aider)
cf2c9c6dc7 feat: Add --read-model-settings option to benchmark for loading model settings 2025-01-28 09:32:46 -08:00
Paul Gauthier
9b63b90ec4 refactor: Remove unnecessary blank line in benchmark.py 2025-01-28 09:32:35 -08:00
Paul Gauthier
a0ba140895 copy 2025-01-28 09:27:40 -08:00
Andrea Bergamasco
588f2502ec Update deepseek.md
Added API key instructions
2025-01-28 12:08:55 +01:00
Paul Gauthier
ae7d4592e1 copy 2025-01-27 18:29:52 -08:00
Paul Gauthier
24c7d145ea copy 2025-01-27 17:01:59 -08:00
Paul Gauthier
f1e7d68415 copy 2025-01-27 17:01:44 -08:00
Paul Gauthier
91f1528149 copy 2025-01-27 16:47:14 -08:00
Paul Gauthier (aider)
4f19f89d4c docs: Add link to advanced model settings in OpenRouter documentation 2025-01-27 16:46:03 -08:00
Paul Gauthier (aider)
60b8bccd37 feat: Add documentation for controlling OpenRouter provider selection in model settings 2025-01-27 16:45:00 -08:00
Paul Gauthier
674dcba53c copy 2025-01-27 09:29:49 -08:00
Paul Gauthier
3dec9e531f refactor: improve context window size handling for Ollama models 2025-01-26 19:09:27 -08:00
Paul Gauthier
980197cb05 copy 2025-01-26 19:05:52 -08:00
Paul Gauthier
5d30c71ccf copy 2025-01-26 19:02:55 -08:00
Paul Gauthier
1dcc5ca9f3 proceed unless ollama 2025-01-26 19:01:07 -08:00
Paul Gauthier
1eb24981c6 copy 2025-01-26 18:58:43 -08:00
Paul Gauthier
cb6b8ea5ac refactor: Improve token limit error messages and fix typo in warning method 2025-01-26 18:53:31 -08:00
Paul Gauthier (aider)
546a662a30 refactor: change token limit suggestions from tool_error to tool_output 2025-01-26 18:51:59 -08:00
Paul Gauthier
ef84c4dfad refactor: Add comment for future tool output conversion 2025-01-26 18:51:57 -08:00
Paul Gauthier (aider)
8ca81d0991 fix: handle missing extra_params attribute in Ollama model 2025-01-26 18:50:12 -08:00
Paul Gauthier (aider)
02e8158918 style: fix line wrapping in Ollama context window message 2025-01-26 18:49:28 -08:00
Paul Gauthier (aider)
37cbe6c488 feat: add Ollama context window size warning with documentation link 2025-01-26 18:49:21 -08:00
Paul Gauthier (aider)
58d763f971 feat: add confirmation prompt when token limits are exceeded 2025-01-26 18:47:39 -08:00
Paul Gauthier (aider)
3d2700d29d feat: add token limit check before sending messages to LLM 2025-01-26 18:46:42 -08:00
Paul Gauthier (aider)
e14ea94b0d style: fix line length in keyboard interrupt message handling 2025-01-26 18:46:11 -08:00
Paul Gauthier (aider)
17fde3df0c fix: remove extra bracket causing syntax error in base_coder.py 2025-01-26 18:46:05 -08:00
Paul Gauthier (aider)
162204f28f feat: improve keyboard interrupt message handling 2025-01-26 18:45:51 -08:00
Paul Gauthier
491fb14eaa feat: append keyboard interrupt message to last user message 2025-01-26 18:45:49 -08:00
Paul Gauthier
f4d7fe8850 copy 2025-01-26 13:54:06 -08:00
Paul Gauthier
4af583e5d5 copy 2025-01-26 13:49:22 -08:00
Paul Gauthier
282887368a Merge branch 'main' of github.com:Aider-AI/aider 2025-01-26 08:23:36 -08:00
paul-gauthier
94e372d8f2 Merge pull request #3004 from tao12345666333/fix-ds-link 2025-01-26 07:39:39 -08:00
Jintao Zhang
3cb67939e4 docs: clean DeepSeek Coder v2
Signed-off-by: Jintao Zhang <zhangjintao9020@gmail.com>
2025-01-26 23:11:14 +08:00
paul-gauthier
f3197d2618 Merge pull request #3000 from tao12345666333/update-deepseek-doc 2025-01-26 06:28:50 -08:00
Jintao Zhang
3785f7621c docs: update DeepSeek v2 Coder to v3 Chat
Signed-off-by: Jintao Zhang <zhangjintao9020@gmail.com>
2025-01-26 15:29:54 +08:00
Paul Gauthier
2b59badde7 copy 2025-01-25 08:46:40 -08:00
Paul Gauthier
54162b43c8 refactor: Reorder model settings and update FAQ token statistics 2025-01-25 08:46:28 -08:00
Paul Gauthier (aider)
1933cdc28c style: Reformat code to comply with linter rules 2025-01-25 08:43:46 -08:00
Paul Gauthier (aider)
f2512d1ff1 refactor: ensure 'name' field appears first in YAML output 2025-01-25 08:43:40 -08:00
Paul Gauthier (aider)
d54b13e80a style: Format code with consistent string quotes 2025-01-25 08:38:28 -08:00
Paul Gauthier (aider)
8ed5e81bdb refactor: order YAML output with name first and add blank lines 2025-01-25 08:38:21 -08:00
Paul Gauthier
f0fc83372b refactor: Reorder YAML output to prioritize "name" field and add spacing 2025-01-25 08:38:19 -08:00
Paul Gauthier
081504edab copy 2025-01-25 08:37:07 -08:00
Paul Gauthier
b939123e84 Merge branch 'main' of github.com:Aider-AI/aider 2025-01-25 08:32:29 -08:00
Paul Gauthier
f008d9dd19 feat: Add Azure O1 model configuration to MODEL_SETTINGS 2025-01-25 08:31:10 -08:00
Paul Gauthier
d2386af523 copy 2025-01-25 08:31:00 -08:00
paul-gauthier
41b9024e28 Merge pull request #2989 from hstoklosa/fix-typo
fix typo in README.md
2025-01-25 08:29:29 -08:00
Paul Gauthier
50c17bd5e4 set version to 0.72.4.dev 2025-01-25 08:15:36 -08:00
Paul Gauthier
1882c43389 version bump to 0.72.3 2025-01-25 08:13:57 -08:00
Paul Gauthier
d7027887cc copy 2025-01-25 08:13:38 -08:00
Paul Gauthier
7d8c9df252 copy 2025-01-25 08:08:44 -08:00
hstoklosa
e1e465dc51 fix typo in README.md 2025-01-25 06:07:31 +00:00
Paul Gauthier
b276d48ecf copy 2025-01-24 18:36:01 -08:00
Paul Gauthier
0c13734f7a copy 2025-01-24 15:50:04 -08:00
Paul Gauthier (aider)
de788266eb style: Format test_sendchat.py with consistent newlines 2025-01-24 09:19:21 -08:00
Paul Gauthier (aider)
eb879a743e test: add tests for ensure_alternating_roles function 2025-01-24 09:19:16 -08:00
Paul Gauthier (aider)
231bceeabb style: Fix whitespace in docstring 2025-01-24 09:14:55 -08:00
Paul Gauthier (aider)
387b7602cf style: Break long lines to comply with flake8 E501 2025-01-24 09:14:51 -08:00
Paul Gauthier
d8c14c04e3 refactor: standardize string quotes and improve model name handling 2025-01-24 09:14:37 -08:00
paul-gauthier
33f981d8f1 Merge pull request #2982 from miradnanali/ensure-alternating-roles-for-deepseek-reasoner
Ensure alternating roles for deepseek-reasoner
2025-01-24 09:11:58 -08:00
Paul Gauthier
6188b89ff0 copy 2025-01-24 09:06:59 -08:00
Paul Gauthier
2d424e078e copy 2025-01-24 09:05:53 -08:00
Paul Gauthier
ee5d72301a copy 2025-01-24 08:47:25 -08:00
Paul Gauthier
ddb02adbb4 copy 2025-01-24 08:35:29 -08:00
Paul Gauthier
b6b05f79a1 copy 2025-01-24 08:32:41 -08:00
Paul Gauthier
4a438e4799 copy 2025-01-24 08:29:40 -08:00
Paul Gauthier
31dc69da42 copy 2025-01-24 08:26:29 -08:00
Paul Gauthier (aider)
35dfd13ddd feat: make chart legend visibility configurable via show_legend assign 2025-01-24 08:24:01 -08:00
Paul Gauthier (aider)
b4535bd29b feat: hide legend in leaderboard chart 2025-01-24 08:23:28 -08:00
Paul Gauthier
5a30ec1806 docs: Add comment to hide legend in leaderboard script 2025-01-24 08:23:26 -08:00
Paul Gauthier
d7bb80468b copy 2025-01-24 08:22:13 -08:00
Mir Adnan ALI
92f6d31f33 Updated patch to avoid KeyError on malformed dict 2025-01-24 05:25:21 -05:00
Mir Adnan ALI
421bc93765 Ensure alternating roles for deepseek-reasoner 2025-01-24 03:58:08 -05:00
Paul Gauthier (aider)
9d6a692054 feat: Show "?" when total cost is 0 in table 2025-01-23 15:31:42 -08:00
Paul Gauthier (aider)
278c7bfc53 fix: Correct currency formatting in table cells using Liquid filters 2025-01-23 15:29:20 -08:00
Paul Gauthier (aider)
ad23c0e03e feat: format total_cost as $x.xx in table display 2025-01-23 15:28:33 -08:00
Paul Gauthier (aider)
ca8274dbe8 feat: Add total_cost column to results table 2025-01-23 15:28:00 -08:00
Paul Gauthier
1234fbf5f4 feat: Add new blog post for January 23, 2025 2025-01-23 15:27:58 -08:00
Paul Gauthier
e64ed4c27f copy 2025-01-23 11:35:11 -08:00
Paul Gauthier (aider)
a4b7236289 refactor: preserve original case in model name matching 2025-01-23 11:34:16 -08:00
Paul Gauthier
16c4374f7a refactor: lowercase model names for fuzzy matching while preserving original case 2025-01-23 11:34:14 -08:00
Paul Gauthier
05a77c7406 copy 2025-01-22 15:32:25 -08:00
Paul Gauthier
fceead7cbe copy 2025-01-22 15:16:02 -08:00
Paul Gauthier
3d81bdd281 copy 2025-01-22 15:08:56 -08:00
Paul Gauthier
56ab8de968 copy 2025-01-22 15:07:58 -08:00
Paul Gauthier
30b150dbfc refactor: Simplify test assertions and remove redundant checks 2025-01-22 10:17:21 -08:00
Paul Gauthier (aider)
40ee3b1b45 style: Reorder imports in test_coder.py 2025-01-22 10:05:02 -08:00
Paul Gauthier (aider)
c79217dd75 fix: Add missing imports for FinishReasonLength and sanity_check_messages 2025-01-22 10:04:58 -08:00
Paul Gauthier (aider)
075d4d4210 test: add tests for message integrity after interrupts and token limits 2025-01-22 10:03:51 -08:00
Paul Gauthier
216b679e4b set version to 0.72.3.dev 2025-01-22 10:01:02 -08:00
Paul Gauthier
c5fe81f4e6 version bump to 0.72.2 2025-01-22 09:59:23 -08:00
Paul Gauthier
0c464d0220 copy 2025-01-22 09:55:18 -08:00
Paul Gauthier
02f28d12e3 fix: Correct condition for adding assistant reply in Coder class 2025-01-22 09:53:32 -08:00
Paul Gauthier
13d24278f2 feat: Add assistant reply for token limit exhaustion in base_coder 2025-01-22 09:30:05 -08:00
Paul Gauthier
42ef4352f4 refactor: Handle KeyboardInterrupt with user-assistant message pair and add env check for sanity_check_messages 2025-01-22 09:03:09 -08:00
Paul Gauthier
843720a671 copy 2025-01-20 17:44:36 -08:00
Paul Gauthier
0884dd88d6 docs: Update usage documentation for config & text files 2025-01-20 17:44:17 -08:00
Paul Gauthier (aider)
4262fa8637 docs: add Jekyll front matter to not-code.md 2025-01-20 17:39:05 -08:00
Paul Gauthier (aider)
29a2db6552 docs: add examples for editing non-code files with aider 2025-01-20 17:35:42 -08:00
Paul Gauthier
06fa0c17a4 docs: Add usage documentation for non-code interactions 2025-01-20 17:35:40 -08:00
Paul Gauthier
cfdca6a894 copy 2025-01-20 17:28:54 -08:00
Paul Gauthier
2873f6c193 copy 2025-01-20 14:25:36 -08:00
Paul Gauthier
8b963ed63c set version to 0.72.2.dev 2025-01-20 14:24:39 -08:00
Paul Gauthier
adb951426a version bump to 0.72.1 2025-01-20 14:23:06 -08:00
Paul Gauthier
9ced96a1c9 copy 2025-01-20 14:23:00 -08:00
Paul Gauthier
7e155dc87b copy 2025-01-20 14:21:05 -08:00
Paul Gauthier
c5e2d80fc0 blame 2025-01-20 14:20:56 -08:00
Paul Gauthier
b0fa646de9 fix litellm_provider 2025-01-20 14:19:30 -08:00
Paul Gauthier
83f08cffee copy 2025-01-20 11:51:32 -08:00
Paul Gauthier
03652a0030 set version to 0.72.1.dev 2025-01-20 11:51:13 -08:00
Paul Gauthier
1c3e0ba656 version bump to 0.72.0 2025-01-20 11:48:46 -08:00
Paul Gauthier
48f80b947b copy 2025-01-20 11:43:38 -08:00
Paul Gauthier
d7873de4e8 Merge branch 'main' of github.com:Aider-AI/aider 2025-01-20 11:42:04 -08:00
Paul Gauthier
32d025bcf2 r1 leaderboard 2025-01-20 11:37:09 -08:00
Paul Gauthier
61ab5d1652 disable sanity check 2025-01-20 11:35:54 -08:00
Paul Gauthier
f5fd6833e2 copy 2025-01-20 11:30:21 -08:00
Paul Gauthier
163e6f56df re-enable summaries 2025-01-20 11:26:19 -08:00
Paul Gauthier
5650697475 no turn errors, with upd_cur_msgs fix and summarizer disabled 2025-01-20 11:10:43 -08:00
Paul Gauthier
2968087d37 more deepseek config 2025-01-20 10:09:48 -08:00
Paul Gauthier
e7ec80f58a Merge branch 'main' into deepseek-reasoner 2025-01-20 09:50:35 -08:00
Paul Gauthier
f0ba699463 copy 2025-01-20 09:49:48 -08:00
Paul Gauthier
06d5b14b86 sanity_check_messages 2025-01-20 09:43:01 -08:00
Paul Gauthier
dff544cd5d refactor: Split summarize method and add model metadata handling 2025-01-20 09:38:45 -08:00
Paul Gauthier (aider)
73bc0f6258 style: Remove trailing whitespace in sendchat.py 2025-01-20 08:35:24 -08:00
Paul Gauthier (aider)
7e5e180000 feat: verify last non-system message is from user in sanity_check_messages 2025-01-20 08:35:21 -08:00
Paul Gauthier (aider)
fc431df2b4 style: Add blank lines for better readability in sendchat.py 2025-01-20 08:34:44 -08:00
Paul Gauthier (aider)
bb61be630a feat: add message role validation function 2025-01-20 08:34:40 -08:00
Paul Gauthier
cdc9ec2854 refactor: Add comment for sanity_check_messages function in sendchat.py 2025-01-20 08:34:38 -08:00
Paul Gauthier
21d3703b69 feat: Add deepseek-reasoner model settings and enable caching for deepseek-chat 2025-01-20 08:14:12 -08:00
paul-gauthier
c395be252e Merge pull request #2895 from pauldw/pwalker/2025-01-17_add_tags_scm_for_kotlin 2025-01-19 09:49:44 -08:00
Paul Walker
293c350fb7 Add tags.scm for Kotlin 2025-01-17 21:18:55 -05:00
Paul Gauthier
a777f336e1 chore: Update polyglot leaderboard test results and metadata 2025-01-17 13:37:02 -08:00
Paul Gauthier
5b6c186125 copy 2025-01-17 13:35:36 -08:00
Paul Gauthier
6451d59deb bump deps 2025-01-16 12:29:12 -08:00
Paul Gauthier (aider)
c912b66a8f ci: Update GitHub Actions workflow to use github.event_name for build conditions 2025-01-16 11:52:34 -08:00
Paul Gauthier (aider)
d62c43bc95 ci: Fix GitHub Actions workflow syntax for secret conditions 2025-01-16 11:51:10 -08:00
Paul Gauthier (aider)
3b7b9b6ed1 ci: Update Docker build workflow to use DockerHub secret conditions 2025-01-16 11:48:59 -08:00
Paul Gauthier (aider)
9822a6ed5d feat: Modify Docker workflow to separate PR and push build steps 2025-01-16 11:47:29 -08:00
Paul Gauthier
a06f4dfad6 copy 2025-01-16 10:30:14 -08:00
Paul Gauthier
b92df87400 publish 2025-01-16 09:03:09 -08:00
Paul Gauthier
d7921c0111 chore: Update GitHub Actions workflow with artifact path and deploy pages version 2025-01-16 09:01:01 -08:00
Paul Gauthier (aider)
af09c3e62a chore: Update artifact upload path in GitHub Pages workflow 2025-01-16 08:57:51 -08:00
Paul Gauthier (aider)
0ed42f657d feat: Add build output listing step to debug artifact upload 2025-01-16 08:54:57 -08:00
Paul Gauthier (aider)
ed7fbabd1c ci: Update pull_request workflow triggers with consistent path ignores 2025-01-16 08:51:24 -08:00
Paul Gauthier (aider)
bd03563fcb ci: Ignore workflow file changes except for self-modification 2025-01-16 08:50:53 -08:00
Paul Gauthier (aider)
05ffc7f8d6 feat: Add trigger for pages.yml workflow file changes 2025-01-16 08:38:38 -08:00
Paul Gauthier (aider)
ebc475d278 feat: Update GitHub Pages artifact upload path 2025-01-16 08:38:19 -08:00
Paul Gauthier
2813437515 chore: Update GitHub Actions upload-pages-artifact to v3 2025-01-16 08:35:13 -08:00
Paul Gauthier
ea2e885505 Revert "chore: Update upload-pages-artifact action to v4"
This reverts commit a7fadc3a45.
2025-01-16 08:32:46 -08:00
Paul Gauthier (aider)
a7fadc3a45 chore: Update upload-pages-artifact action to v4 2025-01-16 08:28:18 -08:00
Paul Gauthier
8040a20f71 add uv article 2025-01-16 08:25:02 -08:00
Paul Gauthier
0e87854819 copy 2025-01-16 08:24:47 -08:00
Paul Gauthier
3bc6c641de copy 2025-01-16 08:24:31 -08:00
Paul Gauthier
4abb6e17ba Merge branch 'main' of github.com:Aider-AI/aider 2025-01-16 08:24:21 -08:00
Paul Gauthier
1986f08cf9 ci: Conditionally push Docker images only on non-pull request events 2025-01-16 08:24:02 -08:00
paul-gauthier
620ae5cf1d Merge pull request #2877 from golergka/docs/file-editing-troubleshooting-architect-mode 2025-01-15 15:55:10 -08:00
Max Yankov (aider)
590ee5a248 docs: Add architect mode section to edit errors troubleshooting guide 2025-01-15 20:50:53 -03:00
Paul Gauthier
a08326ab60 enable all java tests 2025-01-15 15:18:46 -08:00
Paul Gauthier
63cf99361d ensure no loading of any other files 2025-01-15 13:57:54 -08:00
Paul Gauthier
1e54ca82b8 refactor: encapsulate rsync logic in function and add continuous sync loop 2025-01-13 15:47:49 -08:00
Paul Gauthier
2ec576e110 use examples_as_sys_msg=True for 4o models 2025-01-13 15:46:36 -08:00
Paul Gauthier
4251e976b3 copy 2025-01-13 14:28:34 -08:00
Paul Gauthier
d831e2f3a4 copy 2025-01-13 14:26:24 -08:00
Paul Gauthier
21f20417d6 copy 2025-01-13 11:39:22 -08:00
Paul Gauthier
e1c914d9bb chore: Update polyglot leaderboard with new test results for Codestral 25.01 2025-01-13 11:21:34 -08:00
Paul Gauthier
4b03b0a93a Merge branch 'main' of github.com:Aider-AI/aider 2025-01-13 11:18:31 -08:00
Paul Gauthier
bbcde55a9e copy 2025-01-13 10:18:34 -08:00
Paul Gauthier (aider)
0cba898280 fix: Make line endings validation test order-independent 2025-01-13 09:38:36 -08:00
Paul Gauthier (aider)
b9edec069a fix: Update test to match error message format for line endings validation 2025-01-13 09:38:13 -08:00
paul-gauthier
939cb7958a Merge pull request #2857 from titusz/improve-read-errors
refactor: Reorder exception handling in file reading method
2025-01-13 09:37:38 -08:00
Paul Gauthier (aider)
ebb38c6518 style: Format test_io.py to comply with linter rules 2025-01-13 09:36:31 -08:00
Paul Gauthier (aider)
fa80d2f3cc test: add line endings validation tests for InputOutput 2025-01-13 09:36:26 -08:00
Paul Gauthier (aider)
869f37cd89 style: Format code for better readability in io.py 2025-01-13 09:35:07 -08:00
Paul Gauthier (aider)
c22202585d fix: validate line_endings parameter in InputOutput initialization 2025-01-13 09:35:01 -08:00
Titusz Pan
f28c912d5a refactor: Reorder exception handling in file reading method 2025-01-13 18:29:04 +01:00
paul-gauthier
a0e56c5282 Merge pull request #2856 from titusz/configurable-line-endings
feat: Add line endings configuration option for file writing - fixes #1102
2025-01-13 09:26:57 -08:00
Paul Gauthier
de7da1e806 copy 2025-01-13 09:12:56 -08:00
Paul Gauthier
add2f6f669 copy 2025-01-13 09:00:21 -08:00
Paul Gauthier
b06e765e68 copy 2025-01-13 08:58:26 -08:00
Titusz Pan
c3952cb985 feat: Add line endings configuration option for file writing 2025-01-13 17:51:02 +01:00
xqyz
d5469a64d2 Handle new path creation
To handle cases where a path, a file, or both need to be created, you can enhance the `fname.touch()` code as follows:

```python
try:
    # Create parent directories if they don't exist
    fname.parent.mkdir(parents=True, exist_ok=True)
    # Create the file
    fname.touch()
    all_matched_files.add(str(fname))
    self.io.tool_output(f"Created file: {fname}")
except OSError as e:
    self.io.tool_error(f"Error creating file {fname}: {e}")
```

This code ensures that any necessary parent directories are created before attempting to create the file itself.
2025-01-12 07:29:45 +00:00
Paul Gauthier
ac26fc6d5f set version to 0.71.2.dev 2025-01-11 16:07:56 -08:00
Paul Gauthier
122088712d version bump to 0.71.1 2025-01-11 16:06:25 -08:00
Paul Gauthier
9fb09ce14d copy 2025-01-11 16:04:53 -08:00
Paul Gauthier (aider)
392fb21946 fix: ensure integer indices for list slicing in repomap.py 2025-01-11 15:49:58 -08:00
Paul Gauthier (aider)
e94b05851f style: Format test_io.py with consistent string quotes and spacing 2025-01-11 15:48:10 -08:00
Paul Gauthier (aider)
571a5962b7 test: update test to use invalid Unicode that triggers encoding error 2025-01-11 15:48:05 -08:00
Paul Gauthier (aider)
8b6863dc40 style: Format test_io.py with consistent quotes and spacing 2025-01-11 15:46:33 -08:00
Paul Gauthier (aider)
01af629399 test: add test for Unicode to ASCII fallback in tool messages 2025-01-11 15:46:28 -08:00
Paul Gauthier (aider)
4ece6d2a9b fix: handle Text objects properly in io.py for Windows Unicode encoding 2025-01-11 15:40:24 -08:00
Paul Gauthier
18d1d7af33 no chown for COPY 2025-01-11 07:46:23 -08:00
Paul Gauthier
5ada250a66 refactor: Add period to read-only file message in base_coder.py 2025-01-11 07:39:29 -08:00
Paul Gauthier (aider)
308c7ab670 feat: Add read-only file announcements to chat 2025-01-11 07:27:50 -08:00
Paul Gauthier
89d35e020a refactor: Add comment for read-only file message in base_coder.py 2025-01-11 07:27:49 -08:00
Paul Gauthier (aider)
6729570799 refactor: Simplify docker-build-test.yml to mirror release workflow with dev tags 2025-01-11 07:16:02 -08:00
Paul Gauthier (aider)
f72f5f6438 ci: Add dev tag publishing to Docker build test workflow 2025-01-11 07:12:56 -08:00
Paul Gauthier
a02e11e0bc Revert "ci: Add Docker image tests with --yes --exit args"
This reverts commit fdddfc6b1f.
2025-01-11 07:06:08 -08:00
Paul Gauthier
9ff15e1506 copy 2025-01-11 06:53:44 -08:00
Paul Gauthier (aider)
fdddfc6b1f ci: Add Docker image tests with --yes --exit args 2025-01-11 06:52:29 -08:00
Paul Gauthier (aider)
78ebb6295d fix: Restore site-packages permissions in Dockerfile for appuser access 2025-01-11 06:48:26 -08:00
Paul Gauthier
73c89e8c00 copy 2025-01-10 15:53:17 -08:00
Paul Gauthier (aider)
fcc499e401 refactor: normalize deepseek model names to deepseek-chat 2025-01-10 15:51:53 -08:00
Paul Gauthier
6e8efe22aa refactor: Combine deepseek/deepseek-coder into chat AI in model stats 2025-01-10 15:51:52 -08:00
Paul Gauthier
f9c5cb73a2 copy 2025-01-10 15:08:15 -08:00
Paul Gauthier
c939521f5f copy 2025-01-10 15:04:54 -08:00
Paul Gauthier
2640e05307 set version to 0.71.1.dev 2025-01-10 15:01:41 -08:00
Paul Gauthier
c1a371e3d3 version bump to 0.71.0 2025-01-10 15:00:02 -08:00
Paul Gauthier
5a4871155a copy 2025-01-10 14:54:42 -08:00
Paul Gauthier (aider)
d8e6dbf788 docs: clarify dual purpose of /ask, /code, and /architect commands 2025-01-10 14:51:25 -08:00
Paul Gauthier
7ea69ae4b4 refactor: Simplify map_tokens assignment logic in main.py 2025-01-10 14:49:16 -08:00
Paul Gauthier
d238ead451 copy 2025-01-10 14:44:00 -08:00
Paul Gauthier (aider)
e6b449f24d test: add tests for get_repo_map_tokens method 2025-01-10 14:39:50 -08:00
Paul Gauthier (aider)
41018d05a8 fix: remove unused max_tokens variable in get_repo_map_tokens 2025-01-10 14:38:22 -08:00
Paul Gauthier
d48008e13d refactor: Update repo map token handling and improve warning message 2025-01-10 14:38:12 -08:00
Paul Gauthier
a9cf438100 refactor: Update terminal detection message to include pretty output 2025-01-10 14:26:06 -08:00
Paul Gauthier (aider)
6c7a0d21d2 style: Remove trailing whitespace in io.py 2025-01-10 14:25:04 -08:00
Paul Gauthier (aider)
d887db4c18 fix: disable pretty output for dumb terminals 2025-01-10 14:24:59 -08:00
Paul Gauthier (aider)
e6be69ec6d test: add test case for TERM=dumb terminal handling 2025-01-10 14:24:27 -08:00
Paul Gauthier
c1ba7db8a1 refactor: Update placeholder text in cmd_run for better clarity 2025-01-10 14:23:42 -08:00
Paul Gauthier
dc5b5896a9 copy 2025-01-10 14:20:50 -08:00
Paul Gauthier
38678fafc1 refactor: Simplify fence pattern matching in base_coder.py 2025-01-10 14:20:02 -08:00
Paul Gauthier
7611211d1c copy 2025-01-10 14:19:51 -08:00
Paul Gauthier
0d9c2cd902 copy 2025-01-10 14:09:22 -08:00
Paul Gauthier (aider)
1a84c109fc feat: allow /ask, /code, /architect without args to switch modes 2025-01-10 14:07:24 -08:00
Paul Gauthier (aider)
cbedf3f8cc fix: Correct typo in variable name from model_metatdata_files to model_metadata_files 2025-01-10 14:04:54 -08:00
Paul Gauthier
50436e3106 docs: Update model usage statistics and dumb terminal message 2025-01-10 14:04:41 -08:00
Paul Gauthier (aider)
62498ec867 style: Reorder imports and fix whitespace in aider/io.py 2025-01-10 14:03:57 -08:00
Paul Gauthier (aider)
91b94bb16c feat: add dumb terminal detection and fallback handling 2025-01-10 14:03:53 -08:00
Paul Gauthier
c2bbdc503c copy 2025-01-10 13:33:00 -08:00
Paul Gauthier
babae0fa6e refactor: conditionally set stream based on main_model.streaming 2025-01-10 13:31:55 -08:00
Paul Gauthier
f047882ac1 refactor: Add InvalidGitRepositoryError to ANY_GIT_ERROR list 2025-01-09 15:01:36 -08:00
Paul Gauthier
b818d6a921 copy 2025-01-09 12:07:00 -08:00
Paul Gauthier
ba631c8451 copy 2025-01-09 12:03:17 -08:00
Paul Gauthier
2c963b389c include author in history updates 2025-01-09 12:03:05 -08:00
Paul Gauthier
8437fbc314 cleanup 2025-01-09 12:02:48 -08:00
Paul Gauthier (aider)
76404004a4 feat: include author info in git log output for history updates 2025-01-09 11:57:23 -08:00
Paul Gauthier
1b64514c2c copy 2025-01-09 11:44:40 -08:00
Paul Gauthier
6efea7d365 Merge branch 'main' of github.com:Aider-AI/aider 2025-01-09 11:44:19 -08:00
Paul Gauthier (aider)
e1a3b77d67 feat: add rootless container support with dedicated appuser 2025-01-09 11:26:06 -08:00
Paul Gauthier
cfc7ad5627 copy 2025-01-09 09:56:49 -08:00
paul-gauthier
b3cbf14ad6 Merge pull request #2809 from hydai/fix_missing_link 2025-01-09 06:39:40 -08:00
hydai
51cfbe6b00 docs: fix missing link
Signed-off-by: hydai <z54981220@gmail.com>
2025-01-09 18:46:14 +08:00
paul-gauthier
155f397d0b Merge pull request #2798 from schpet/improve-watch-description 2025-01-07 15:02:52 -08:00
Peter Schilling
4b53b8b6a1 2025-01-07 14:00:49 -08:00
Peter Schilling (aider)
dbea4a1787 aider: feat: Update watch.md description for IDE usage 2025-01-07 13:57:39 -08:00
Peter Schilling
5b6da85e68 docs: Update watch.md documentation description and comments 2025-01-07 13:57:38 -08:00
Paul Gauthier
61671e9d3f cleanup 2025-01-07 10:49:21 -08:00
Paul Gauthier
f94e05e04e Merge branch 'main' of github.com:Aider-AI/aider 2025-01-07 10:04:17 -08:00
Paul Gauthier
b5cad9a8cc copy 2025-01-07 09:58:20 -08:00
paul-gauthier
3a97d8cc82 Merge pull request #2795 from nims11/fix-discard
Fix files not being excluded in benchmark.py
2025-01-07 09:57:35 -08:00
Paul Gauthier
3c099465da refactor: Add AssertionError to ANY_GIT_ERROR tuple 2025-01-07 09:50:28 -08:00
Paul Gauthier (aider)
fcdb2591b6 fix: check prompt session is active before interrupting input 2025-01-07 09:46:48 -08:00
Paul Gauthier
b67a16e9af fix: Add AttributeError to ANY_GIT_ERROR tuple 2025-01-07 09:45:53 -08:00
Paul Gauthier (aider)
1d672616be fix: correct file export path in voice format conversion 2025-01-07 09:43:49 -08:00
Nimesh Ghelani
ed9d70903d Fix files not being excluded in benchmark.py
`.discard()` removes an item from the set. `.difference_update()` is the
correct call here.
2025-01-07 17:35:29 +00:00
Paul Gauthier
8a9bab8a46 copy 2025-01-07 09:33:00 -08:00
Paul Gauthier
fdc6a08eb4 copy 2025-01-07 09:28:34 -08:00
Paul Gauthier
154309912d delay renedering md when it gets slow 2025-01-07 06:57:38 -08:00
Paul Gauthier
a84fea86b8 copy 2025-01-07 06:57:20 -08:00
Paul Gauthier (aider)
609998bc18 style: Format floating-point division in mdstream.py 2025-01-07 06:51:59 -08:00
Paul Gauthier (aider)
891868b061 perf: adjust min_delay based on markdown render time for smoother updates 2025-01-07 06:51:56 -08:00
Paul Gauthier
3fc5cf8b9f refactor: Replace hardcoded min_delay with 1./20 for 20fps in MarkdownStream 2025-01-07 06:51:54 -08:00
Paul Gauthier (aider)
6048ed5bc1 style: Remove trailing whitespace from Lorem Ipsum text lines 2025-01-07 06:44:35 -08:00
Paul Gauthier (aider)
a1a007134c style: Break long Lorem Ipsum text into multiple lines to comply with line length limit 2025-01-07 06:44:10 -08:00
Paul Gauthier
d82f9fa432 refactor: Multiply _text by 10 in mdstream.py for testing 2025-01-07 06:44:09 -08:00
Paul Gauthier (aider)
c0074301a3 style: Remove extra blank line in mdstream.py 2025-01-07 06:42:52 -08:00
Paul Gauthier (aider)
9c2c05ad44 refactor: read io.py source file in mdstream.py main block 2025-01-07 06:42:48 -08:00
Paul Gauthier
fad230c02e refactor: Split markdown text into prefix and suffix variables 2025-01-07 06:42:46 -08:00
Paul Gauthier (aider)
ad3c95f273 style: Fix whitespace and formatting in mdstream.py 2025-01-07 06:11:58 -08:00
Paul Gauthier (aider)
684fdb6095 refactor: extract markdown rendering logic into helper method 2025-01-07 06:11:54 -08:00
Paul Gauthier
8e64f171b8 refactor: improve markdown streaming with stable/unstable line handling 2025-01-07 06:11:52 -08:00
Paul Gauthier (aider)
d616c3fed7 style: Remove trailing whitespace in MarkdownStream class docstring 2025-01-07 05:58:45 -08:00
Paul Gauthier (aider)
e07e6cd2a3 docs: Format docstring to comply with line length limits 2025-01-07 05:58:41 -08:00
Paul Gauthier (aider)
f1bd5cdb52 style: Fix whitespace and formatting in MarkdownStream class 2025-01-07 05:57:39 -08:00
Paul Gauthier (aider)
be82b6bed9 docs: add comments to explain MarkdownStream class and methods 2025-01-07 05:57:35 -08:00
Paul Gauthier
37ad4758a1 refactor: Move fname_path assignment inside try block in GitRepo.ignored_file_raw 2025-01-04 12:36:07 -08:00
Paul Gauthier (aider)
e4a238a05c style: Format code with consistent string quotes and remove trailing whitespace 2025-01-04 12:27:11 -08:00
Paul Gauthier (aider)
e5ca922ce8 fix: handle empty paths and dotfiles in get_ident_filename_matches 2025-01-04 12:27:04 -08:00
Paul Gauthier
6a1f4431d0 docs: Update HISTORY.md and FAQ.md with latest changes and model usage stats 2025-01-04 12:22:45 -08:00
Paul Gauthier (aider)
d67eda24d2 style: Remove trailing whitespace and format confirm_ask prompt 2025-01-04 12:09:53 -08:00
Paul Gauthier (aider)
bba0cc8dc5 feat: show token count in command output confirmation prompt 2025-01-04 12:09:48 -08:00
Paul Gauthier
884b52b710 refactor: Add comment for tokenizing command output in Commands class 2025-01-04 12:09:45 -08:00
Paul Gauthier
01ef2351b3 refactor: Use temporary variable for audio format to avoid state mutation 2025-01-04 12:08:05 -08:00
Paul Gauthier
de1d566e9e refactor: Simplify audio file handling and conversion logic 2025-01-04 12:06:07 -08:00
Paul Gauthier (aider)
19114a61ae style: Format print statement in voice.py for better readability 2025-01-04 12:04:13 -08:00
Paul Gauthier (aider)
36e5599ead feat: Add file size logging after audio conversion 2025-01-04 12:04:09 -08:00
Paul Gauthier (aider)
f5a82e575c style: Format print statement in voice.py for better readability 2025-01-04 12:03:32 -08:00
Paul Gauthier (aider)
1851de323d feat: add error handling and feedback for audio conversion 2025-01-04 12:03:25 -08:00
Paul Gauthier
f9408640a3 refactor: Simplify audio file size check and format conversion logic 2025-01-04 12:03:24 -08:00
Paul Gauthier (aider)
73837730fa feat: Add file size check and mp3 conversion for large audio files 2025-01-04 11:59:42 -08:00
Paul Gauthier
9b46991721 refactor: Add comment for handling large file uploads in voice.py 2025-01-04 11:59:40 -08:00
Paul Gauthier
606cd0368f refactor: remove redundant exception handling in GitRepo 2025-01-04 11:09:55 -08:00
Paul Gauthier
d9ef23ad99 Merge branch 'main' of github.com:Aider-AI/aider 2025-01-04 11:09:25 -08:00
Paul Gauthier
48b8f54c12 refactor: Move message and style initialization before try block in InputOutput 2025-01-04 11:04:32 -08:00
Paul Gauthier (aider)
cec9f90c1c style: Standardize string quotes in InputOutput class 2025-01-04 11:03:43 -08:00
Paul Gauthier (aider)
44d36f140a fix: handle UnicodeEncodeError in console output with ASCII fallback 2025-01-04 11:03:38 -08:00
paul-gauthier
f88adcfa85 Merge pull request #2764 from caseymcc/repo_index
Ignore directories in repo that have index errors
2025-01-04 13:59:32 -05:00
Paul Gauthier (aider)
c5919f0c15 refactor: improve cleanup error handling and verbose logging 2025-01-04 10:55:11 -08:00
Paul Gauthier
ac160cac12 chore: Ignore exceptions during Rust target directory cleanup 2025-01-04 10:55:09 -08:00
Paul Gauthier
867aaa5864 copy 2025-01-04 06:36:22 -08:00
Paul Gauthier
0b26505a20 Merge branch 'main' of github.com:Aider-AI/aider 2025-01-04 06:33:49 -08:00
paul-gauthier
98ad513621 Merge pull request #2753 from aweis89/fix-linting-cmd
fix: lint command with nested spaced strings
2025-01-04 09:33:38 -05:00
Paul Gauthier
591edbb003 improve prompts so that switching between ask/code works better with deepseek 2025-01-04 06:28:20 -08:00
Paul Gauthier
a17b1c2ab7 Merge branch 'main' of github.com:Aider-AI/aider 2025-01-04 06:27:42 -08:00
Paul Gauthier
648f14d95b copy 2025-01-04 06:25:19 -08:00
Paul Gauthier (aider)
2e4c2422b1 feat: Add voice format and input device initialization in Commands 2025-01-04 06:21:19 -08:00
Paul Gauthier
463fdb1ed9 refactor: Increase max chat history tokens limit from 4k to 8k 2025-01-04 06:19:38 -08:00
Paul Gauthier (aider)
d6b612a4a3 style: Break long comment line to comply with flake8 E501 2025-01-04 06:18:40 -08:00
Paul Gauthier (aider)
d24376608e refactor: generalize token calculation using division in Model class 2025-01-04 06:18:15 -08:00
Paul Gauthier
ff41f9bd9a refactor: adjust max_chat_history_tokens calculation based on max_input_tokens 2025-01-04 06:18:12 -08:00
paul-gauthier
6d3dd5c484 Merge pull request #2767 from apaz-cli/ap/suppress_streamlit
Disable streamlit email prompt
2025-01-03 16:02:02 -05:00
apaz-cli
f0bc8983b8 Disable streamlit email prompt 2025-01-03 14:43:18 -06:00
Paul Gauthier (aider)
729354b038 chore: Add cleanup for node_modules directories in benchmark tests 2025-01-03 14:19:06 -05:00
Paul Gauthier (aider)
c0be857f37 chore: Add Java build directory cleanup to test runner 2025-01-03 14:16:51 -05:00
Paul Gauthier
98b0e88ace refactor: simplify Rust target directory cleanup logic 2025-01-03 14:16:49 -05:00
Paul Gauthier (aider)
3d501df21f chore: Clean up Rust target/debug directory after all test attempts 2025-01-03 14:14:44 -05:00
Paul Gauthier
1b4abb747d style: Add blank line for readability in benchmark.py 2025-01-03 14:14:42 -05:00
Paul Gauthier
b1d418f7fb copy 2025-01-03 12:26:55 -04:00
Paul Gauthier
a702b4752b copy 2025-01-03 12:25:03 -04:00
Paul Gauthier
684ba7c0cb Merge branch 'main' of github.com:Aider-AI/aider 2025-01-03 12:16:43 -04:00
Krazer
1bcc27d2be little clean up 2025-01-03 09:07:27 -06:00
Krazer
50d3b305d4 make it a warning 2025-01-03 09:01:34 -06:00
Krazer
a341c98ec6 handle repo index errors 2025-01-03 08:58:42 -06:00
paul-gauthier
fa5c8a00e4 Merge pull request #2706 from Hambaobao/polyglot-qwen2.5-coder-32b-instruct-whole-results
Polyglot Qwen2.5-Coder-32B-Instruct Results [Whole]
2025-01-03 09:35:20 -04:00
paul-gauthier
42f6c20ada Merge branch 'main' into polyglot-qwen2.5-coder-32b-instruct-whole-results 2025-01-03 09:35:14 -04:00
paul-gauthier
787738094d Update README.md 2025-01-02 21:50:30 -04:00
Paul Gauthier
a44ebfe99f copy 2025-01-02 17:26:14 -04:00
Paul Gauthier
c5959664e4 Merge branch 'main' of github.com:Aider-AI/aider 2025-01-02 17:23:42 -04:00
Paul Gauthier
9b581268de copy 2025-01-02 17:23:10 -04:00
Aaron Weisberg
acf654c984 fix: lint command with nested spaced strings 2025-01-02 17:27:33 +01:00
paul-gauthier
94f83eb9e3 Merge pull request #2750 from bkowalik/patch-1
Document boto3 install process with aider installed by uv or one-liner
2025-01-02 09:44:22 -04:00
Bartek Kowalik
07c675ed06 Document boto3 install process with uv 2025-01-02 08:39:20 +01:00
Paul Gauthier
f292e01980 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-30 14:37:27 -04:00
Paul Gauthier (aider)
61f9123147 style: Run linter 2024-12-30 14:21:39 -04:00
Paul Gauthier (aider)
60708a7fd7 fix: Remove unused imports in commands.py 2024-12-30 14:21:35 -04:00
Paul Gauthier
761fb93aba refactor: Move test_cmd_load_with_switch_coder to test file 2024-12-30 14:21:28 -04:00
Paul Gauthier (aider)
20bc718bdc style: Format voice init for readability 2024-12-30 14:19:21 -04:00
Paul Gauthier (aider)
07337d2f41 feat: Handle voice-format command line argument 2024-12-30 14:19:14 -04:00
Paul Gauthier (aider)
3d2de00f49 style: Apply linter fixes 2024-12-30 14:17:25 -04:00
Paul Gauthier (aider)
a7242ca846 refactor: Pass voice settings to Commands as params 2024-12-30 14:17:16 -04:00
paul-gauthier
d3298ac5f2 Merge pull request #2725 from joshvera/fix-benchmark-java-ca-pkg
Install ca-certificates before openjdk-21 to resolve cacerts error
2024-12-29 15:07:51 -04:00
Josh Vera
e486243c06 Install ca-certificates before openjdk-21 to resolve cacerts error 2024-12-29 10:55:09 -08:00
Paul Gauthier (aider)
8eaefb57d3 feat: Add RevCumulative column to problem stats 2024-12-28 11:45:41 -04:00
Paul Gauthier
c21f7afdcb Merge branch 'main' of github.com:Aider-AI/aider 2024-12-28 10:24:22 -04:00
Paul Gauthier
d734dee589 copy 2024-12-28 10:24:17 -04:00
Paul Gauthier (aider)
f035c4c01a fix: Remove max_apply_update_errors from threaded call 2024-12-27 16:36:58 -04:00
Paul Gauthier (aider)
8fcdcecf36 refactor: Remove deprecated max_apply_update_errors 2024-12-27 16:36:47 -04:00
Paul Gauthier
3f9ee1ac2e refactor: Remove deprecated max_apply_update_errors 2024-12-27 16:36:46 -04:00
Paul Gauthier
188e1f788d chore: Rename exercism dir to polyglot-benchmark 2024-12-27 16:33:04 -04:00
paul-gauthier
98a0f1cf5b Merge pull request #2698 from paulmaunders/fix-macos-go-tests
Fix Go installation and benchmark tests for Apple Silicon
2024-12-27 12:31:36 -05:00
Paul Gauthier
1467a673b9 style: Remove mobile height override for blame chart 2024-12-26 20:11:14 -04:00
Paul Gauthier
889eb86d89 fix: Correct chart legend position and reverse order 2024-12-26 20:09:09 -04:00
Paul Gauthier (aider)
125da0e2db feat: Move chart legend to top-left 2024-12-26 20:04:37 -04:00
Paul Gauthier
14b274c707 style: Reduce blame chart height on website 2024-12-26 20:04:37 -04:00
Paul Gauthier (aider)
dedbc20ac6 feat: Make charts responsive and taller on mobile 2024-12-26 20:02:11 -04:00
Paul Gauthier (aider)
36cf2348d0 style: Change human bar color to light grey 2024-12-26 19:57:59 -04:00
Paul Gauthier
a19f8996b8 fix: Improve blame chart labels and stacking 2024-12-26 19:57:57 -04:00
Paul Gauthier (aider)
7293263773 fix: Stack x-axis for full width bars 2024-12-26 19:55:33 -04:00
Paul Gauthier (aider)
ed5b07374d fix: Use minus filter for subtraction in liquid template 2024-12-26 19:54:09 -04:00
Paul Gauthier (aider)
07b96bef95 feat: Create stacked bar chart for lines of code by author 2024-12-26 19:50:21 -04:00
Paul Gauthier
5c3cca157d switch to deepseek-chat instead of deepseek-coder 2024-12-26 19:40:06 -04:00
Paul Gauthier
f1f66a9b9d copy 2024-12-26 19:28:14 -04:00
Paul Gauthier
f4007210c1 set version to 0.70.1.dev 2024-12-26 19:19:51 -04:00
Paul Gauthier
77962dbd4c version bump to 0.70.0 2024-12-26 19:18:21 -04:00
Paul Gauthier
419cbae55f copy 2024-12-26 10:55:14 -05:00
Paul Gauthier
5233789c40 docs: Improve watch_code_prompt instructions 2024-12-26 10:54:25 -05:00
Paul Gauthier (aider)
70731719f7 style: Fix formatting in io.py 2024-12-26 10:52:21 -05:00
Paul Gauthier (aider)
cf4aa68f98 refactor: Use shorter abs/rel paths for readonly files 2024-12-26 10:52:16 -05:00
Paul Gauthier
6bfd89074c fix: Display shorter path for readonly files 2024-12-26 10:48:04 -05:00
Paul Gauthier
acc4893a7f fix: Update deepseek-chat max tokens 2024-12-26 10:45:14 -05:00
Paul Gauthier
ab61ae2b36 copy 2024-12-26 10:18:19 -05:00
Paul Gauthier
514b9c1c7d copy 2024-12-26 10:13:56 -05:00
Paul Gauthier
44f2cf2b24 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-26 10:12:36 -05:00
paul-gauthier
9befec5cd1 Merge pull request #2692 from mdklab/fix-issue-1802-unicode-error
Fix issue #1802: Handle UnicodeDecodeError in repo file paths
2024-12-26 10:12:33 -05:00
Paul Gauthier
7efdfe5639 added OR o1 and fix OR deepseek-chat 2024-12-26 10:11:40 -05:00
Paul Gauthier (aider)
be6811b29a fix: Correct import path for Coder in commands.py 2024-12-26 09:59:05 -05:00
Paul Gauthier (aider)
f160b8df04 fix: Move Coder import to avoid circular dependency 2024-12-26 09:58:45 -05:00
Paul Gauthier (aider)
158471b218 style: Reorder imports in aider/commands.py 2024-12-26 09:58:15 -05:00
Paul Gauthier (aider)
a383cece53 fix: Import missing modules for test 2024-12-26 09:58:11 -05:00
Paul Gauthier (aider)
0901e6ab77 fix: Correctly format long error message string 2024-12-26 09:57:56 -05:00
Paul Gauthier (aider)
e1485971d8 test: Add test for cmd_load with SwitchCoder 2024-12-26 09:57:51 -05:00
Paul Gauthier (aider)
91c9b1bfe7 fix: Handle SwitchCoder exception in cmd_load 2024-12-26 09:57:09 -05:00
Paul Gauthier
befe6be86c fix: Catch switchcoder exception in run_commands 2024-12-26 09:57:07 -05:00
Paul Gauthier
79428cf4ed copy 2024-12-26 09:49:02 -05:00
Paul Gauthier
7bde5fe893 copy 2024-12-26 09:48:18 -05:00
Paul Gauthier
2f7e024387 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-26 09:47:16 -05:00
paul-gauthier
9235cfa739 Merge pull request #2695 from gengjiawen/patch-1
add yi-lightning result
2024-12-26 07:05:41 -05:00
paul-gauthier
f1e623ec5a Merge branch 'main' into patch-1 2024-12-26 07:05:33 -05:00
柏枫
7c86dc9ac6 add polyglot-qwen2.5-coder-32b-instruct-whole-results 2024-12-26 15:01:45 +08:00
Paul Gauthier
ec2da0a399 add deepseek v3 2024-12-25 09:01:43 -05:00
Paul Gauthier
dd9b2a872c copy 2024-12-25 08:11:04 -05:00
Paul Gauthier
9767759033 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-25 08:05:55 -05:00
Paul Gauthier
7537d79311 fix: Remove .bash_history from rsync 2024-12-25 08:05:46 -05:00
Paul Maunders
b68f34eb9e feat: Fix Go installation for Apple Silicon and add tmp.benchmarks to gitignore 2024-12-24 17:30:41 +00:00
Paul Gauthier (aider)
0a23c4abd6 feat: Configure bash history to save commands immediately 2024-12-24 08:03:01 -05:00
paul-gauthier
b51768b08e Update 2024-12-21-polyglot.md 2024-12-23 18:01:03 -08:00
Jiawen Geng
4561f0c79e add yi-lightning result 2024-12-23 16:39:25 -08:00
mdk
5c92491bc0 Fix issue #1802: Handle UnicodeDecodeError in repo file paths
Added error handling for UnicodeDecodeError when decoding paths in the Git repository.
This issue arises when paths are encoded in formats other than the expected system encoding.

The error handler now provides a detailed error message, helping users identify potential encoding mismatches.

Closes #1802
2024-12-23 20:01:08 +01:00
paul-gauthier
083605e2d7 Merge pull request #2690 from apaz-cli/ap/rephrase_dirwarning 2024-12-23 08:27:59 -08:00
apaz-cli
d28e2f0f56 Rephrase home dir warning 2024-12-23 08:50:25 -06:00
Paul Gauthier
87a964355b copy 2024-12-23 08:00:25 -05:00
Paul Gauthier
fbc3f0cef5 copy 2024-12-22 21:23:39 -05:00
Paul Gauthier
2b1625e3a8 copy 2024-12-22 18:07:25 -05:00
Paul Gauthier (aider)
6230df749e fix: Create table rows if they don't exist 2024-12-22 18:04:01 -05:00
Paul Gauthier
e62003c0ce copy 2024-12-22 17:52:57 -05:00
Paul Gauthier
d0f092f7ae copy 2024-12-22 17:51:38 -05:00
Paul Gauthier
9e2e07e8a7 copy 2024-12-22 16:58:29 -05:00
Paul Gauthier
4154d47c07 copy 2024-12-22 16:56:38 -05:00
Paul Gauthier
62e0cba7bd copy 2024-12-22 16:52:51 -05:00
Paul Gauthier
39d5c785d5 copy 2024-12-22 16:51:44 -05:00
Paul Gauthier
e5cb81c11f copy 2024-12-22 16:47:58 -05:00
Paul Gauthier
3abb8d38ec copy 2024-12-22 16:46:41 -05:00
Paul Gauthier
7f0860d5d0 copy 2024-12-22 16:41:20 -05:00
Paul Gauthier
8c74c8ab6f add o1-mini 2024-12-22 16:39:18 -05:00
Paul Gauthier
37df899ada copy 2024-12-22 16:17:16 -05:00
Paul Gauthier
f55181e447 copy 2024-12-22 16:14:33 -05:00
Paul Gauthier
b1bc2f8c5c test: Remove user_id check from need_to_ask test 2024-12-22 09:52:45 -05:00
Paul Gauthier (aider)
350df7ca55 fix: Test check_gitignore with and without .env file 2024-12-22 09:51:20 -05:00
Paul Gauthier
8768a8aca6 copy 2024-12-22 09:15:59 -05:00
Paul Gauthier (aider)
0f8bb016f4 fix: Correct misspelled HIGHLIGHT_MODEL in leaderboard.js 2024-12-22 09:07:10 -05:00
Paul Gauthier (aider)
eb30791ff4 feat: Make highlight model configurable via assign 2024-12-22 09:06:05 -05:00
Paul Gauthier
7b37bf0f48 copy 2024-12-22 09:02:01 -05:00
Paul Gauthier
fff67a5917 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-22 09:00:52 -05:00
paul-gauthier
3dbe91577c Merge pull request #2675 from apaz-cli/ap/dotenv_dne
Don't add .env to gitignore when it doesn't exist.
2024-12-22 06:00:47 -08:00
Paul Gauthier
0e05b64ebc copy 2024-12-22 08:59:38 -05:00
Paul Gauthier
c895e99306 copy 2024-12-22 08:43:59 -05:00
Paul Gauthier
6d7e8beaaa other o1 variants 2024-12-21 14:14:21 -08:00
Paul Gauthier
8b62d8a6c5 copy 2024-12-21 14:11:54 -08:00
Paul Gauthier
ec44850646 copy 2024-12-21 14:11:21 -08:00
Paul Gauthier
2ea5a98ee0 rename 2024-12-21 11:53:43 -08:00
Paul Gauthier
80928b90a5 cleanup 2024-12-21 11:52:18 -08:00
Paul Gauthier
b28174aba1 delete refac js 2024-12-21 11:51:23 -08:00
Paul Gauthier (aider)
da170bab3a fix: Use configured pass_rate for graph data in search 2024-12-21 11:49:36 -08:00
Paul Gauthier (aider)
49a2f998dd refactor: Unify leaderboard scripts and use config variables 2024-12-21 11:47:29 -08:00
Paul Gauthier
4efdc8b4f7 refactor: Rename benchmark dir, improve rsync, fix problem stats 2024-12-21 11:09:52 -08:00
Paul Gauthier (aider)
a75507980a fix: Pass stats_languages to summarize_results and show_stats 2024-12-20 16:04:00 -08:00
Paul Gauthier (aider)
8d0decc17a style: Apply linter formatting 2024-12-20 16:03:44 -08:00
Paul Gauthier (aider)
e334cbb5d4 fix: Correct indentation in load_results function 2024-12-20 16:03:40 -08:00
Paul Gauthier (aider)
e3ac8ab19d feat: Add --stats-languages option to filter results 2024-12-20 16:03:19 -08:00
Paul Gauthier
bddf6e9017 fix: Handle missing attributes in show_stats and empty models 2024-12-20 16:03:19 -08:00
apaz-cli
bcdc0217b3 Don't add .env to gitignore when it doesn't exist. 2024-12-20 10:09:07 -06:00
Paul Gauthier
521841b447 fix: Skip redoing tests if results exist 2024-12-19 16:25:54 -08:00
Paul Gauthier (aider)
c53cd336f9 style: Fix linting issues 2024-12-19 15:59:03 -08:00
Paul Gauthier (aider)
a8226989c8 feat: Remove @Disabled annotations from Java test files 2024-12-19 15:58:59 -08:00
Paul Gauthier
114b156d74 fix: Use relative paths for ignored files, remove redundant try 2024-12-19 15:56:16 -08:00
Paul Gauthier (aider)
def2d4bac9 style: Fix string formatting in problem stats 2024-12-19 15:50:14 -08:00
Paul Gauthier (aider)
250e2ab6aa feat: Print never solved exercises with full path 2024-12-19 15:50:11 -08:00
Paul Gauthier
6185ddf76a feat: Print never solved exercises and remove dumps 2024-12-19 15:50:10 -08:00
Paul Gauthier (aider)
dddf192e5a fix: Check for testcase key in results 2024-12-19 15:49:16 -08:00
Paul Gauthier (aider)
2d32f77ed0 feat: Print list of exercises never solved by any model 2024-12-19 15:49:13 -08:00
Paul Gauthier
7eb7533d42 fix: Handle missing testcase in results and bad json 2024-12-19 15:49:12 -08:00
Paul Gauthier (aider)
bb711fe255 style: Run linter 2024-12-19 14:39:23 -08:00
Paul Gauthier (aider)
14a8759b82 feat: Disqualify exercises with >=4 parse errors 2024-12-19 14:39:18 -08:00
Paul Gauthier
5a0d4eff71 fix: Correctly handle zero hard set problems 2024-12-19 14:39:17 -08:00
Paul Gauthier (aider)
805d6bbc8c chore: Create remote ~/aider dir before rsync 2024-12-19 12:03:37 -08:00
Paul Gauthier
a0004ab892 chore: Make rsync.sh executable and add remote dir creation 2024-12-19 12:03:36 -08:00
Paul Gauthier (aider)
46a444dc21 fix: Improve docker group addition and instructions 2024-12-19 11:56:03 -08:00
Paul Gauthier (aider)
aefb5c37fe feat: Add newgrp to apply docker group changes in session 2024-12-19 11:53:44 -08:00
Paul Gauthier (aider)
2216978726 feat: Start and enable docker service after install 2024-12-19 11:52:23 -08:00
Paul Gauthier
3a2d8edb53 chore: Make install-docker-ubuntu.sh executable 2024-12-19 11:52:22 -08:00
Paul Gauthier (aider)
e0d57b7713 feat: Add script to install docker on ubuntu 2024-12-19 11:51:06 -08:00
Paul Gauthier
3a9912c01e feat: Add install docker script for ubuntu 2024-12-19 11:51:05 -08:00
Paul Gauthier (aider)
6cadee31bf feat: Create script to clone exercism repos 2024-12-19 11:47:16 -08:00
Paul Gauthier
678845dfda feat: Add clone-exercism benchmark script 2024-12-19 11:47:15 -08:00
Paul Gauthier (aider)
7f7e218504 feat: Add rsync script to sync repo to remote host 2024-12-19 11:43:51 -08:00
Paul Gauthier
256a9951f5 feat: Add rsync benchmark script 2024-12-19 11:43:50 -08:00
Paul Gauthier (aider)
370b45bb35 feat: Ignore files in .meta and .docs directories 2024-12-19 07:23:28 -08:00
Paul Gauthier
616c4a9a53 chore: Add comment about ignoring meta and docs files 2024-12-19 07:23:27 -08:00
Paul Gauthier
821f7d6694 fix: Use extra_body for reasoning_effort, fix test counts 2024-12-19 07:10:20 -08:00
Paul Gauthier (aider)
bc89be6187 feat: Add OpenJDK 21 and TBB dev packages to Dockerfile 2024-12-19 07:01:01 -08:00
Paul Gauthier (aider)
86b6a4cefd fix: Only create build dir if it doesn't exist 2024-12-19 06:49:18 -08:00
Paul Gauthier
1f9a53a454 feat: Add cpp benchmark test script 2024-12-19 06:49:18 -08:00
Paul Gauthier (aider)
f22d112da2 feat: Add cmake to Dockerfile 2024-12-19 06:46:44 -08:00
Paul Gauthier
c36c06ab99 fix: Retry tests on parse or timeout, add gpt-4o params 2024-12-18 15:56:38 -08:00
Paul Gauthier
a915c60999 feat: Add pass_num to benchmark results, fix hard set percent 2024-12-18 13:36:37 -08:00
Paul Gauthier (aider)
6ddb8a7d88 feat: Add hard set problem counts by language 2024-12-18 13:18:31 -08:00
Paul Gauthier (aider)
50bb2cb1e6 feat: Add total column to unsolved problems table 2024-12-18 13:17:38 -08:00
Paul Gauthier (aider)
e1571dda9b style: Run linter 2024-12-18 13:16:45 -08:00
Paul Gauthier (aider)
7410c6216c feat: Count and display copied exercises per language 2024-12-18 13:16:41 -08:00
Paul Gauthier (aider)
8f84df44ab style: Run linter 2024-12-18 13:16:08 -08:00
Paul Gauthier (aider)
82f21b6734 fix: Copy hard set problems by language and exercise 2024-12-18 13:16:04 -08:00
Paul Gauthier (aider)
892fd5a6ef style: Run linter 2024-12-18 13:13:55 -08:00
Paul Gauthier (aider)
3069db0cfd feat: Add --copy-hard-set switch to copy hard set problems 2024-12-18 13:13:51 -08:00
Paul Gauthier (aider)
b71c9d539e feat: Calculate and display unsolved problem percentages by language 2024-12-18 13:11:20 -08:00
Paul Gauthier (aider)
78e643970d style: Fix linting issues 2024-12-18 13:09:46 -08:00
Paul Gauthier (aider)
34da3dd3d7 feat: Show percent of unsolved problems per language 2024-12-18 13:09:42 -08:00
Paul Gauthier (aider)
817cb0d363 fix: Remove unused List, Optional imports 2024-12-18 13:09:13 -08:00
Paul Gauthier (aider)
01088e214c style: Run linter on problem_stats.py 2024-12-18 13:08:51 -08:00
Paul Gauthier (aider)
3e4500f9fd feat: Print hard set problem counts by language 2024-12-18 13:08:48 -08:00
Paul Gauthier
d4b62608a9 chore: Move HARD_SET_NUM definition 2024-12-18 13:08:47 -08:00
Paul Gauthier (aider)
e6bfc1c2fc refactor: Use constant for hard set threshold 2024-12-18 13:06:03 -08:00
Paul Gauthier
051cabed69 style: Adjust model column width in problem stats 2024-12-18 13:06:02 -08:00
Paul Gauthier (aider)
04916a6e97 style: Run linter on problem_stats.py 2024-12-18 13:03:31 -08:00
Paul Gauthier (aider)
f3be2fa66b feat: Add hard set analysis to problem_stats.py 2024-12-18 13:03:27 -08:00
Paul Gauthier (aider)
c36087cc0c style: Apply linter formatting 2024-12-18 12:55:47 -08:00
Paul Gauthier (aider)
e35909ac7d refactor: Subsort exercises by name when solve rates are equal 2024-12-18 12:55:43 -08:00
Paul Gauthier
e5a693ab94 fix: Correctly format testcase/language in stats 2024-12-18 12:55:42 -08:00
Paul Gauthier (aider)
9e9cfb4600 fix: Calculate max name length after cleaning paths 2024-12-18 12:49:23 -08:00
Paul Gauthier (aider)
5dddaac006 style: Fix linting issues in problem_stats.py 2024-12-18 12:48:44 -08:00
Paul Gauthier (aider)
14af6f1fba fix: Remove duplicate language prefix in problem stats 2024-12-18 12:48:40 -08:00
Paul Gauthier (aider)
e88064fdc9 style: Run linter 2024-12-18 12:47:17 -08:00
Paul Gauthier (aider)
6badf5ea1d feat: Add cumulative sum column to distribution table 2024-12-18 12:47:14 -08:00
Paul Gauthier
20f5f3da24 chore: Remove unused import 2024-12-18 12:47:13 -08:00
Paul Gauthier (aider)
8c1b147705 style: Fix string formatting in problem stats 2024-12-18 12:46:02 -08:00
Paul Gauthier (aider)
366155b828 fix: Correct language lookup in problem_stats.py 2024-12-18 12:45:58 -08:00
Paul Gauthier (aider)
2c7d1897eb style: Fix linting issues in problem_stats.py 2024-12-18 12:43:08 -08:00
Paul Gauthier (aider)
26ccb23402 feat: Add table showing exercise solution distribution 2024-12-18 12:43:04 -08:00
Paul Gauthier
d9e2471fcd refactor: Remove unused dump calls in benchmark script 2024-12-18 12:43:03 -08:00
Paul Gauthier (aider)
8302b351dd style: Fix line length in problem_stats.py 2024-12-18 12:38:45 -08:00
Paul Gauthier (aider)
b8647c0481 feat: Show exercises solved by all and total breakdown 2024-12-18 12:38:41 -08:00
Paul Gauthier
a168403d68 fix: Correctly extract language and testcase from results 2024-12-18 12:38:40 -08:00
Paul Gauthier (aider)
42d8650058 fix: Remove "exercises/" prefix from testcase output 2024-12-18 12:33:41 -08:00
Paul Gauthier (aider)
7ad0d46c11 style: Format problem_stats.py with linter 2024-12-18 12:31:54 -08:00
Paul Gauthier (aider)
58812f7f1f refactor: Sort all exercises by solve rate, not by language 2024-12-18 12:31:50 -08:00
Paul Gauthier (aider)
65133b2aef fix: Handle missing testcase key in problem stats 2024-12-18 12:29:38 -08:00
Paul Gauthier (aider)
291d8cd335 style: Run linter 2024-12-18 12:29:20 -08:00
Paul Gauthier (aider)
7a27e2b94b fix: Handle missing testcase key in problem stats 2024-12-18 12:29:15 -08:00
Paul Gauthier
57a8eab1c3 chore: Add dump for debugging 2024-12-18 12:29:14 -08:00
Paul Gauthier (aider)
236a7f68e9 fix: Handle empty results in problem_stats.py 2024-12-18 12:26:51 -08:00
Paul Gauthier (aider)
81d424f475 fix: Remove unused max_lang_len variable 2024-12-18 12:25:47 -08:00
Paul Gauthier (aider)
687ba8c9a2 style: Apply linter fixes 2024-12-18 12:25:39 -08:00
Paul Gauthier (aider)
6d74a564e6 feat: Handle new exercise dir layout and add language info 2024-12-18 12:25:33 -08:00
Paul Gauthier (aider)
0a3e0665ab style: Apply linter formatting 2024-12-18 12:21:19 -08:00
Paul Gauthier (aider)
a19f1fbc67 feat: Allow specifying dirs on cmd line for problem_stats 2024-12-18 12:21:13 -08:00
Paul Gauthier
2aa4615c78 feat: Add openrouter/openai/o1 model and update prompts 2024-12-18 06:59:14 -08:00
Paul Gauthier (aider)
7dd1346878 fix: Remove stray ] causing syntax error 2024-12-17 20:34:33 -08:00
Paul Gauthier (aider)
31f8c7d9cb fix: Handle JSON decode errors when loading results 2024-12-17 20:34:21 -08:00
Paul Gauthier
914ce0b94d feat: Add total_tests to summary, handle JSON decode errors 2024-12-17 20:34:20 -08:00
Paul Gauthier (aider)
664f09111e feat: Pass original_dname to tests, copy test files 2024-12-17 20:11:58 -08:00
Paul Gauthier (aider)
6141f414fd chore: Remove comment from run_unit_tests 2024-12-17 20:11:29 -08:00
Paul Gauthier
8911f0f217 fix: Correctly find benchmark markdown files 2024-12-17 20:11:29 -08:00
Paul Gauthier (aider)
5af108ccee style: Format benchmark code with black 2024-12-17 20:01:45 -08:00
Paul Gauthier (aider)
94e4169445 fix: Update stats to handle nested exercise directories 2024-12-17 20:01:40 -08:00
Paul Gauthier
479b5b7064 fix: Use shell=True for npm test and fix path 2024-12-17 20:01:39 -08:00
Paul Gauthier (aider)
674e935cf5 fix: Create symlinks only if they don't exist 2024-12-17 19:07:09 -08:00
Paul Gauthier
6b4982d75b chore: Add npm test benchmark script 2024-12-17 19:07:08 -08:00
Paul Gauthier (aider)
4167743a34 feat: Install npm packages in /npm-install directory 2024-12-17 19:01:24 -08:00
Paul Gauthier
ba289f6db4 build: Install nodejs and npm packages in Dockerfile 2024-12-17 19:01:22 -08:00
Paul Gauthier (aider)
422fd11f4d feat: Install all npm dependencies in Dockerfile 2024-12-17 18:50:04 -08:00
Paul Gauthier (aider)
614d9c9b0d feat: Install jest in Dockerfile 2024-12-17 18:40:30 -08:00
Paul Gauthier
f91be86662 build: Use uv for faster pip installs in Dockerfile 2024-12-17 18:40:28 -08:00
Paul Gauthier (aider)
72f05544e8 feat: Install Node.js in Dockerfile 2024-12-17 18:26:16 -08:00
Paul Gauthier (aider)
81f55820be refactor: Use ADD to fetch rustup installer in Dockerfile 2024-12-17 18:24:38 -08:00
Paul Gauthier (aider)
b9c14e1d65 feat: Add Go installation to Dockerfile 2024-12-17 18:22:41 -08:00
Paul Gauthier (aider)
5c55453a0e fix: Correctly calculate and display never solved exercises 2024-12-17 18:14:48 -08:00
Paul Gauthier
12491c4983 wip 2024-12-17 17:47:17 -08:00
Paul Gauthier (aider)
77d379c021 refactor: Use full path for test names in benchmark 2024-12-17 17:43:52 -08:00
Paul Gauthier (aider)
1a12a59e91 chore: Remove comment about test_dnames 2024-12-17 17:41:29 -08:00
Paul Gauthier
0b970dd9c7 fix: Ensure test_dnames include full path 2024-12-17 17:41:27 -08:00
Paul Gauthier (aider)
93ac2bd53e feat: Copy only practice subdirs with exercises 2024-12-17 17:36:03 -08:00
Paul Gauthier (aider)
f9646ac47a chore: Remove comment about practice subdirs 2024-12-17 17:35:17 -08:00
Paul Gauthier
e8ed3b9e23 chore: Add comment about copying practice subdirs 2024-12-17 17:35:16 -08:00
Paul Gauthier (aider)
6238a07c8f style: Run linter on benchmark.py 2024-12-17 17:33:28 -08:00
Paul Gauthier (aider)
1fb33f0c47 feat: Add language filter and multi-lang support 2024-12-17 17:33:23 -08:00
Paul Gauthier (aider)
a842f41627 style: Fix linting issues in benchmark.py 2024-12-17 16:49:50 -08:00
Paul Gauthier (aider)
c4c135e678 refactor: Use dict for test commands based on file extensions 2024-12-17 16:49:46 -08:00
Paul Gauthier (aider)
f36f2fdea2 style: Fix typo in test file extension check 2024-12-17 16:48:37 -08:00
Paul Gauthier (aider)
e3f0a67584 feat: Choose test command based on file extensions 2024-12-17 16:48:32 -08:00
Paul Gauthier
f6f05fa0c6 fix: Use cargo test for rust tests 2024-12-17 16:48:31 -08:00
Paul Gauthier (aider)
54ca7ceac8 feat: Use buildpack-deps, python3.12, and rust in Dockerfile 2024-12-17 16:39:30 -08:00
Paul Gauthier (aider)
cf5b38d4f5 style: Fix linting issues in benchmark.py 2024-12-17 16:35:20 -08:00
Paul Gauthier (aider)
b23669400f fix: Correct syntax error in cleanup_test_output 2024-12-17 16:35:16 -08:00
Paul Gauthier
aaacd00ecf refactor: Use pytest instead of unittest for running tests 2024-12-17 16:35:08 -08:00
Paul Gauthier (aider)
03aa22ba84 feat: Read config.json, copy solution/test files, no fallback 2024-12-17 16:18:10 -08:00
Paul Gauthier
1493b8703f fix: Skip unparseable results files in real test 2024-12-17 16:18:09 -08:00
Paul Gauthier (aider)
59308c20c6 feat: Number exercises in the table 2024-12-17 14:15:40 -08:00
Paul Gauthier (aider)
cac5d8e716 style: Apply linter formatting 2024-12-17 14:15:06 -08:00
Paul Gauthier (aider)
7f16757bbe fix: Handle missing results in topn leaderboard calculation 2024-12-17 14:15:02 -08:00
Paul Gauthier (aider)
674e3846e2 fix: Correctly sort leaderboard by pass rate 2024-12-17 14:13:43 -08:00
Paul Gauthier (aider)
3a0be0cca9 style: Apply linter formatting 2024-12-17 14:13:19 -08:00
Paul Gauthier (aider)
00d7c3a05a feat: Add --topn argument to limit models by pass rate 2024-12-17 14:13:16 -08:00
Paul Gauthier (aider)
91f5fca5e9 feat: Include never solved exercises in stats 2024-12-17 14:10:47 -08:00
Paul Gauthier (aider)
1d7cb0c119 feat: Format problem stats output as a table with percentages 2024-12-17 14:10:00 -08:00
Paul Gauthier (aider)
24599aa64f style: Run linter on problem_stats.py 2024-12-17 14:09:20 -08:00
Paul Gauthier (aider)
54c1553892 refactor: Remove distribution of solutions table 2024-12-17 14:09:17 -08:00
Paul Gauthier (aider)
0ae53ce1a1 feat: Output per-exercise stats, sort by solvers 2024-12-17 14:08:47 -08:00
Paul Gauthier
c69ffe02f8 chore: Make problem_stats.py executable 2024-12-17 14:08:46 -08:00
Paul Gauthier (aider)
7bfc2e0e74 style: Run linter on benchmark script 2024-12-17 14:06:56 -08:00
Paul Gauthier (aider)
9cc674c283 feat: Add script to analyze exercise solution stats 2024-12-17 14:06:53 -08:00
Paul Gauthier
66e597a05c feat: Add problem stats benchmark 2024-12-17 14:06:52 -08:00
Paul Gauthier
074c636e53 copy 2024-12-17 14:03:46 -08:00
Paul Gauthier
4ec44936f6 analytics to 10% 2024-12-17 14:01:13 -08:00
Paul Gauthier
eb9c41f2a0 feat: Enable complete_while_typing in prompt_session 2024-12-17 13:42:59 -08:00
Paul Gauthier (aider)
04afb99c54 fix: Use module-level function in test_is_uuid_in_percentage 2024-12-17 13:33:33 -08:00
Paul Gauthier
2124e7b221 copy 2024-12-17 13:30:30 -08:00
Paul Gauthier
2416a8bf96 fix: Handle empty file content in FileWatcher 2024-12-17 13:30:10 -08:00
Paul Gauthier (aider)
408a40f78b style: Format with linter 2024-12-17 13:24:55 -08:00
Paul Gauthier (aider)
195ae5ce4b feat: Pass cwd as root to FileWatcher when subtree_only 2024-12-17 13:24:50 -08:00
Paul Gauthier
9bebb1e9a9 fix: Pass root to FileWatcher 2024-12-17 13:24:49 -08:00
Paul Gauthier
e7bec5be1d feat: Allow setting root path for file watcher 2024-12-17 13:23:55 -08:00
Paul Gauthier
c708e8ba8e refactor: Move PERCENT constant to top level 2024-12-17 13:02:07 -08:00
Paul Gauthier (aider)
60f26cc067 refactor: Move is_uuid_in_percentage and fix import 2024-12-17 12:55:43 -08:00
Paul Gauthier (aider)
64fa058bc7 style: Apply linter fixes 2024-12-17 12:55:29 -08:00
Paul Gauthier (aider)
9a770eeae9 refactor: Move uuid percentage check to standalone functions 2024-12-17 12:55:26 -08:00
Paul Gauthier
ffc2c5a26e refactor: Move uuid percentage check to function 2024-12-17 12:55:24 -08:00
Paul Gauthier
b6c5bd552e Merge branch 'main' of github.com:Aider-AI/aider 2024-12-17 12:39:07 -08:00
paul-gauthier
05147a3199 Merge pull request #2652 from evannjohnson/docs-code-themes
Document that Pygments styles can be used for --code-theme
2024-12-17 12:39:04 -08:00
Evan Johnson
7f0d08ad77 doc that Pygments styles can be used for --code-theme 2024-12-17 13:18:31 -07:00
Paul Gauthier
64f95af833 copy 2024-12-17 10:56:23 -08:00
Paul Gauthier
7cd2662355 disable website analytics 2024-12-17 08:48:47 -08:00
Paul Gauthier (aider)
154d485c9e feat: Add analytics config and toggle to _config.yml 2024-12-17 08:32:12 -08:00
Paul Gauthier
5f6821c7e2 copy 2024-12-17 08:28:51 -08:00
Paul Gauthier (aider)
59cf823d56 style: Run linter on blame.py 2024-12-17 08:25:08 -08:00
Paul Gauthier (aider)
70312c58be feat: Add exclude_files list and filter in blame script 2024-12-17 08:25:04 -08:00
Paul Gauthier
4942366271 feat: Add exclude_files list to blame script 2024-12-17 08:25:03 -08:00
Paul Gauthier
f237d0f212 copy 2024-12-16 19:57:10 -08:00
Paul Gauthier
9b424e0fe7 copy 2024-12-16 16:29:43 -08:00
Paul Gauthier
81b75d178b copy 2024-12-16 16:27:55 -08:00
Paul Gauthier
410e732eb3 copy 2024-12-16 16:21:55 -08:00
Paul Gauthier
2ca93cd93d copy 2024-12-16 16:18:50 -08:00
Paul Gauthier
50c806286e copy 2024-12-16 16:12:30 -08:00
Paul Gauthier
59de835b42 copy 2024-12-16 16:08:02 -08:00
Paul Gauthier
ecbac76cba copy 2024-12-16 16:06:06 -08:00
Paul Gauthier (aider)
9b16f2139d feat: Install aider-chat using uv after uv install 2024-12-16 16:02:49 -08:00
Paul Gauthier
ef14df5ba2 feat: Add install script for website 2024-12-16 16:02:48 -08:00
Paul Gauthier
b4be9875b2 copy 2024-12-16 15:58:29 -08:00
Paul Gauthier
8d0c962f42 copy 2024-12-16 15:57:13 -08:00
Paul Gauthier
5e0cb8d658 add install.ps1 2024-12-16 15:34:08 -08:00
Paul Gauthier
1869ab94fe copy 2024-12-16 13:01:25 -08:00
Paul Gauthier
2627c5baaf refac leaderboard 2024-12-16 12:57:56 -08:00
Paul Gauthier (aider)
e4e16b8f77 fix: Correctly select table body element 2024-12-16 12:56:49 -08:00
Paul Gauthier
85218d74d4 don't block pre-commit for faq cog 2024-12-16 12:47:06 -08:00
Paul Gauthier
47d5b66986 copy 2024-12-16 12:44:21 -08:00
Paul Gauthier
ecfb133de2 copy 2024-12-16 12:40:29 -08:00
Paul Gauthier
23c95d24f1 copy 2024-12-16 12:38:01 -08:00
Paul Gauthier
b37d89bd08 copy 2024-12-16 12:37:10 -08:00
Paul Gauthier
5c848d59b2 set version to 0.69.2.dev 2024-12-16 12:36:28 -08:00
Paul Gauthier
b1c04dece9 version bump to 0.69.1 2024-12-16 12:34:51 -08:00
Paul Gauthier
b87c7987bb copy 2024-12-16 12:29:10 -08:00
Paul Gauthier
0bef52ae7d fix: Only show AI comment help once per file add 2024-12-16 12:27:19 -08:00
Paul Gauthier (aider)
9ae04cf1ec style: Format tool output message 2024-12-16 12:13:35 -08:00
Paul Gauthier (aider)
0f7c4a8d4f feat: Add help message for first-time AI usage 2024-12-16 12:13:32 -08:00
Paul Gauthier
07353207c0 feat: Output "Use AI!" if no action triggered 2024-12-16 12:13:31 -08:00
Paul Gauthier
d89be83414 copy 2024-12-16 12:10:34 -08:00
Paul Gauthier
01382527f5 cleanup cog of toml 2024-12-16 12:08:08 -08:00
Paul Gauthier
dece2193fc Switch to MANIFEST.in to exclude aider/website/assets/ and other from whl build file 2024-12-16 12:07:02 -08:00
Paul Gauthier
d298f864fa works? 2024-12-16 11:55:24 -08:00
Paul Gauthier (aider)
ff37d8c691 feat: Add include-package-data to pyproject.toml 2024-12-16 08:28:10 -08:00
Paul Gauthier
f7f305a564 fix: Update include pattern for assets 2024-12-16 08:28:09 -08:00
Paul Gauthier (aider)
86f38e11cd feat: Add MANIFEST.in to exclude website assets 2024-12-16 08:27:02 -08:00
Paul Gauthier
0b60c48253 fixed gemini metadata keys 2024-12-15 16:00:40 -08:00
Paul Gauthier
024b9840f0 copy 2024-12-15 09:34:51 -08:00
Paul Gauthier
2f4f59d82f copy 2024-12-15 09:29:21 -08:00
Paul Gauthier
830d5ee763 copy 2024-12-15 09:27:22 -08:00
Paul Gauthier
5bc63f7a33 copy 2024-12-15 09:25:29 -08:00
Paul Gauthier
b54f970e12 copy 2024-12-15 09:16:42 -08:00
Paul Gauthier
0cc8c54152 copy 2024-12-15 09:01:13 -08:00
Paul Gauthier
241e1e27d0 copy 2024-12-15 08:50:28 -08:00
Paul Gauthier
0145e86202 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-15 08:48:12 -08:00
Paul Gauthier
4d50e1e373 copy 2024-12-15 08:46:44 -08:00
Paul Gauthier
4b6ae34800 updated keys config docs 2024-12-15 08:46:20 -08:00
Paul Gauthier
2feb85e831 api keys 2024-12-15 08:40:02 -08:00
Paul Gauthier
a67ac81265 updated install instructions 2024-12-15 08:39:53 -08:00
paul-gauthier
dab536c9e8 Merge pull request #2633 from you-n-g/patch-1 2024-12-15 07:04:51 -08:00
you-n-g
64cf298521 docs: Update watch.md 2024-12-15 13:35:14 +08:00
Paul Gauthier
10b5aaa6a5 copy 2024-12-14 20:52:20 -08:00
Paul Gauthier
8c79e5ccfb copy 2024-12-14 20:09:51 -08:00
Paul Gauthier
2ef536a342 copy 2024-12-14 17:42:22 -08:00
Paul Gauthier
85b1303460 fix: Remove always-true condition for Windows env var message 2024-12-14 09:50:26 -08:00
Paul Gauthier
60aca3a241 Merge branch 'no-git' 2024-12-14 09:49:41 -08:00
Paul Gauthier
db98381a86 refactor: Move git check after env loading 2024-12-14 09:44:42 -08:00
Paul Gauthier
f62ef34715 fix: Handle missing git module gracefully 2024-12-14 09:42:54 -08:00
Paul Gauthier
f95a6c1a5a recommend aider-install 2024-12-14 09:42:32 -08:00
Paul Gauthier
65555b5dd0 copy 2024-12-13 13:43:15 -08:00
Paul Gauthier
9f6331a35e copy 2024-12-13 13:34:18 -08:00
Paul Gauthier (aider)
8c10cb6230 style: Fix linting issues in my_models.py 2024-12-13 13:22:59 -08:00
Paul Gauthier (aider)
c8894bcead feat: Conditionally add redacted model note to script 2024-12-13 13:22:55 -08:00
Paul Gauthier
edc602c33a copy 2024-12-13 12:55:33 -08:00
Paul Gauthier (aider)
abfb2ca810 fix: Correct import path for my_models in faq.md 2024-12-13 12:49:01 -08:00
Paul Gauthier (aider)
9967efe45a fix: Correct import path in cog block for model stats 2024-12-13 12:48:29 -08:00
Paul Gauthier
e77d80bda5 docs: Add FAQ about LLMs used to build aider 2024-12-13 12:48:28 -08:00
Paul Gauthier (aider)
a691d1750a style: Apply linter formatting 2024-12-13 12:34:34 -08:00
Paul Gauthier (aider)
834e2f9304 refactor: Separate data, text, and HTML formatting into functions 2024-12-13 12:34:31 -08:00
Paul Gauthier (aider)
66e5e9c1ce feat: Add percentage column to model token usage summary 2024-12-13 12:33:14 -08:00
Paul Gauthier (aider)
2d5f613984 feat: Process only last 1000 lines of analytics file 2024-12-13 12:32:28 -08:00
Paul Gauthier (aider)
868e7a278f feat: Sort model token usage by count descending 2024-12-13 12:31:38 -08:00
Paul Gauthier
f953d17889 chore: Make my_models.py executable 2024-12-13 12:31:37 -08:00
Paul Gauthier (aider)
3473969aae fix: Remove unused os import in my_models.py 2024-12-13 12:31:09 -08:00
Paul Gauthier (aider)
ec11ae7c40 style: Fix linting issues in my_models.py 2024-12-13 12:31:03 -08:00
Paul Gauthier (aider)
8217ee1bbb feat: Add script to analyze model token usage 2024-12-13 12:30:59 -08:00
Paul Gauthier
1ad3ee0aec feat: Add my_models.py script 2024-12-13 12:30:59 -08:00
Paul Gauthier (aider)
b3e9a2fede feat: Allow version arg for blame script, default to v0.1.0 2024-12-13 11:49:15 -08:00
Paul Gauthier
2f5d6bf909 feat: Take version as optional arg for blame script 2024-12-13 11:49:14 -08:00
Paul Gauthier
cd79f479e9 copy 2024-12-13 11:48:14 -08:00
Paul Gauthier
12c0f675ce copy 2024-12-13 11:46:44 -08:00
Paul Gauthier
29471b8019 set version to 0.69.1.dev 2024-12-13 11:42:00 -08:00
Paul Gauthier
cad661f0c8 version bump to 0.69.0 2024-12-13 11:40:25 -08:00
Paul Gauthier
261d770482 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-13 11:39:41 -08:00
Paul Gauthier
a75c9c74fd copy 2024-12-13 11:39:37 -08:00
paul-gauthier
8b5bdf9a16 Merge pull request #2623 from damms005/patch-1
Update conventions.md to fix url
2024-12-13 10:42:54 -08:00
Damilola Emmanuel Olowookere
e35eba2d51 Update conventions.md to fix url 2024-12-13 18:36:10 +00:00
Paul Gauthier (aider)
df8c88cef4 style: Fix line length in issues.py 2024-12-13 08:46:57 -08:00
Paul Gauthier (aider)
844e12769c feat: Handle "bug" label like "enhancement" for closing 2024-12-13 08:46:53 -08:00
Paul Gauthier (aider)
b982626ac4 style: Fix line length in comment 2024-12-13 08:46:02 -08:00
Paul Gauthier (aider)
517b2b42a6 fix: Fix long lines in closing comment 2024-12-13 08:45:58 -08:00
Paul Gauthier (aider)
6778c33628 style: Apply linter fixes 2024-12-13 08:45:47 -08:00
Paul Gauthier (aider)
bc0b11e1ef feat: Add fixed enhancement issue closing 2024-12-13 08:45:43 -08:00
Paul Gauthier
6b0d4b9c93 copy 2024-12-13 08:23:42 -08:00
Paul Gauthier
7d4e4f029e copy 2024-12-13 08:13:36 -08:00
Paul Gauthier
1fbdb629ff add gemini-2.0-flash-exp metadata 2024-12-13 08:12:06 -08:00
Paul Gauthier
a437237947 copy 2024-12-13 07:37:15 -08:00
Paul Gauthier
910637c549 5% analytics 2024-12-13 06:51:50 -08:00
Paul Gauthier
e8974a3e69 copy 2024-12-12 19:08:21 -08:00
Paul Gauthier
6c98310f7f copy 2024-12-12 19:08:16 -08:00
Paul Gauthier
72aed0d26d fix: Disable complete_while_typing in prompt_session 2024-12-12 12:27:14 -08:00
Paul Gauthier
e10ef8b9e0 feat: Add instructions to /copy-context command 2024-12-12 12:08:29 -08:00
Paul Gauthier
39fa8ba831 copy 2024-12-12 07:54:54 -08:00
Paul Gauthier (aider)
8ee8279044 fix: Correct emacs auto-save gitignore pattern 2024-12-11 20:44:02 -08:00
Paul Gauthier (aider)
c3f85c3bb2 test: Fix gitignore pattern matching and add ai comment test 2024-12-11 20:43:07 -08:00
Paul Gauthier (aider)
ad59c4cbf3 test: Add comprehensive gitignore pattern tests 2024-12-11 20:43:03 -08:00
Paul Gauthier
26bc981981 chore: Add comment about testing gitignore patterns 2024-12-11 20:43:02 -08:00
Paul Gauthier
514c34b242 copy 2024-12-11 20:41:24 -08:00
Paul Gauthier (aider)
6f266c0090 fix: Skip test fixture watch files in blame script 2024-12-11 20:38:11 -08:00
Paul Gauthier
baa7352ca6 chore: Skip test fixture files in blame script 2024-12-11 20:38:11 -08:00
Paul Gauthier (aider)
fdb1c8d99a chore: Remove comment about skipping test files 2024-12-11 20:37:29 -08:00
Paul Gauthier
79f5dba094 chore: Skip test fixture files in blame script 2024-12-11 20:37:28 -08:00
Paul Gauthier
2134965f16 initial 2024-12-11 20:34:00 -08:00
Paul Gauthier
77b7a59a27 copy 2024-12-11 20:33:30 -08:00
Paul Gauthier
365e7126d0 refactor: Remove is_source_file function and check in FileWatcher 2024-12-11 20:30:47 -08:00
Paul Gauthier (aider)
d3daf9d159 feat: Add IDE, env, log, and cache patterns to ignore list 2024-12-11 20:30:17 -08:00
Paul Gauthier
8d59a519a6 chore: Add comment about gitignore patterns 2024-12-11 20:29:28 -08:00
Paul Gauthier (aider)
239262f360 style: Format gitignore patterns for readability 2024-12-11 20:28:07 -08:00
Paul Gauthier (aider)
9eb938fd6f feat: Expand gitignore patterns to include editor temp files 2024-12-11 20:28:03 -08:00
Paul Gauthier
3fcbf1a43f feat: Add text editor temp files to gitignore 2024-12-11 20:28:02 -08:00
Paul Gauthier
2b7ee271df copy 2024-12-11 20:24:08 -08:00
Paul Gauthier
11512c6281 feat: Add support for ! and ? action comments 2024-12-11 20:23:29 -08:00
Paul Gauthier (aider)
b16ba547ab test: Add assertion for line count in test_ai_comment_pattern 2024-12-11 20:21:50 -08:00
Paul Gauthier (aider)
e5b8899b4c fix: Remove extra comment in test_watch.py 2024-12-11 20:21:46 -08:00
Paul Gauthier (aider)
fee3e9e63b feat: Add test for watch_question.js fixture 2024-12-11 20:21:42 -08:00
Paul Gauthier
57a24d30b5 test: Add test for watch_question.js ai comments 2024-12-11 20:21:41 -08:00
Paul Gauthier (aider)
5a83610fb1 refactor: Update ai comment action handling to support '?' 2024-12-11 20:16:10 -08:00
Paul Gauthier
96086f12c6 fix: Correct ai comment regex to match ai? and ai! 2024-12-11 20:16:09 -08:00
Paul Gauthier
a6ee3ce07f cleanup 2024-12-11 20:12:26 -08:00
Paul Gauthier (aider)
5f36ddd425 test: Fix multiline mode tests and add toggle test 2024-12-11 20:10:30 -08:00
Paul Gauthier (aider)
bec67074e0 feat: Add tests for multiline input mode 2024-12-11 20:10:26 -08:00
Paul Gauthier (aider)
895c92cdae fix: Remove unused import buffer_has_focus 2024-12-11 20:05:04 -08:00
Paul Gauthier
7406a5bc26 refactor: Move is_searching filter to top level 2024-12-11 20:05:01 -08:00
Paul Gauthier (aider)
ef97714404 fix: Reorder imports to satisfy linter 2024-12-11 20:00:00 -08:00
Paul Gauthier (aider)
6d6daee511 fix: Use correct filter for custom enter keybinding 2024-12-11 19:59:56 -08:00
Paul Gauthier (aider)
32cd1c2a65 fix: Fix Ctrl-R reverse search enter key selection 2024-12-11 19:55:08 -08:00
Paul Gauthier
abad920a8a feat: Add gemini-2.0-flash-exp model settings 2024-12-11 19:47:44 -08:00
Paul Gauthier
e1ab49e100 copy 2024-12-11 19:43:31 -08:00
Paul Gauthier
df300e89a2 refac prompt out 2024-12-11 19:42:01 -08:00
Paul Gauthier
9a278bed21 feat: Add gemini flash model alias 2024-12-11 16:00:31 -08:00
Paul Gauthier
4a7fc084ce refactor: move watch prompt text to separate module 2024-12-11 15:07:30 -08:00
Paul Gauthier
2649e736fb chore: update model name in leaderboard to include date 2024-12-11 15:00:18 -08:00
Paul Gauthier
42ac891e28 docs: add bash syntax highlighting to code blocks in docs 2024-12-11 14:49:22 -08:00
Paul Gauthier
4dc3b9072e feat: increase retry timeout for benchmarking 2024-12-11 14:26:28 -08:00
Paul Gauthier
ae3235b099 feat: add Gemini 2.0 Flash model leaderboard entry 2024-12-11 13:55:52 -08:00
Paul Gauthier
7cc5e0d577 docs: add Yi Lightning model test results to leaderboard 2024-12-11 13:54:39 -08:00
Paul Gauthier
f6b956dc8e refactor: simplify voice command and improve installation docs 2024-12-11 13:52:33 -08:00
Paul Gauthier (aider)
fcb2bacd1e style: format benchmark.py with black 2024-12-11 13:09:52 -08:00
Paul Gauthier (aider)
a9401e921e feat: add sleep option between tests in single-threaded mode 2024-12-11 13:09:45 -08:00
Paul Gauthier
02e7e315b2 copy 2024-12-11 12:54:50 -08:00
Paul Gauthier
def72a64e0 copy 2024-12-11 12:45:56 -08:00
Paul Gauthier
46e7672197 copy 2024-12-11 12:42:19 -08:00
Paul Gauthier
2f8a5ce935 copy 2024-12-11 12:40:13 -08:00
Paul Gauthier (aider)
730e5bd831 fix: add error handling for clipboard operations in copy_context command 2024-12-11 12:10:12 -08:00
Paul Gauthier
b7984a05af copy 2024-12-11 09:51:51 -08:00
Paul Gauthier
5d4af67186 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-11 07:21:18 -08:00
paul-gauthier
370e08cf4d Merge pull request #2601 from miradnanali/multiline-mode
Implement /multiline-mode, swaps Enter & Meta-Enter
2024-12-11 07:21:09 -08:00
Mir Adnan ALI
aaf7e3f943 Implement multiline-mode, swaps Enter & Meta-Enter 2024-12-11 09:09:58 -05:00
Paul Gauthier
fbde0936e7 revert 2024-12-10 11:20:25 -08:00
Paul Gauthier (aider)
af48f7bab4 fix: update artifact upload path to match Jekyll build directory 2024-12-10 11:12:23 -08:00
Paul Gauthier
61def89878 ci: downgrade upload-pages-artifact action to v3 2024-12-10 11:07:42 -08:00
Paul Gauthier (aider)
88e86cee77 chore: upgrade upload-pages-artifact action to v4 2024-12-10 11:04:46 -08:00
Paul Gauthier
acc1625406 Merge branch 'main' of github.com:Aider-AI/aider 2024-12-10 11:03:20 -08:00
Paul Gauthier
502f448053 copy 2024-12-10 09:59:56 -08:00
paul-gauthier
55b081884c Merge pull request #2592 from JeongJuhyeon/patch-1
Add '?' to set of punctuations to strip for file mentions
2024-12-10 08:41:38 -08:00
Paul Gauthier
fd67171908 copy 2024-12-10 08:21:28 -08:00
Paul Gauthier
16a53aa641 set version to 0.68.1.dev 2024-12-10 08:19:44 -08:00
Paul Gauthier
4aec676950 version bump to 0.68.0 2024-12-10 08:18:06 -08:00
Paul Gauthier
d8fff0e90a copy 2024-12-10 08:01:18 -08:00
Paul Gauthier
57ad6cc3ea Update shell cmd prompt: no multi-line, run from project root 2024-12-10 07:59:24 -08:00
Paul Gauthier
2b46a8b9c9 copy 2024-12-10 07:39:58 -08:00
Paul Gauthier
4d1a2e8c53 copy 2024-12-10 07:19:00 -08:00
Paul Gauthier
58b1409bd2 copy 2024-12-10 07:02:26 -08:00
Paul Gauthier
a2525dbf56 docs: remove deprecated label from DeepSeek model names 2024-12-10 06:59:58 -08:00
Paul Gauthier
36eb2a31b5 docs: add DeepSeek-V2.5-1210 model leaderboard results 2024-12-10 06:57:18 -08:00
Paul Gauthier
0483bfc9cb docs: add Gemini whole file edit experiment results to leaderboard 2024-12-10 06:47:41 -08:00
JeongJuhyeon
3f63a64254 Add '?' to set of punctuations to strip for file mentions 2024-12-10 22:10:00 +09:00
Paul Gauthier
16332b285f copy 2024-12-09 20:27:38 -08:00
Paul Gauthier
f7371f6faf copy 2024-12-09 20:27:32 -08:00
Paul Gauthier
92d29805f1 copy 2024-12-09 20:06:36 -08:00
Paul Gauthier
4a37d07acb fix: skip context copy when using placeholder input 2024-12-09 18:46:44 -08:00
Paul Gauthier
bb4c61e9cc copy 2024-12-09 15:38:40 -08:00
Paul Gauthier
f4e5515c82 docs: clarify read-only command description and behavior 2024-12-09 15:37:48 -08:00
Paul Gauthier (aider)
141a2df19c test: add test for bulk conversion to read-only mode 2024-12-09 15:36:03 -08:00
Paul Gauthier (aider)
e2385b4922 feat: add bulk conversion to read-only mode when no files specified 2024-12-09 15:34:59 -08:00
Paul Gauthier
9974fb50f7 feat: add auto-conversion of /added files to read-only mode 2024-12-09 15:34:57 -08:00
Paul Gauthier
c5d51d62c4 feat: add architect command and improve coder class documentation 2024-12-09 15:30:01 -08:00
Paul Gauthier
4fcbf28f91 Restore interactive shell #2415 2024-12-09 15:23:39 -08:00
Paul Gauthier
f678b664ff refactor: Move website files list to global scope 2024-12-09 15:01:12 -08:00
Paul Gauthier (aider)
4206920a7d style: fix whitespace in blame.py 2024-12-09 15:00:47 -08:00
Paul Gauthier (aider)
ad2e5ead54 refactor: extract website files into dedicated list 2024-12-09 15:00:41 -08:00
Paul Gauthier
eb72719117 chore: add website file to blame script and improve comments 2024-12-09 15:00:40 -08:00
Paul Gauthier (aider)
20b46afbf2 style: update cookie consent box colors to dark grey 2024-12-09 14:41:12 -08:00
Paul Gauthier (aider)
1925e4a7f4 feat: add cookie persistence config to consent banner 2024-12-09 14:39:19 -08:00
Paul Gauthier (aider)
1a12322354 feat: add GDPR-compliant cookie consent for PostHog analytics 2024-12-09 14:33:54 -08:00
Paul Gauthier
73f3f4ec7e feat: add analytics events for copy-paste mode and AI comments 2024-12-09 10:47:30 -08:00
Paul Gauthier (aider)
a8c42f453a style: format FileWatcher instantiation for better readability 2024-12-09 10:32:08 -08:00
Paul Gauthier (aider)
79dd0c5ba6 feat: add analytics events for file watching and AI comments 2024-12-09 10:31:59 -08:00
Paul Gauthier
89bc3b6b16 feat: add analytics event hooks to file watcher 2024-12-09 10:31:57 -08:00
Paul Gauthier (aider)
a997dd6c49 fix: use LiteLLMExceptions class instead of undefined litellm_ex 2024-12-09 07:46:09 -08:00
Paul Gauthier (aider)
6aa80d2a4c feat: handle cost calculation differently for context window vs other errors 2024-12-09 07:45:50 -08:00
Paul Gauthier
f009e8fb14 add pip as a req 2024-12-09 06:51:06 -08:00
Paul Gauthier
a8dde17155 add posthog 2024-12-09 06:50:58 -08:00
Paul Gauthier
cbcbff341b style: format voice.py and suppress syntax warnings 2024-12-08 18:14:30 -08:00
Paul Gauthier (aider)
e50992bb93 style: remove unused shutil import 2024-12-08 18:12:36 -08:00
Paul Gauthier
fa6c3068c0 refactor: simplify pip install command by using sys.executable directly 2024-12-08 18:12:30 -08:00
Paul Gauthier
dd9bdca572 copy 2024-12-08 14:44:51 -08:00
Paul Gauthier
3f7dffe47d copy 2024-12-08 14:30:31 -08:00
Paul Gauthier
c7fde14458 copy 2024-12-08 12:05:41 -08:00
Paul Gauthier
57f4186cad refactor: optimize analytics event tracking with system info as super properties 2024-12-08 11:49:12 -08:00
Paul Gauthier
fa5a6021b1 copy 2024-12-08 11:49:01 -08:00
Paul Gauthier
42ae279b91 fix: update test cases to use Model wrapper class 2024-12-07 15:09:04 -08:00
Paul Gauthier
a74cdbfc28 test: update test_sendchat to use Model class and fix assertion 2024-12-07 15:07:39 -08:00
Paul Gauthier (aider)
a56fa567dd test: update print call count assertions in sendchat tests 2024-12-07 13:44:08 -08:00
Paul Gauthier (aider)
c9c2d5ab6f test: update test assertions to check model objects instead of names 2024-12-07 13:38:57 -08:00
Paul Gauthier (aider)
ccf460c1f7 refactor: update simple_send_with_retries to use model object and handle temperature 2024-12-07 13:37:14 -08:00
Paul Gauthier
2325f542b8 copy 2024-12-07 13:04:06 -08:00
Paul Gauthier (aider)
63fdf3f3f6 style: format git blame command arguments for better readability 2024-12-07 11:54:14 -08:00
Paul Gauthier (aider)
efa83bdf34 feat: add git blame move/copy detection for better attribution 2024-12-07 11:54:10 -08:00
Paul Gauthier
5705bda818 style: Update settings section headings to use lowercase 2024-12-07 11:51:19 -08:00
Paul Gauthier
20042334ff refactor: reorganize command line arguments and improve help messages 2024-12-07 11:45:20 -08:00
Paul Gauthier (aider)
7ae9569816 docs: update deprecated OpenAI args help text to suggest --set-env 2024-12-07 11:23:05 -08:00
Paul Gauthier
cacba526b3 refactor: reorganize API key and environment settings arguments 2024-12-07 11:23:03 -08:00
Paul Gauthier
50f203cc8a cleanup 2024-12-07 11:07:59 -08:00
Paul Gauthier
3efcd154f3 refactor: consolidate API key and environment variable handling 2024-12-07 10:55:29 -08:00
Paul Gauthier (aider)
bdb08d7c78 style: format long lines in main.py 2024-12-07 10:52:27 -08:00
Paul Gauthier (aider)
f3874dd40a feat: add deprecation warnings for legacy API key arguments 2024-12-07 10:52:21 -08:00
Paul Gauthier
935c39e341 refactor: move API key handling earlier in startup sequence 2024-12-07 10:52:19 -08:00
Paul Gauthier (aider)
7ddcc30e8d style: format test_main.py line breaks 2024-12-07 08:23:58 -08:00
Paul Gauthier (aider)
13ff038e58 feat: add --api-key flag to set provider API keys as env vars 2024-12-07 08:23:50 -08:00
Paul Gauthier
1d4918dfbf refactor: Remove analytics event for invalid env var format 2024-12-07 08:11:10 -08:00
Paul Gauthier (aider)
ba14ab96da refactor: update env format test to check return value instead of SystemExit 2024-12-07 08:09:56 -08:00
Paul Gauthier
054e0820b7 refactor: Move --set-env processing after IO initialization 2024-12-07 08:09:52 -08:00
Paul Gauthier (aider)
af3d8dd6a7 style: format test_main.py with black 2024-12-07 08:08:40 -08:00
Paul Gauthier (aider)
e10d06cb47 test: add test coverage for --set-env functionality 2024-12-07 08:08:35 -08:00
Paul Gauthier (aider)
87a1469c1e style: fix string quote consistency in env setting split 2024-12-07 08:07:28 -08:00
Paul Gauthier (aider)
2492f1635c refactor: remove --set-env argument processing from main function 2024-12-07 08:07:23 -08:00
Paul Gauthier (aider)
b3305e6e19 refactor: move env var processing after IO initialization 2024-12-07 08:07:14 -08:00
Paul Gauthier (aider)
491d3e6606 style: fix string quote consistency in env setting split 2024-12-07 08:06:04 -08:00
Paul Gauthier (aider)
e41bf67f73 feat: add --set-env flag to set environment variables from command line 2024-12-07 08:05:57 -08:00
Paul Gauthier
66b99c4fa0 bumped deps to pickup litellm that supports OPENAI_ORGANIZATION 2024-12-07 07:57:29 -08:00
Paul Gauthier (aider)
f2f2645fe6 style: fix linting issues in watch.py 2024-12-07 07:54:24 -08:00
Paul Gauthier (aider)
4c77d0509a feat: add shell dotfile extensions to source file detection 2024-12-07 07:54:20 -08:00
Paul Gauthier
33d77f4355 feat: add shell script file extensions to source file detection 2024-12-07 07:54:18 -08:00
Paul Gauthier
ecf8617246 copy 2024-12-06 17:41:34 -08:00
Paul Gauthier
bec216d72a feat: add experimental Gemini model settings 2024-12-06 17:41:11 -08:00
Paul Gauthier (aider)
374e8c3307 feat: add video file exclusions to linkchecker 2024-12-06 15:12:12 -08:00
Paul Gauthier
b5eff8a9dd copy 2024-12-06 14:52:50 -08:00
Paul Gauthier (aider)
d53002a494 feat: add legend to chart showing diff and whole format patterns 2024-12-06 14:46:43 -08:00
Paul Gauthier (aider)
04662f0875 feat: add y-axis label to leaderboard charts 2024-12-06 14:45:25 -08:00
Paul Gauthier
aec92c7c17 refactor: update highlighted model name to 1206 2024-12-06 14:45:23 -08:00
Paul Gauthier (aider)
f7a7976923 feat: add red striped pattern for highlighted model with whole edit format 2024-12-06 14:43:05 -08:00
Paul Gauthier
1b50d4507f feat: update highlighted model to Qwen in leaderboard 2024-12-06 14:43:02 -08:00
Paul Gauthier (aider)
045cf887df feat: add pattern background for whole edit format bars in chart 2024-12-06 14:39:05 -08:00
Paul Gauthier (aider)
277d7c0e04 perf: cache diagonal pattern and optimize label access in chart rendering 2024-12-06 14:36:34 -08:00
Paul Gauthier (aider)
0e2c703e77 fix: add chart render call to ensure pattern reappears after row selection 2024-12-06 14:33:31 -08:00
Paul Gauthier (aider)
62b3f38f00 feat: add Patternomaly script tags for chart patterns 2024-12-06 14:31:52 -08:00
Paul Gauthier (aider)
422658293d fix: remove redundant pattern initialization and add Patternomaly script 2024-12-06 14:31:29 -08:00
Paul Gauthier (aider)
74cfd05642 feat: add edit format field and striped pattern for whole edits 2024-12-06 14:29:36 -08:00
Paul Gauthier (aider)
80586f1de3 feat: add line breaks for long x-axis labels in leaderboard chart 2024-12-06 14:22:54 -08:00
Paul Gauthier
a933177ac0 copy 2024-12-06 14:19:00 -08:00
Paul Gauthier
ade2db696b add emini-exp-1206 2024-12-06 14:14:07 -08:00
Paul Gauthier
cf266037ff copy 2024-12-06 14:10:11 -08:00
Paul Gauthier
5f14277fbf Remove -i when running shell commands, as it tosses local env 2024-12-06 13:56:57 -08:00
Paul Gauthier
b677349ec9 copy 2024-12-06 13:55:53 -08:00
Paul Gauthier
7f72d2a703 reraise EOFError to fix control-d 2024-12-06 13:55:41 -08:00
Paul Gauthier
779983cb85 feat: add missing dependency hints for Gemini and Bedrock 2024-12-06 13:43:49 -08:00
Paul Gauthier
f2d2ab51b1 copy 2024-12-06 13:27:26 -08:00
Paul Gauthier
0a54f8c4a7 copy 2024-12-06 12:25:45 -08:00
Paul Gauthier
881527ddd0 handle and test for trailing whitespace after ai 2024-12-06 12:23:27 -08:00
Paul Gauthier
cca4f894a8 style: fix indentation and remove redundant comment 2024-12-06 12:20:23 -08:00
Paul Gauthier (aider)
20dae33be5 fix: remove duplicate TreeContext parameters causing syntax error 2024-12-06 12:15:59 -08:00
Paul Gauthier (aider)
fd301c519d feat: add error handling for TreeContext with fallback to raw comments 2024-12-06 12:15:46 -08:00
Paul Gauthier
a96d87814b fix: handle ValueError in TreeContext by including raw comments 2024-12-06 12:15:45 -08:00
Paul Gauthier
2a3eefc5be copy 2024-12-06 12:09:20 -08:00
Paul Gauthier
c5dc10e3cd copy 2024-12-06 11:24:26 -08:00
Paul Gauthier
c251a93609 fix --test to automatically fix errors 2024-12-06 11:23:15 -08:00
Paul Gauthier
2df509effd added llama 3.3 70b 2024-12-06 10:47:40 -08:00
Paul Gauthier
53e0d670b3 copy 2024-12-06 09:45:41 -08:00
Paul Gauthier
ccd19d2c96 copy 2024-12-06 09:24:13 -08:00
Paul Gauthier
b69f084db9 copy 2024-12-06 09:10:35 -08:00
Paul Gauthier
9639395937 feat: improve AI comment handling and documentation 2024-12-06 08:46:52 -08:00
Paul Gauthier
117b7afd81 copy 2024-12-06 07:17:21 -08:00
Paul Gauthier
009c4dc8db copy 2024-12-06 07:02:06 -08:00
Paul Gauthier
0fdf3fc851 Merge branch 'copypaste' 2024-12-06 07:01:40 -08:00
Paul Gauthier
ffc2d91cef copy 2024-12-06 06:44:23 -08:00
Paul Gauthier
99975c8ff7 set version to 0.67.1.dev 2024-12-06 06:33:11 -08:00
Paul Gauthier
d44fd6b46d version bump to 0.67.0 2024-12-06 06:31:40 -08:00
Paul Gauthier
bd0a1426d7 copy 2024-12-06 06:31:30 -08:00
Paul Gauthier
353d144039 copy 2024-12-06 06:26:24 -08:00
Paul Gauthier
6efdf8a7f4 refactor: rename copypaste flag to copy-paste and update help text 2024-12-05 20:43:14 -08:00
Paul Gauthier
623770e24b refactor: move clipboard context functionality to commands.py 2024-12-05 20:41:40 -08:00
Paul Gauthier (aider)
402940a215 fix: store clipboard watcher instance in coder object 2024-12-05 20:36:04 -08:00
Paul Gauthier (aider)
7fea85cdcd style: reorder imports alphabetically 2024-12-05 20:35:51 -08:00
Paul Gauthier (aider)
93b3b7a184 feat: set auto-copy-context based on copypaste argument 2024-12-05 20:35:46 -08:00
Paul Gauthier
8f2a84629a refactor: move ClipboardWatcher import to top level 2024-12-05 20:35:44 -08:00
Paul Gauthier (aider)
7a1c1982f0 feat: implement auto copy context functionality 2024-12-05 20:35:04 -08:00
Paul Gauthier
75d8982b23 feat: add auto copy context feature with empty implementation 2024-12-05 20:35:02 -08:00
Paul Gauthier (aider)
87dbb56d7e style: fix trailing comma in system prompt dictionary 2024-12-05 18:57:50 -08:00
Paul Gauthier (aider)
aa217a3a43 fix: handle system reminder message construction properly 2024-12-05 18:57:47 -08:00
Paul Gauthier (aider)
22fc961dc0 fix: add empty list check before accessing last chat chunk 2024-12-05 18:57:24 -08:00
Paul Gauthier (aider)
8f57186945 style: remove trailing whitespace in editor_editblock_coder.py 2024-12-05 18:55:54 -08:00
Paul Gauthier (aider)
f8277c55a8 feat: add format_chat_markdown method to EditorEditBlockCoder 2024-12-05 18:55:50 -08:00
Paul Gauthier (aider)
6163713e34 style: fix linting issues in clipboard watcher initialization 2024-12-05 18:44:57 -08:00
Paul Gauthier (aider)
d2d5887936 feat: add clipboard watcher with --copypaste flag 2024-12-05 18:44:50 -08:00
Paul Gauthier (aider)
2a1065efc1 style: fix linting issues in copypaste.py 2024-12-05 18:43:16 -08:00
Paul Gauthier (aider)
6f36a97c4a feat: add clipboard watcher to monitor and update IO placeholder 2024-12-05 18:43:12 -08:00
Paul Gauthier
eeed79009a feat: add copypaste module for code manipulation 2024-12-05 18:43:09 -08:00
Paul Gauthier
9930057171 copy 2024-12-05 16:34:58 -08:00
Paul Gauthier (aider)
e14c84f2fb feat: add silent mode to read_text method 2024-12-05 16:22:44 -08:00
Paul Gauthier
a664c3dd47 feat: add silent mode option for read_text function 2024-12-05 16:22:42 -08:00
Paul Gauthier
73205b1f8c refactor: Move charset test to separate method in Spinner class 2024-12-05 14:57:13 -08:00
Paul Gauthier (aider)
3016d7b8f3 style: fix whitespace in utils.py 2024-12-05 14:46:37 -08:00
Paul Gauthier (aider)
beb3ddaa1f feat: add __main__ block to utils.py 2024-12-05 14:46:33 -08:00
Paul Gauthier
8db48fb4f1 refactor: simplify comment in utils.py 2024-12-05 14:46:31 -08:00
Paul Gauthier (aider)
6eb3641c1d feat: add main function with spinner demo 2024-12-05 14:45:50 -08:00
Paul Gauthier
8cfd64a7be chore: add comment for future spinner implementation 2024-12-05 14:45:47 -08:00
Paul Gauthier (aider)
e8d9ef269b style: fix linting issues in base_coder.py 2024-12-05 09:28:28 -08:00
Paul Gauthier (aider)
80f83da9b8 chore: remove debug dump() calls 2024-12-05 09:28:18 -08:00
Paul Gauthier
6b8e235f88 feat: add file watcher support to coder cloning 2024-12-05 09:28:16 -08:00
Paul Gauthier
a1d558a960 copy 2024-12-05 07:21:14 -08:00
Paul Gauthier
071ec80e2a copy 2024-12-05 07:06:43 -08:00
Paul Gauthier
995541db2e test: update GitHub Copilot model temperature test assertions 2024-12-05 07:04:17 -08:00
Paul Gauthier
9121026856 test: reorganize model test cases for better readability 2024-12-05 06:50:49 -08:00
Paul Gauthier (aider)
341419788e fix: update test to use correct temperature attribute name 2024-12-05 06:47:58 -08:00
Paul Gauthier (aider)
f8f69fadc4 style: Remove trailing whitespace in test_models.py 2024-12-05 06:47:33 -08:00
Paul Gauthier (aider)
4830d82a73 test: add temperature validation for GitHub Copilot models 2024-12-05 06:47:28 -08:00
Paul Gauthier
f3a228c79a feat: enable automatic exception capture in Posthog analytics 2024-12-04 19:55:56 -08:00
Paul Gauthier
4bf96aaca0 copy 2024-12-04 15:16:22 -08:00
Paul Gauthier
a8a026d509 copy 2024-12-04 15:10:21 -08:00
Paul Gauthier
e1fd506269 feat: add direct git diff output for pretty mode 2024-12-04 15:09:14 -08:00
Paul Gauthier
63e86b5673 copy 2024-12-04 14:27:53 -08:00
Paul Gauthier
238299c759 Add nova pro to leaderboard 2024-12-04 14:12:05 -08:00
Paul Gauthier
4e9272e31c copy 2024-12-04 14:09:01 -08:00
Paul Gauthier
8f92c32693 bumped deps to pickup litellm that supports bedrock nova 2024-12-04 14:06:27 -08:00
Paul Gauthier (aider)
699e283890 fix: add error handling for logfile writes in Analytics 2024-12-04 13:51:06 -08:00
Paul Gauthier
c51afc952c chore: add comment about ignoring OsErrors in analytics logging 2024-12-04 13:51:05 -08:00
Paul Gauthier
8fc030ba83 copy 2024-12-04 13:25:40 -08:00
Paul Gauthier
b754757c94 copy 2024-12-04 12:38:46 -08:00
Paul Gauthier (aider)
16bb40406a docs: add direct download link for watch demo video 2024-12-04 12:13:26 -08:00
Paul Gauthier (aider)
290ae04988 docs: add video demo of IDE watch mode functionality 2024-12-04 12:13:22 -08:00
Paul Gauthier
5c6f0e4d32 docs: add watch mode documentation 2024-12-04 12:13:20 -08:00
Paul Gauthier
14143243b1 test: remove mixpanel assertions from analytics tests 2024-12-04 11:58:35 -08:00
Paul Gauthier (aider)
0e2c0c78f2 style: fix indentation in analytics test file 2024-12-04 11:57:29 -08:00
Paul Gauthier
2a8e1f41d0 fix: Correct indentation in analytics test file 2024-12-04 11:57:26 -08:00
Paul Gauthier (aider)
4e1d18e206 style: remove unused Mixpanel import 2024-12-04 11:46:35 -08:00
Paul Gauthier
ff5a947a16 refactor: disable Mixpanel and add PostHog error handling 2024-12-04 11:46:27 -08:00
Paul Gauthier
26ddb1e479 prompt 2024-12-04 10:23:29 -08:00
Paul Gauthier
b2ddfd21c1 prompt 2024-12-04 10:20:18 -08:00
Paul Gauthier
efe9268bcb fix: add null check for filename in lint_edited method 2024-12-04 10:03:22 -08:00
Paul Gauthier
974e618541 refactor: remove debug prints and add lazy litellm loading verbosity flag 2024-12-04 09:38:20 -08:00
Paul Gauthier
d09d281a8d fix: update version file path and add debug logging for version checks 2024-12-04 09:09:56 -08:00
Paul Gauthier
43f3f54063 copy 2024-12-04 07:28:45 -08:00
Paul Gauthier
2b303e162c copy 2024-12-04 07:27:11 -08:00
Paul Gauthier
3947a755b1 initial 2024-12-04 07:27:09 -08:00
Paul Gauthier
0b764f4cb8 copy 2024-12-04 07:23:29 -08:00
Paul Gauthier
a0101c14a6 copy 2024-12-04 07:22:09 -08:00
Paul Gauthier
a4dcde2fc2 copy 2024-12-04 07:05:49 -08:00
Paul Gauthier (aider)
f6f5955753 style: fix whitespace in Spinner class 2024-12-04 07:04:04 -08:00
Paul Gauthier (aider)
d87f9fbd79 fix: add fallback to ASCII spinner when Unicode is not supported 2024-12-04 07:03:59 -08:00
Paul Gauthier
4c2bc47bf3 copy 2024-12-04 06:42:18 -08:00
Paul Gauthier
0d983d504b copy 2024-12-04 06:38:38 -08:00
Paul Gauthier (aider)
f26ccfa3e9 fix: preserve plus sign at end of line in chart labels 2024-12-04 06:31:56 -08:00
Paul Gauthier (aider)
1ec6ba35e0 feat: add linebreaks to x-axis labels using callback function 2024-12-04 06:25:32 -08:00
Paul Gauthier (aider)
0378ea40e7 style: fix import order and quote style 2024-12-04 06:20:01 -08:00
Paul Gauthier (aider)
656250dd33 feat: add ctrl-z support for process suspension 2024-12-04 06:19:56 -08:00
Paul Gauthier
b914fa6da8 copy 2024-12-03 19:00:41 -08:00
Paul Gauthier
db77ec43a7 copy 2024-12-03 19:00:28 -08:00
Paul Gauthier
1a9d4bfb1c initial 2024-12-03 18:51:03 -08:00
Paul Gauthier (aider)
7180cb049c feat: add QwQ to solo model color conditions in chart 2024-12-03 18:14:01 -08:00
Paul Gauthier
7e2769d8df fix: Update Qwen2.5 Coder model name in chart 2024-12-03 18:13:59 -08:00
Paul Gauthier (aider)
23faeeb5d0 style: update chart colors to include o1 models in solo category 2024-12-03 17:41:53 -08:00
Paul Gauthier (aider)
1e689a69a8 style: standardize legend text color to match chart defaults 2024-12-03 16:47:18 -08:00
Paul Gauthier (aider)
19004c0bad fix: consolidate datasets and add custom legend to prevent empty columns 2024-12-03 16:33:27 -08:00
Paul Gauthier (aider)
82059bb454 feat: add color-coded legend to chart for model types 2024-12-03 16:32:11 -08:00
Paul Gauthier (aider)
3fc846471e style: unify Qwen and Sonnet chart colors to green 2024-12-03 16:31:14 -08:00
Paul Gauthier (aider)
5379d45184 fix: correct color mapping for Qwen and Sonnet models in chart 2024-12-03 16:30:49 -08:00
Paul Gauthier
65b8bf6834 style: Update QWQ chart colors and font sizes 2024-12-03 16:30:47 -08:00
Paul Gauthier (aider)
107dfcac65 style: update Sonnet bar color to green in chart 2024-12-03 16:14:49 -08:00
Paul Gauthier (aider)
2a29d077ee feat: add distinct color for Qwen2.5 bar in chart 2024-12-03 16:11:54 -08:00
Paul Gauthier
3d7f1f39ce feat: add QWQ chart component for website visualization 2024-12-03 16:11:53 -08:00
Paul Gauthier
51c02da206 feat: add placeholder prompt when command fails with add flag 2024-12-03 08:43:54 -08:00
Paul Gauthier
16250e1b7c fix: Update model name assertion in test case 2024-12-03 08:35:38 -08:00
Paul Gauthier
3e02c5e4a8 copy 2024-12-03 08:28:32 -08:00
Paul Gauthier (aider)
40da942bfe fix: add expanduser() to properly handle tilde in paths 2024-12-03 08:25:58 -08:00
Paul Gauthier
44909912cd refactor: update GPT-4o model name to simpler format 2024-12-03 07:50:19 -08:00
Paul Gauthier
631ee98738 fix: add interactive flag to shell spawn in pexpect command 2024-12-03 07:45:46 -08:00
Paul Gauthier (aider)
0b68eea44a ci: add scheduled workflow to process GitHub issues every 12 hours 2024-12-03 06:53:40 -08:00
Paul Gauthier (aider)
47743e7f90 fix: add missing os import in test_browser.py 2024-12-02 17:56:50 -08:00
Paul Gauthier
b2da3545f9 test: disable analytics in test environment 2024-12-02 17:56:45 -08:00
Paul Gauthier
fb005dd01b fix: improve AI comment detection with case-insensitive matching 2024-12-02 08:57:50 -08:00
Paul Gauthier
5b2bd90071 fix: ensure consistent handling of "ai!" comment detection 2024-12-02 07:26:51 -08:00
Paul Gauthier
25e258e26a copy 2024-12-02 06:54:30 -08:00
Paul Gauthier (aider)
75d24974ec style: fix linting issues in watch.py 2024-12-01 18:25:23 -08:00
Paul Gauthier (aider)
981bd950da feat: add support for -- style comments in file watcher 2024-12-01 18:25:18 -08:00
Paul Gauthier
0ca1886695 refactor: add comment marker for AI-related code section 2024-12-01 18:25:17 -08:00
Paul Gauthier
bf2f9e0f7e add watchfiles dep 2024-12-01 16:44:57 -08:00
Paul Gauthier
d74f1c22ff un-format the py fixture 2024-12-01 16:27:10 -08:00
Paul Gauthier
882e09f253 copy 2024-12-01 15:57:41 -08:00
Paul Gauthier
ce05c0e13d refactor: remove unused FileWatcher import 2024-12-01 15:31:54 -08:00
Paul Gauthier (aider)
45c92f0868 style: add noqa comment to silence unused import warning 2024-12-01 15:31:38 -08:00
Paul Gauthier
e952f90b4c style: remove noqa comment from FileWatcher import 2024-12-01 15:31:28 -08:00
Paul Gauthier
97bf5e8d69 fix: improve AI comment detection accuracy in FileWatcher 2024-12-01 15:26:45 -08:00
Paul Gauthier (aider)
ee7bb71a05 style: fix import order and remove extra blank lines 2024-12-01 15:25:52 -08:00
Paul Gauthier (aider)
791cbab6f6 refactor: use get_ai_comments() instead of duplicating pattern matching 2024-12-01 15:25:47 -08:00
Paul Gauthier
e001b7fb46 fix: improve AI comment regex pattern to match end of line 2024-12-01 15:25:46 -08:00
Paul Gauthier (aider)
d8a75bef48 fix: update test to count unique AI comments instead of raw lines 2024-12-01 10:30:57 -08:00
Paul Gauthier (aider)
cfc4b79a05 style: fix whitespace in test_watch.py 2024-12-01 10:29:35 -08:00
Paul Gauthier (aider)
fb3e5c9aab test: add minimal coder instance for FileWatcher test 2024-12-01 10:29:32 -08:00
Paul Gauthier (aider)
6796d8f124 style: fix linting issues in test_watch.py 2024-12-01 10:28:32 -08:00
Paul Gauthier (aider)
154cb463e5 refactor: update test to use get_ai_comments method 2024-12-01 10:28:29 -08:00
Paul Gauthier (aider)
e9ce04ffe9 style: Fix linting issues in test_watch.py 2024-12-01 10:04:40 -08:00
Paul Gauthier (aider)
7a3fd11b6b refactor: update test to read AI comments from fixture files 2024-12-01 10:04:37 -08:00
Paul Gauthier (aider)
e885f848a6 fix: remove unused Path import from test_watch.py 2024-12-01 10:03:15 -08:00
Paul Gauthier (aider)
8343f074a2 style: fix trailing whitespace in test file 2024-12-01 10:02:57 -08:00
Paul Gauthier (aider)
cbadfd59db test: add JavaScript fixture and update comment pattern tests 2024-12-01 10:02:53 -08:00
Paul Gauthier (aider)
5d5fed62f2 style: Fix linting issues in test_watch.py 2024-12-01 10:01:59 -08:00
Paul Gauthier (aider)
c3d6484f6c test: add test cases for AI comment pattern matching 2024-12-01 10:01:53 -08:00
Paul Gauthier
315abec49c test: add watch module tests and fixtures 2024-12-01 10:01:52 -08:00
Paul Gauthier
221b382e69 refactor: improve AI comment pattern regex for better matching 2024-12-01 09:58:02 -08:00
Paul Gauthier (aider)
5fdbfef028 style: sort imports alphabetically in watch.py 2024-12-01 09:50:54 -08:00
Paul Gauthier (aider)
2cc671df75 refactor: update regex to only match ai comments at end of line 2024-12-01 09:50:50 -08:00
Paul Gauthier
ddbe2853ea refactor: improve AI comment processing in FileWatcher 2024-12-01 09:50:49 -08:00
Paul Gauthier (aider)
2ab1b4b1c2 style: fix linting issues and add missing newline 2024-12-01 09:43:47 -08:00
Paul Gauthier (aider)
c5adc92f8b chore: remove unnecessary comment from io.py 2024-12-01 09:43:43 -08:00
Paul Gauthier
96b6056411 chore: remove unused comment in io.py 2024-12-01 09:43:42 -08:00
Paul Gauthier (aider)
1108566e99 style: fix linting error by adding newline before error handling 2024-12-01 09:41:17 -08:00
Paul Gauthier (aider)
a54a5ee80d chore: remove comment from error handling block 2024-12-01 09:41:12 -08:00
Paul Gauthier
d57bc3ff01 chore: remove unused comment in io.py 2024-12-01 09:41:11 -08:00
Paul Gauthier (aider)
f02dca2dd8 style: fix linting error by adding newline before error handling 2024-12-01 09:40:25 -08:00
Paul Gauthier (aider)
ad186701d3 feat: add traceback printing for better error handling 2024-12-01 09:40:20 -08:00
Paul Gauthier
a04b9ea053 fix: handle file watcher operations only when it exists 2024-12-01 09:40:19 -08:00
Paul Gauthier
41e6fb961b feat: disable watch-files by default and update help text 2024-12-01 09:35:28 -08:00
Paul Gauthier (aider)
b2b43d2bd3 fix: only initialize FileWatcher when watch_files flag is set 2024-12-01 09:34:40 -08:00
Paul Gauthier
90339f9741 refactor: make FileWatcher initialization conditional on --watch-files flag 2024-12-01 09:34:39 -08:00
Paul Gauthier (aider)
260806053b style: fix linting issues and whitespace in args.py 2024-12-01 09:34:03 -08:00
Paul Gauthier (aider)
93c9bdcec7 feat: add --watch-files switch to control FileWatcher 2024-12-01 09:33:58 -08:00
Paul Gauthier
935832028a feat: add --watch-files switch for FileWatcher control 2024-12-01 09:33:56 -08:00
Paul Gauthier
c08f09b06b Merge branch 'main' into watch 2024-12-01 09:24:49 -08:00
Paul Gauthier
16410cf263 copy 2024-12-01 09:23:13 -08:00
Paul Gauthier
c62dde4c9c set version to 0.66.1.dev 2024-12-01 09:15:58 -08:00
Paul Gauthier
3fef1babcb version bump to 0.66.0 2024-12-01 09:14:21 -08:00
Paul Gauthier
59af7ed3bb refactor: improve file path handling and remove debug code 2024-12-01 08:27:15 -08:00
Paul Gauthier (aider)
ee4206099a chore: remove AI comment from watch.py 2024-12-01 08:26:39 -08:00
Paul Gauthier
8c1d9bffcd style: standardize AI comment format in watch.py 2024-12-01 08:26:38 -08:00
Paul Gauthier
a3a510308c style: fix indentation in comment instructions template 2024-12-01 08:26:21 -08:00
Paul Gauthier (aider)
97e292e251 chore: remove AI comment from FileWatcher class 2024-12-01 08:25:39 -08:00
Paul Gauthier
4c5aa6a326 chore: remove unused comment in FileWatcher class 2024-12-01 08:25:37 -08:00
Paul Gauthier (aider)
d1dd40590f feat: use TreeContext to show AI comments in file context 2024-12-01 08:25:06 -08:00
Paul Gauthier
c4764fa4d8 refactor: Add TODO for TreeContext-based comment rendering 2024-12-01 08:25:04 -08:00
Paul Gauthier (aider)
5dedb39048 chore: remove AI comment from FileWatcher class 2024-12-01 08:24:14 -08:00
Paul Gauthier
bc759a32e3 style: improve comment clarity in FileWatcher class 2024-12-01 08:24:13 -08:00
Paul Gauthier (aider)
dcc0841443 style: remove unused exception variable in FileWatcher 2024-12-01 08:23:51 -08:00
Paul Gauthier (aider)
9b0388d00a chore: remove AI-related comments from code 2024-12-01 08:23:36 -08:00
Paul Gauthier
99a1e42381 refactor: improve AI comment detection and file handling 2024-12-01 08:23:35 -08:00
Paul Gauthier
9b4df54432 refactor: simplify file change handling and interrupt logic 2024-12-01 08:14:18 -08:00
Paul Gauthier (aider)
aac0c0f037 feat: extend AI comment regex to match "ai!" suffix 2024-12-01 08:11:08 -08:00
Paul Gauthier
a8f20196b2 feat: extend AI comment regex to match 'ai!' suffix 2024-12-01 08:11:07 -08:00
Paul Gauthier (aider)
a8bae3fb01 style: format gitignore path loading for better readability 2024-12-01 08:09:16 -08:00
Paul Gauthier (aider)
e8ccc030c0 refactor: simplify file watcher filter function implementation 2024-12-01 08:09:13 -08:00
Paul Gauthier
aa6d9779d3 refactor: simplify gitignore filter function creation 2024-12-01 08:08:54 -08:00
Paul Gauthier (aider)
b1dbf340b8 fix: correct undefined filter_func and remove unnecessary f-string 2024-12-01 08:07:48 -08:00
Paul Gauthier (aider)
27540d16ed refactor: remove ignore_func parameter from FileWatcher.start() 2024-12-01 08:07:21 -08:00
Paul Gauthier
2e63f62215 refactor: remove unused ignore_func parameter from FileWatcher.start method 2024-12-01 08:07:20 -08:00
Paul Gauthier (aider)
633ba293a3 style: remove extra whitespace and newlines 2024-12-01 08:06:24 -08:00
Paul Gauthier (aider)
679c960ea1 refactor: move filter_func creation to FileWatcher.__init__ 2024-12-01 08:06:20 -08:00
Paul Gauthier
cf91101a48 refactor: simplify file watcher and improve AI comment handling 2024-12-01 08:06:18 -08:00
Paul Gauthier (aider)
344d90aea0 style: fix whitespace in FileWatcher class 2024-12-01 07:55:43 -08:00
Paul Gauthier (aider)
8b7fa6f845 refactor: move bang checking logic earlier in file processing flow 2024-12-01 07:55:39 -08:00
Paul Gauthier
2eb7f78248 refactor: Move bang check logic to file change detection 2024-12-01 07:55:38 -08:00
Paul Gauthier (aider)
9a5925b1ad refactor: fix has_bangs initialization and use |= operator 2024-12-01 07:54:44 -08:00
Paul Gauthier
60f2da370f fix: correct comment about AI bang operator logic 2024-12-01 07:54:42 -08:00
Paul Gauthier (aider)
7ee69628a3 refactor: update get_ai_comments to return line nums, comments and bang status 2024-12-01 07:54:11 -08:00
Paul Gauthier
a64f14db51 refactor: modify get_ai_comments to return line nums, comments and has_bang 2024-12-01 07:54:09 -08:00
Paul Gauthier (aider)
1c84fc97a1 refactor: remove try/except block and AI comment from watch.py 2024-12-01 07:52:47 -08:00
Paul Gauthier
8b371ead92 refactor: remove unnecessary try/except block in FileWatcher 2024-12-01 07:50:17 -08:00
Paul Gauthier (aider)
14417f70af style: fix linting issue in list comprehension spacing 2024-12-01 07:49:17 -08:00
Paul Gauthier (aider)
96c6d408fb refactor: simplify get_ai_comments to return only line numbers and bang status 2024-12-01 07:49:14 -08:00
Paul Gauthier
cd922e919e refactor: simplify get_ai_comments to return only line numbers and bang status 2024-12-01 07:49:11 -08:00
Paul Gauthier (aider)
c56f06fbcb style: fix string quote consistency in comment parsing 2024-12-01 07:48:39 -08:00
Paul Gauthier (aider)
21dffa26b9 refactor: rename and enhance get_ai_comments to track line numbers and bang status 2024-12-01 07:48:35 -08:00
Paul Gauthier
a131d5ad35 refactor: simplify AI comment detection and improve comment handling 2024-12-01 07:48:33 -08:00
Paul Gauthier (aider)
b5dbb1d39d refactor: simplify file content check using direct io.read_text and regex search 2024-12-01 07:28:37 -08:00
Paul Gauthier
bd3231d8dd refactor: add comment about using io.read_text for AI marker detection 2024-12-01 07:28:35 -08:00
Paul Gauthier (aider)
4d96de3514 refactor: compile regex pattern as class attribute for better performance 2024-12-01 07:26:23 -08:00
Paul Gauthier
c9df6c11c5 refactor: extract regex pattern into compiled class attribute 2024-12-01 07:26:21 -08:00
Paul Gauthier (aider)
56aaa08224 refactor: use get_ai_comment method instead of direct regex matching 2024-12-01 07:25:51 -08:00
Paul Gauthier
014aeccde6 style: add comment to use self.ai_comments() method 2024-12-01 07:25:50 -08:00
Paul Gauthier (aider)
dcfa993806 feat: implement AI comment refresh and processing in FileWatcher 2024-12-01 07:24:55 -08:00
Paul Gauthier
69688cffd6 refactor: Add placeholder for AI comments refresh in FileWatcher 2024-12-01 07:24:53 -08:00
Paul Gauthier (aider)
769a31b7e3 refactor: remove redundant encoding parameter from FileWatcher 2024-12-01 07:22:40 -08:00
Paul Gauthier (aider)
78c20a8c25 style: fix linting issues in watch.py 2024-12-01 07:22:16 -08:00
Paul Gauthier (aider)
bb1b3fdca1 refactor: replace file operations with io.read_text() 2024-12-01 07:22:12 -08:00
Paul Gauthier
f872b20a97 refactor: improve file watcher change detection and comment handling 2024-12-01 07:22:11 -08:00
Paul Gauthier (aider)
f36239712f refactor: replace global VERBOSE with instance variable in FileWatcher 2024-12-01 06:13:01 -08:00
Paul Gauthier
74108dd680 Merge branch 'main' into watch 2024-12-01 06:09:21 -08:00
Paul Gauthier
16af1751a6 copy 2024-12-01 06:09:11 -08:00
Paul Gauthier
b0e138952e libportaudio2 2024-12-01 06:06:42 -08:00
Paul Gauthier (aider)
1271c037ef ci: add PortAudio system dependency for Ubuntu tests 2024-12-01 06:06:03 -08:00
Paul Gauthier
36b59ba617 copy 2024-12-01 06:04:49 -08:00
Paul Gauthier (aider)
b671db7108 fix: correct sounddevice module mocking in voice tests 2024-11-30 19:15:58 -08:00
Paul Gauthier (aider)
9304b80b69 fix: update sounddevice mocking in voice tests 2024-11-30 19:15:40 -08:00
Paul Gauthier (aider)
03c2964364 style: Format code with black and sort imports 2024-11-30 19:15:20 -08:00
Paul Gauthier (aider)
49c78f2797 test: update voice tests to mock audio dependencies properly 2024-11-30 19:15:16 -08:00
Paul Gauthier
1a8d112055 copy 2024-11-30 18:38:40 -08:00
Paul Gauthier (aider)
7b193d693f docs: clarify Control-Up/Down for message history navigation 2024-11-30 18:23:34 -08:00
Paul Gauthier (aider)
e8fa5c36c2 feat: add ctrl-up/down bindings for history navigation 2024-11-30 18:21:47 -08:00
Paul Gauthier
c9a27ba6ac Merge branch 'main' into watch 2024-11-30 15:48:19 -08:00
Paul Gauthier (aider)
a6e162c37a refactor: remove unused Mock import from test_voice.py 2024-11-30 15:43:18 -08:00
Paul Gauthier (aider)
9c55b7a317 style: Remove extra blank line in test_voice.py 2024-11-30 15:43:13 -08:00
Paul Gauthier (aider)
4ef4e8cd72 test: remove test_record_and_transcribe test case 2024-11-30 15:43:10 -08:00
Paul Gauthier (aider)
e9942737c6 style: remove trailing whitespace in test_voice.py 2024-11-30 15:42:45 -08:00
Paul Gauthier (aider)
5c208dba41 fix: improve voice test mocking to handle async prompt behavior 2024-11-30 15:42:42 -08:00
Paul Gauthier (aider)
ba032ce60e fix: update voice tests to match expected behavior 2024-11-30 15:42:12 -08:00
Paul Gauthier (aider)
2fe0dda8af style: remove unused tempfile import from test_voice.py 2024-11-30 15:41:38 -08:00
Paul Gauthier (aider)
97daff4a10 style: format test_voice.py with black and sort imports 2024-11-30 15:41:19 -08:00
Paul Gauthier (aider)
caeceb58a5 test: add voice input device tests with mocked hardware dependencies 2024-11-30 15:41:15 -08:00
Paul Gauthier
3739d48e52 test: add basic voice tests 2024-11-30 15:41:11 -08:00
Paul Gauthier
858fdb02ec copy 2024-11-30 14:05:51 -08:00
Paul Gauthier (aider)
b0cbb071e6 style: fix line wrapping in update-history.py 2024-11-30 14:01:25 -08:00
Paul Gauthier (aider)
f222739b0d fix: preserve older entries when updating HISTORY.md 2024-11-30 14:01:21 -08:00
Paul Gauthier (aider)
a280f5d5b2 style: remove trailing whitespace in update-history.py 2024-11-30 13:59:57 -08:00
Paul Gauthier (aider)
cef333a01c feat: extract history content up to end of base version section 2024-11-30 13:59:51 -08:00
Paul Gauthier (aider)
24bd016a1a style: Fix whitespace in update-history script 2024-11-30 13:59:09 -08:00
Paul Gauthier (aider)
3c44f824cb refactor: optimize HISTORY.md processing to work with relevant portion only 2024-11-30 13:59:05 -08:00
Paul Gauthier
3ee78ef557 skip ph.shutdown for faster exit 2024-11-30 13:29:39 -08:00
Paul Gauthier
d9b1bcbdcc remove no-op vscode detection 2024-11-30 13:25:13 -08:00
Paul Gauthier
283dd0b1f1 test: refactor read-only file path handling in command tests 2024-11-30 13:18:49 -08:00
Paul Gauthier (aider)
56345ddef9 test: add cross-platform test for relative path handling in drop command 2024-11-30 13:15:19 -08:00
Paul Gauthier (aider)
4631008f8c style: fix whitespace in commands.py 2024-11-30 13:12:37 -08:00
Paul Gauthier (aider)
e2ebde75be fix: improve /drop handling of relative paths with samefile check 2024-11-30 13:12:31 -08:00
Paul Gauthier
91613fcbf7 copy 2024-11-30 13:07:58 -08:00
Paul Gauthier
0b279143cc copy 2024-11-30 13:03:28 -08:00
Paul Gauthier
ade4847c61 feat: add timeout configuration for litellm requests 2024-11-30 13:03:20 -08:00
Paul Gauthier (aider)
a3e7203331 refactor: change timeout argument type from float to int 2024-11-30 13:00:24 -08:00
Paul Gauthier (aider)
bbabd38a48 feat: add timeout option for API calls 2024-11-30 12:59:39 -08:00
Paul Gauthier
eb996c1e42 copy 2024-11-30 12:19:55 -08:00
Paul Gauthier
bf0ad4cda1 test: simplify browser flag test by removing analytics flags 2024-11-30 12:18:18 -08:00
Paul Gauthier (aider)
c32af6536a ci: add fetch-depth: 0 to all checkout actions 2024-11-30 12:16:34 -08:00
Paul Gauthier (aider)
2437f9b051 chore: update actions/checkout to v4 in pages workflow 2024-11-30 12:16:07 -08:00
Paul Gauthier
0b781174bd ci: remove redundant AIDER_ANALYTICS_LOG environment variable 2024-11-30 11:37:33 -08:00
Paul Gauthier
f448d3e2db chore: add pytest-env and remove debug dump from tests 2024-11-30 11:35:40 -08:00
Paul Gauthier (aider)
6b4222ec48 test: add verification for pytest.ini environment variables 2024-11-30 11:32:49 -08:00
Paul Gauthier
3f770cc5c0 test: remove analytics env vars and add debug dump 2024-11-30 11:32:48 -08:00
Paul Gauthier (aider)
14902f5b9a ci: add analytics env vars to GitHub Actions workflows 2024-11-30 11:25:39 -08:00
Paul Gauthier (aider)
efdeb13bf5 test: disable analytics during test execution 2024-11-30 11:24:46 -08:00
Paul Gauthier
62558291b6 test: disable analytics in test environment 2024-11-30 10:59:46 -08:00
Paul Gauthier
edb0120bbf test: add analytics flags to browser test 2024-11-30 10:58:06 -08:00
Paul Gauthier
0dbaec553f refactor: Improve version handling and cleanup version-related files 2024-11-30 10:10:03 -08:00
Paul Gauthier
295040c94c feat: add exit event tracking for Control-C and /exit commands 2024-11-30 09:53:44 -08:00
Paul Gauthier
c1c4193b1d feat: add event tracking for message sending lifecycle 2024-11-30 09:49:07 -08:00
Paul Gauthier
d17f0a9e1f copy 2024-11-30 09:45:17 -08:00
Paul Gauthier
871030dadb fix: normalize path in cmd_drop test for cross-platform compatibility 2024-11-30 09:36:21 -08:00
Paul Gauthier
0ee9b74c0f Merge branch 'main' of github.com:Aider-AI/aider 2024-11-30 09:33:06 -08:00
paul-gauthier
82929f650c Merge pull request #2497 from preynal/main
feat: ability to select audio input device
2024-11-30 09:33:00 -08:00
Paul Gauthier
37b31c46bd copy 2024-11-30 09:19:22 -08:00
Paul Gauthier
c682bd858a copy 2024-11-30 09:19:01 -08:00
Paul Gauthier
2439891ee0 better handle __version__ errors 2024-11-30 09:18:17 -08:00
Philippe de Reynal
23825cafe7 fix options diff + missing docs 2024-11-30 11:33:10 +01:00
Philippe de Reynal
a8f6f1fce2 Merge branch 'Aider-AI:main' into main 2024-11-30 11:24:58 +01:00
Philippe de Reynal
e11faadf39 feat: ability to select audio input device 2024-11-30 11:24:34 +01:00
Paul Gauthier
2c7251f4b9 copy 2024-11-29 09:23:57 -08:00
Paul Gauthier
fb9f18fc9c copy 2024-11-29 09:23:14 -08:00
Paul Gauthier (aider)
93cd3d0d8b feat: add git diff output to history update script 2024-11-29 09:23:01 -08:00
Paul Gauthier
ed2479ea82 refactor: consolidate analytics exit events in main function 2024-11-29 09:20:52 -08:00
Paul Gauthier (aider)
accde0bfd0 feat: add analytics events before each return statement in main() 2024-11-29 09:17:16 -08:00
Paul Gauthier
7b34d9e4f4 copy 2024-11-28 15:53:00 -08:00
Paul Gauthier (aider)
6af71951af style: fix whitespace in benchmark.py 2024-11-28 14:01:50 -08:00
Paul Gauthier (aider)
3eed45dc3e fix: improve benchmark directory selection based on latest .md file timestamp 2024-11-28 14:01:45 -08:00
Paul Gauthier (aider)
320b059bc7 perf: optimize benchmark dir search by filtering on timestamp first 2024-11-28 14:00:12 -08:00
Paul Gauthier
a89ce06377 fix: correct glob pattern for finding latest benchmark directory 2024-11-28 14:00:10 -08:00
Paul Gauthier
e4a1d6fe89 copy 2024-11-28 11:21:37 -08:00
Paul Gauthier
93c625bb81 Merge branch 'main' of github.com:Aider-AI/aider 2024-11-28 11:19:19 -08:00
Paul Gauthier
87f84fb82d copy 2024-11-28 11:18:30 -08:00
paul-gauthier
ce9e76a7dc Merge pull request #2489 from itlackey/benchmark/20241127
Benchmark/20241127
2024-11-28 11:01:54 -08:00
Paul Gauthier
4f3f1c5e23 better 2024-11-28 10:51:53 -08:00
itlackey
22076d401f Added ollama/granite3-dense:8b 2024-11-28 10:49:51 -06:00
itlackey
79ea82f147 Updated ollama/qwen2.5-coder:32b, added ollama/tulu3 2024-11-28 10:49:50 -06:00
Paul Gauthier
3785415632 copy 2024-11-27 17:49:35 -08:00
Paul Gauthier
35eda73ad1 Merge branch 'main' of github.com:Aider-AI/aider 2024-11-27 17:49:22 -08:00
Paul Gauthier (aider)
c8282fc8d3 style: fix whitespace in test_commands.py 2024-11-27 17:39:00 -08:00
Paul Gauthier (aider)
5030881934 test: add tests for /drop command with and without glob patterns 2024-11-27 17:38:54 -08:00
Paul Gauthier (aider)
bc1e3a7059 style: format list comprehension to single line 2024-11-27 17:35:11 -08:00
Paul Gauthier (aider)
ba17dceb4d feat: make /drop use substring matching for non-glob patterns 2024-11-27 17:35:05 -08:00
Paul Gauthier (aider)
4e689e20e9 style: add noqa comment to silence flake8 warning for FileWatcher import 2024-11-27 17:32:22 -08:00
Paul Gauthier
2f78b6f7f3 refactor: move FileWatcher initialization to main.py 2024-11-27 17:32:12 -08:00
Paul Gauthier (aider)
920917a47e feat: add .aider* to default gitignore patterns 2024-11-27 17:28:39 -08:00
Paul Gauthier
c1a7784781 fix: update file watcher to use absolute paths for changed files 2024-11-27 17:28:37 -08:00
paul-gauthier
62109f4ab1 Merge pull request #2480 from itlackey/benchmark/ollama-qwen2.5-14b 2024-11-27 16:51:50 -08:00
Paul Gauthier (aider)
c3a9c05455 fix: convert absolute paths to relative paths in file watcher 2024-11-27 16:31:48 -08:00
Paul Gauthier
333e4aa362 fix: update comment about relative filenames in FileWatcher 2024-11-27 16:31:41 -08:00
Paul Gauthier (aider)
59ce26f28a feat: update coder tracked files when AI comments detected 2024-11-27 16:31:19 -08:00
Paul Gauthier
2ff63aaebf refactor: simplify file change handling in FileWatcher 2024-11-27 16:31:18 -08:00
Paul Gauthier (aider)
8cf72a4409 refactor: simplify directory handling in FileWatcher class 2024-11-27 16:29:26 -08:00
Paul Gauthier
496b92536f feat: add input interruption on file changes in FileWatcher 2024-11-27 16:29:24 -08:00
Paul Gauthier (aider)
ac7900ecd7 style: sort imports alphabetically in main.py 2024-11-27 16:23:01 -08:00
Paul Gauthier (aider)
310832f111 feat: add FileWatcher import to fix undefined name error 2024-11-27 16:22:57 -08:00
Paul Gauthier
f69dd0ef8d fix: correct aiderignore path handling for file watching 2024-11-27 16:22:55 -08:00
Paul Gauthier (aider)
4b51bb2334 feat: add aiderignore support to FileWatcher initialization 2024-11-27 16:22:08 -08:00
Paul Gauthier
0d4f9f00ee refactor: Improve FileWatcher initialization with gitignore handling 2024-11-27 16:22:07 -08:00
Paul Gauthier (aider)
4a0100271f refactor: conditionally use git root and gitignore in FileWatcher initialization 2024-11-27 16:19:55 -08:00
Paul Gauthier
52a467806a feat: add gitignore support to FileWatcher initialization 2024-11-27 16:19:53 -08:00
Paul Gauthier (aider)
0fedecff58 refactor: move gitignores from FileWatcher.start() to constructor 2024-11-27 16:16:02 -08:00
Paul Gauthier
da4cb0aa62 refactor: move gitignore handling from start() to FileWatcher constructor 2024-11-27 16:16:00 -08:00
Paul Gauthier
3b8a771909 refactor: Move FileWatcher initialization to __init__ method 2024-11-27 16:15:08 -08:00
Paul Gauthier (aider)
f9bcfa14e0 refactor: update file watcher to use class-based implementation 2024-11-27 16:13:42 -08:00
Paul Gauthier (aider)
11c2eab967 style: fix code formatting and whitespace 2024-11-27 16:13:07 -08:00
Paul Gauthier (aider)
094d2e12a4 refactor: create FileWatcher class to encapsulate file watching logic 2024-11-27 16:13:00 -08:00
Paul Gauthier
af195a610c refactor: consolidate file watching code into dedicated class 2024-11-27 16:12:59 -08:00
Paul Gauthier
f7a05cf077 Merge branch 'main' into watch 2024-11-27 15:55:01 -08:00
Paul Gauthier
d54fbd6592 copy 2024-11-27 15:23:13 -08:00
Paul Gauthier
41b0868165 Merge branch 'main' into watch 2024-11-27 15:04:26 -08:00
Paul Gauthier
a1f5bfb746 copy 2024-11-27 09:36:17 -08:00
Paul Gauthier
3ab1018c66 copy 2024-11-27 09:29:35 -08:00
Paul Gauthier
62e96372fa bumped deps to pickup grep-ast 0.4.1 and disable Dart 2024-11-27 09:29:22 -08:00
Paul Gauthier
945d10f554 add event for repo size 2024-11-27 09:27:23 -08:00
Paul Gauthier
ee837889db Merge branch 'main' into ts-pack 2024-11-27 08:54:03 -08:00
Paul Gauthier
a5f4cba72f wip 2024-11-27 08:53:41 -08:00
Paul Gauthier
f44e5ae5f9 cleanup 2024-11-27 07:46:47 -08:00
Paul Gauthier
a67b665846 copy 2024-11-27 07:37:33 -08:00
Paul Gauthier
8fb23b414c rename 2024-11-27 07:18:21 -08:00
Paul Gauthier (aider)
f5100626a8 refactor: update language file extensions and paths in test code 2024-11-27 07:18:04 -08:00
Paul Gauthier (aider)
9ab46fade7 style: fix linting issues in test_repomap.py 2024-11-27 07:11:49 -08:00
Paul Gauthier (aider)
2ce01b157b refactor: simplify language test map and read from fixture files 2024-11-27 07:11:45 -08:00
itlackey
f714e42e11 Added qwen2.5-coder:14b running via ollama 2024-11-27 09:11:33 -06:00
Paul Gauthier (aider)
447b7af573 refactor: use fixture file for Java test instead of embedded code 2024-11-27 07:10:38 -08:00
Paul Gauthier (aider)
ec2b635a1a refactor: use fixture files for C, C++, and Elixir test content 2024-11-27 07:09:28 -08:00
Paul Gauthier (aider)
7465b4bf91 refactor: move TypeScript and TSX test code to fixture files 2024-11-27 07:06:50 -08:00
Paul Gauthier (aider)
4580fac6fa refactor: move test code samples to fixture files 2024-11-27 07:05:36 -08:00
Paul Gauthier (aider)
8c218e9edc refactor: move remaining language examples to fixture files 2024-11-27 07:05:10 -08:00
Paul Gauthier (aider)
44ceb8f1a0 style: Fix import order and add proper line spacing 2024-11-27 07:04:29 -08:00
Paul Gauthier (aider)
642c1c50fb refactor: move remaining test examples to fixture files 2024-11-27 07:04:23 -08:00
Paul Gauthier (aider)
4de8c25a3f refactor: move language examples to fixture files 2024-11-27 07:03:20 -08:00
Paul Gauthier
565f08a8e9 refactor: clean up test cases and remove redundant language examples 2024-11-27 07:03:18 -08:00
Paul Gauthier (aider)
a85ae206c9 refactor: add initial language test fixtures for C, C++, Elixir and Java 2024-11-27 06:59:58 -08:00
Paul Gauthier (aider)
9e9b5e8d46 feat: enhance language test snippets with comprehensive examples 2024-11-27 06:58:15 -08:00
Paul Gauthier
b623141a8f refactor: reorder test language cases in repomap tests 2024-11-27 06:58:13 -08:00
Paul Gauthier (aider)
631cdc37c4 test: enhance C# test case with more language features and symbols 2024-11-27 06:56:16 -08:00
Paul Gauthier
8d50bc0ef1 fix: correct key symbol in TypeScript test from UserGreeting to UserProps 2024-11-27 06:56:15 -08:00
Paul Gauthier (aider)
ae395fbb8f test: enhance TSX test fixture with more symbols and hooks 2024-11-27 06:54:37 -08:00
Paul Gauthier (aider)
10877a99f1 test: enhance Rust test snippet with trait and struct examples 2024-11-27 06:53:41 -08:00
Paul Gauthier (aider)
0faff91c72 test: enhance Python test case with class and type annotations 2024-11-27 06:52:31 -08:00
Paul Gauthier (aider)
00f79fecd0 test: enhance OCaml test case with module and type definitions 2024-11-27 06:51:53 -08:00
Paul Gauthier (aider)
203128d935 test: enhance Java test case with interface and implementation 2024-11-27 06:51:22 -08:00
Paul Gauthier
4f6e52aed0 test: add assertion for minimum result length in repomap test 2024-11-27 06:51:20 -08:00
Paul Gauthier (aider)
7bc7b2e3da style: Fix line length violations in test_repomap.py 2024-11-27 06:48:17 -08:00
Paul Gauthier (aider)
27f0ca3b08 feat: enhance JavaScript test snippet with class and module exports 2024-11-27 06:48:12 -08:00
Paul Gauthier
2337b2bb3e test: refactor repo map language test to run each language separately 2024-11-27 06:48:10 -08:00
Paul Gauthier (aider)
48ea13e130 style: format code with black and add trailing commas 2024-11-27 06:23:25 -08:00
Paul Gauthier (aider)
5c73ab26c0 test: add key symbol checks for each language parser 2024-11-27 06:23:21 -08:00
Paul Gauthier
947e4ce71d copy 2024-11-26 20:43:09 -08:00
Paul Gauthier (aider)
200295e3ee fix: add error handling for input history file permissions 2024-11-26 20:41:59 -08:00
Paul Gauthier (aider)
ded5fe5ec0 style: remove trailing whitespace in analytics.py 2024-11-26 20:37:34 -08:00
Paul Gauthier (aider)
7dffa943fa fix: handle analytics file access errors gracefully 2024-11-26 20:37:29 -08:00
Paul Gauthier
f702f67e27 copy 2024-11-26 20:28:48 -08:00
Paul Gauthier
a64956406d fix: improve PDF support detection and update model suggestions 2024-11-26 20:26:44 -08:00
Paul Gauthier
9c8bde2cff copy 2024-11-26 20:13:33 -08:00
Paul Gauthier
70a282ebf1 copy 2024-11-26 20:11:12 -08:00
Paul Gauthier (aider)
415652d38e style: reorder subprocess args to keep cwd consistent 2024-11-26 19:55:07 -08:00
Paul Gauthier (aider)
1a745e4fa9 fix: set cwd to repo root for shell commands in cmd_run 2024-11-26 19:53:09 -08:00
Paul Gauthier (aider)
973e86df27 fix: use cwd=root when executing shell commands 2024-11-26 19:52:46 -08:00
Paul Gauthier (aider)
1f2917681f feat: add cwd parameter to run_cmd for directory control 2024-11-26 19:52:06 -08:00
Paul Gauthier (aider)
28d1feacf5 refactor: simplify image file processing to use provided filenames directly 2024-11-26 19:49:53 -08:00
Paul Gauthier (aider)
cf4ef8605d style: remove trailing whitespace in base_coder.py 2024-11-26 19:48:48 -08:00
Paul Gauthier (aider)
4be3728273 feat: add image file support for read-only files 2024-11-26 19:48:42 -08:00
Paul Gauthier (aider)
34b8c3f47c fix: add dummy message to prevent empty cur_messages in test 2024-11-26 19:46:51 -08:00
Paul Gauthier (aider)
309893fd1e test: verify image file presence in LLM messages for read-only command 2024-11-26 19:45:01 -08:00
Paul Gauthier
705eb06e8d copy 2024-11-26 17:28:15 -08:00
Paul Gauthier
5cfcf255e9 fix: override PDF support detection for Claude 3.5 Sonnet 2024-11-26 17:27:05 -08:00
Paul Gauthier
b8f36c8277 feat: add PDF file support and refactor image handling 2024-11-26 17:19:28 -08:00
Paul Gauthier (aider)
73c1dc697f style: remove trailing whitespace in base_coder.py 2024-11-26 17:16:50 -08:00
Paul Gauthier (aider)
a9c4647461 feat: add support for both images and PDFs based on model capabilities 2024-11-26 17:16:43 -08:00
Paul Gauthier
aaeaa24153 feat: add PDF support and improve image handling in chat messages 2024-11-26 17:16:41 -08:00
Paul Gauthier
59a7494770 Merge branch 'main' into watch 2024-11-26 16:03:06 -08:00
Paul Gauthier
b2232cda7b refactor: modify check_for_urls to return modified input string 2024-11-26 15:04:19 -08:00
Paul Gauthier (aider)
3ba4aca268 refactor: improve error handling for .gitignore file operations 2024-11-26 15:01:50 -08:00
Paul Gauthier (aider)
f45533e20b style: fix line length and whitespace in gitignore handling 2024-11-26 15:00:38 -08:00
Paul Gauthier (aider)
2e7c5d6cfa fix: handle permission error when writing to .gitignore 2024-11-26 15:00:33 -08:00
Paul Gauthier
476acc7715 copy 2024-11-26 14:23:18 -08:00
Paul Gauthier
ab3b50296c copy 2024-11-26 14:12:16 -08:00
Paul Gauthier
60c29b2839 copy 2024-11-26 13:36:48 -08:00
Paul Gauthier
7972f5f4bc copy 2024-11-26 12:37:58 -08:00
Paul Gauthier
83a6865eb3 set version to 0.65.2.dev 2024-11-26 12:37:24 -08:00
Paul Gauthier
29a9b650ed version bump to 0.65.1 2024-11-26 12:35:54 -08:00
Paul Gauthier
dd48b740f9 test: update Claude model name tests to use 3.5 version 2024-11-26 12:33:58 -08:00
Paul Gauthier
401ce7a63d copy 2024-11-26 12:32:08 -08:00
Paul Gauthier
8218d085f7 fix: update Claude 3 model aliases to 3.5 versions 2024-11-26 12:31:54 -08:00
Paul Gauthier
abb3c936f7 refactor: simplify input interruption using placeholder variable 2024-11-26 10:58:22 -08:00
Paul Gauthier
0cb5aca81e Merge branch 'main' into watch 2024-11-26 10:47:38 -08:00
Paul Gauthier (aider)
554d274fff style: fix string quote consistency in blame.py 2024-11-26 10:47:04 -08:00
Paul Gauthier (aider)
13318219db feat: add YAML update capability to blame.py for --all-since 2024-11-26 10:46:55 -08:00
Paul Gauthier (aider)
474944fe74 style: fix string quote consistency in blame.py 2024-11-26 10:45:12 -08:00
Paul Gauthier (aider)
d1a49cd9ce feat: add YAML update capability to blame.py for --all-since 2024-11-26 10:45:08 -08:00
Paul Gauthier
139d89d817 Merge branch 'main' into watch 2024-11-26 10:30:25 -08:00
Paul Gauthier
61759f984c copy 2024-11-26 09:16:46 -08:00
Paul Gauthier
fedaede3b0 Merge branch 'main' into watch 2024-11-14 06:47:58 -08:00
Paul Gauthier
94ff9dc0a4 Merge branch 'main' into watch 2024-11-11 14:51:38 -08:00
Paul Gauthier
d4a88d08e4 Merge branch 'main' into watch 2024-11-07 13:44:51 -08:00
Paul Gauthier
7fc7ea6aba Merge branch 'main' into watch 2024-11-05 07:01:17 -08:00
Paul Gauthier
b57ad6929c Merge branch 'main' into watch 2024-11-01 11:27:29 -07:00
Paul Gauthier
550d274941 copy 2024-10-31 14:23:18 -07:00
Paul Gauthier
5a974483b9 Merge branch 'main' into watch 2024-10-31 14:19:37 -07:00
Paul Gauthier
34f34879c9 Merge branch 'main' into watch 2024-10-28 15:13:20 -07:00
Paul Gauthier
5c4b75909e refac 2024-10-26 07:31:28 -07:00
Paul Gauthier (aider)
41f126cad7 chore: disable verbose mode in watch.py 2024-10-25 16:23:45 -07:00
Paul Gauthier
c26d7d23b5 fix: improve regex pattern for AI comment detection 2024-10-25 16:23:44 -07:00
Paul Gauthier (aider)
4298ae00a9 style: fix linting issue in watch.py comment spacing 2024-10-25 16:21:25 -07:00
Paul Gauthier (aider)
47296e4294 fix: correct regex pattern for AI comment detection 2024-10-25 16:21:21 -07:00
Paul Gauthier
f6daab0728 feat: add support for inline AI comments in code files 2024-10-25 16:21:20 -07:00
Paul Gauthier (aider)
25dd9f1f35 style: fix linting issues and whitespace in watch.py 2024-10-25 16:20:57 -07:00
Paul Gauthier (aider)
130aedc474 fix: update regex pattern to match standalone "#ai" comments 2024-10-25 16:20:53 -07:00
Paul Gauthier
e958f40bd9 refactor: simplify file change processing and enable verbose mode 2024-10-25 16:20:52 -07:00
Paul Gauthier (aider)
ed2a2d7dc3 style: fix linting issues and format code 2024-10-25 16:10:56 -07:00
Paul Gauthier (aider)
0890b32425 refactor: move file change processing logic from io.py to watch.py 2024-10-25 16:10:49 -07:00
Paul Gauthier
2e5981ecb3 fix: extract AI comment content without prefix in file watcher 2024-10-25 16:10:48 -07:00
Paul Gauthier (aider)
ec00bb988c style: format nested list comprehension for better readability 2024-10-25 16:09:17 -07:00
Paul Gauthier (aider)
14a62586cc feat: add special handling for comments containing exclamation marks 2024-10-25 16:09:13 -07:00
Paul Gauthier
a8fe84acc7 fix: update changed_files handling to use dict keys instead of direct list 2024-10-25 16:09:12 -07:00
Paul Gauthier (aider)
144ba783a8 style: fix linting issues in watch.py 2024-10-25 16:05:55 -07:00
Paul Gauthier (aider)
8d81ef811e refactor: return full match including prefix in get_ai_comment function 2024-10-25 16:05:51 -07:00
Paul Gauthier
3d8ec25a33 fix: update AI comment extraction to include full match 2024-10-25 16:05:50 -07:00
Paul Gauthier (aider)
77f636f949 style: fix linting issues in watch.py 2024-10-25 16:03:42 -07:00
Paul Gauthier (aider)
aa86f02b1a feat: collect all AI comments from files instead of just first one 2024-10-25 16:03:39 -07:00
Paul Gauthier
05daab24a2 fix: update regex pattern for AI comment detection 2024-10-25 16:03:37 -07:00
Paul Gauthier (aider)
0960663811 style: add spacing between functions in watch.py 2024-10-25 16:00:59 -07:00
Paul Gauthier (aider)
150cc56b35 feat: add AI comment extraction from changed files 2024-10-25 16:00:55 -07:00
Paul Gauthier
7a9091fcae refactor: disable verbose mode and add comment for changed_file handling 2024-10-25 16:00:53 -07:00
Paul Gauthier (aider)
e6215d969d style: fix linting issues in watch.py 2024-10-25 15:58:45 -07:00
Paul Gauthier (aider)
9f1b8347f5 refactor: simplify regex pattern for matching AI comments 2024-10-25 15:58:41 -07:00
Paul Gauthier
311e1568d9 feat: improve file watching with verbose debug output and error handling 2024-10-25 15:58:39 -07:00
Paul Gauthier
c2dadd8054 Merge branch 'main' into watch 2024-10-25 15:54:31 -07:00
Paul Gauthier
88bdfd6548 cleanup 2024-10-25 15:11:02 -07:00
Paul Gauthier (aider)
70edb62a6b feat: pass encoding parameter to watch_source_files function 2024-10-25 13:24:06 -07:00
Paul Gauthier
6c2e0ccce5 refactor: remove interrupted_partial_input parameter from InputOutput class 2024-10-25 13:24:05 -07:00
Paul Gauthier (aider)
fc6e0dfa65 style: fix linting issues in watch.py 2024-10-25 13:23:49 -07:00
Paul Gauthier (aider)
54aebb7d98 feat: add encoding param to watch_source_files with error handling 2024-10-25 13:23:46 -07:00
Paul Gauthier (aider)
378c67d51f fix: update regex pattern to use word boundary instead of word character 2024-10-25 13:22:38 -07:00
Paul Gauthier (aider)
d535035bdd style: fix string quotes in regex pattern 2024-10-25 13:22:17 -07:00
Paul Gauthier (aider)
43790db48e feat: add AI marker detection in source file watcher 2024-10-25 13:22:13 -07:00
Paul Gauthier
d957adf062 refactor: remove debug dump() call from watch_source_files function 2024-10-25 13:22:11 -07:00
Paul Gauthier (aider)
ff8f3eb8c2 style: fix linting issues in io.py 2024-10-25 13:17:58 -07:00
Paul Gauthier (aider)
88c54c918c feat: store partial input when interrupting prompt 2024-10-25 13:17:54 -07:00
Paul Gauthier
1261a335f4 refactor: improve file change handling in input loop 2024-10-25 13:17:53 -07:00
Paul Gauthier (aider)
7587d76fd1 refactor: simplify file watcher thread cleanup by removing timeout 2024-10-25 12:59:09 -07:00
Paul Gauthier
8e81300f37 fix: improve error handling in input interruption flow 2024-10-25 12:59:07 -07:00
Paul Gauthier (aider)
a999020038 style: fix line length in watch_files function 2024-10-25 12:56:25 -07:00
Paul Gauthier (aider)
bc4664d62c feat: pass gitignore path to watch_source_files function 2024-10-25 12:56:20 -07:00
Paul Gauthier
6a1754aa6a feat: add file change monitoring with gitignore support 2024-10-25 12:56:19 -07:00
Paul Gauthier (aider)
da7bb312c2 style: remove extra blank lines in io.py 2024-10-25 12:52:45 -07:00
Paul Gauthier (aider)
5b7f813f81 feat: add watch_source_files import to io.py 2024-10-25 12:52:41 -07:00
Paul Gauthier
923d9a0df2 fix: move file watcher cleanup to correct finally block 2024-10-25 12:52:39 -07:00
Paul Gauthier
c16224b37a wip 2024-10-25 12:49:52 -07:00
Paul Gauthier (aider)
01b5bdc829 style: fix indentation in get_input method 2024-10-25 12:48:54 -07:00
Paul Gauthier
5a0d66141f fix: change /edit to /add command for file changes 2024-10-25 12:48:53 -07:00
Paul Gauthier (aider)
8e873e7450 feat: return edit command when input interrupted by file change 2024-10-25 12:47:06 -07:00
Paul Gauthier (aider)
add3fa43c6 style: format watch_source_files function signature 2024-10-25 12:43:37 -07:00
Paul Gauthier (aider)
b985a8d47a feat: add clean shutdown for file watcher thread 2024-10-25 12:43:31 -07:00
Paul Gauthier (aider)
3db3150a7e feat: add input interruption from background threads 2024-10-25 12:33:07 -07:00
Paul Gauthier
17ce2a3cad Merge branch 'main' into watch 2024-10-25 10:59:02 -07:00
Paul Gauthier
e239304d89 refactor: simplify file change output format 2024-10-25 10:53:10 -07:00
Paul Gauthier
893f3f343f refactor: optimize file path handling in watch_source_files function 2024-10-25 10:51:09 -07:00
Paul Gauthier
5918a18dee ignore emacs tmp files 2024-10-25 10:50:35 -07:00
Paul Gauthier (aider)
c08dcff56d style: fix linting issues in watch.py 2024-10-25 09:55:54 -07:00
Paul Gauthier (aider)
f33cd4e419 refactor: improve path handling in watch_source_files filter function 2024-10-25 09:55:50 -07:00
Paul Gauthier
a625426a28 fix: improve path handling in file watcher filter function 2024-10-25 09:55:49 -07:00
Paul Gauthier (aider)
24e66337ff style: fix line length in watch.py by wrapping function call 2024-10-25 09:51:55 -07:00
Paul Gauthier (aider)
d06f1ecf19 feat: add optional ignore function to watch_source_files 2024-10-25 09:51:52 -07:00
Paul Gauthier (aider)
9c6831c360 style: format argparse argument for better readability 2024-10-25 09:47:53 -07:00
Paul Gauthier (aider)
64ec0708c4 feat: support multiple gitignore files in file watcher 2024-10-25 09:47:50 -07:00
Paul Gauthier (aider)
34aa1e8de0 fix: handle paths outside watched directory in file watcher 2024-10-25 09:46:59 -07:00
Paul Gauthier (aider)
b0f31d8296 refactor: remove unused sys import from watch.py 2024-10-25 09:43:04 -07:00
Paul Gauthier (aider)
e5fe5199a3 style: fix import order and whitespace per linting rules 2024-10-25 09:42:51 -07:00
Paul Gauthier (aider)
45e95d1d00 feat: add gitignore support to file watcher 2024-10-25 09:42:47 -07:00
Paul Gauthier (aider)
21876e72fe style: Format watch.py with black and add newlines between functions 2024-10-25 09:41:33 -07:00
Paul Gauthier (aider)
81903598a8 feat: add file watcher for source code files with # or // comments 2024-10-25 09:41:30 -07:00
Paul Gauthier
290500ae17 feat: add file watcher module for monitoring changes 2024-10-25 09:41:27 -07:00
253 changed files with 21981 additions and 6779 deletions

View File

@@ -4,34 +4,46 @@ on:
push:
paths-ignore:
- 'aider/website/**'
- README.md
- HISTORY.md
- 'README.md'
- 'HISTORY.md'
- '.github/workflows/*'
- '!.github/workflows/docker-build-test.yml'
branches:
- main
pull_request:
paths-ignore:
- 'aider/website/**'
- README.md
- 'README.md'
- 'HISTORY.md'
- '.github/workflows/*'
- '!.github/workflows/docker-build-test.yml'
branches:
- main
# copy most of these steps from release.yml, but push: false and no tags:
jobs:
build:
docker_build_and_push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker standard image
- name: Login to DockerHub
if: ${{ github.event_name != 'pull_request' }}
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build Docker images (PR)
if: ${{ github.event_name == 'pull_request' }}
uses: docker/build-push-action@v5
with:
context: .
@@ -40,7 +52,19 @@ jobs:
push: false
target: aider
- name: Build Docker full image
- name: Build Docker images (Push)
if: ${{ github.event_name != 'pull_request' }}
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider:dev
target: aider
- name: Build Docker full image (PR)
if: ${{ github.event_name == 'pull_request' }}
uses: docker/build-push-action@v5
with:
context: .
@@ -48,3 +72,14 @@ jobs:
platforms: linux/amd64,linux/arm64
push: false
target: aider-full
- name: Build Docker full image (Push)
if: ${{ github.event_name != 'pull_request' }}
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider-full:dev
target: aider-full

View File

@@ -12,6 +12,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3

29
.github/workflows/issues.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: Process GitHub Issues
on:
schedule:
- cron: '0 */12 * * *' # Run every 12 hours
workflow_dispatch: # Allow manual triggers
jobs:
process-issues:
runs-on: ubuntu-latest
permissions:
issues: write # Required to modify issues
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests python-dotenv tqdm
- name: Run issues script
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: python scripts/issues.py --yes

View File

@@ -12,6 +12,7 @@ on:
- "main"
paths:
- "aider/website/**"
- ".github/workflows/pages.yml"
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
@@ -36,7 +37,9 @@ jobs:
working-directory: aider/website
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
@@ -53,10 +56,9 @@ jobs:
env:
JEKYLL_ENV: production
- name: Upload artifact
# Automatically uploads an artifact from the './_site' directory by default
uses: actions/upload-pages-artifact@v1
uses: actions/upload-pages-artifact@v3
with:
path: "aider/website/_site/"
path: "aider/website/_site"
# Deployment job
deploy:
@@ -68,7 +70,7 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2
uses: actions/deploy-pages@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
@@ -82,4 +84,4 @@ jobs:
- name: Run linkchecker
run: |
linkchecker https://aider.chat
linkchecker --ignore-url='.+\.(mp4|mov|avi)' https://aider.chat

View File

@@ -12,6 +12,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v5

View File

@@ -4,14 +4,19 @@ on:
push:
paths-ignore:
- 'aider/website/**'
- README.md
- HISTORY.md
- 'README.md'
- 'HISTORY.md'
- '.github/workflows/*'
- '!.github/workflows/ubuntu-tests.yml'
branches:
- main
pull_request:
paths-ignore:
- 'aider/website/**'
- README.md
- 'README.md'
- 'HISTORY.md'
- '.github/workflows/*'
- '!.github/workflows/ubuntu-tests.yml'
branches:
- main
@@ -25,12 +30,19 @@ jobs:
steps:
- name: Check out repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libportaudio2
- name: Install dependencies
run: |
python -m pip install --upgrade pip
@@ -38,5 +50,7 @@ jobs:
pip install .
- name: Run tests
env:
AIDER_ANALYTICS: false
run: |
pytest

View File

@@ -4,14 +4,19 @@ on:
push:
paths-ignore:
- 'aider/website/**'
- README.md
- HISTORY.md
- 'README.md'
- 'HISTORY.md'
- '.github/workflows/*'
- '!.github/workflows/windows-tests.yml'
branches:
- main
pull_request:
paths-ignore:
- 'aider/website/**'
- README.md
- 'README.md'
- 'HISTORY.md'
- '.github/workflows/*'
- '!.github/workflows/windows-tests.yml'
branches:
- main
@@ -25,6 +30,8 @@ jobs:
steps:
- name: Check out repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
@@ -38,6 +45,8 @@ jobs:
pip install .
- name: Run tests
env:
AIDER_ANALYTICS: false
run: |
pytest

3
.gitignore vendored
View File

@@ -11,5 +11,8 @@ _site
.jekyll-cache/
.jekyll-metadata
aider/__version__.py
aider/_version.py
.venv/
.#*
.gitattributes
tmp.benchmarks/

View File

@@ -56,13 +56,6 @@ It is recommended to create a virtual environment outside of the repository to k
python -m venv /path/to/venv
```
#### Using `virtualenv` (for older Python versions)
```
pip install virtualenv
virtualenv /path/to/venv
```
### Activate the Virtual Environment
#### On Windows

View File

@@ -1,6 +1,250 @@
# Release history
### main branch
### Aider v0.76.1
- Added ignore_permission_denied option to file watcher to prevent errors when accessing restricted files, by Yutaka Matsubara.
- Aider wrote 0% of the code in this release.
### Aider v0.76.0
- Improved support for thinking/reasoningmodels:
- Added `--thinking-tokens` CLI option to control token budget for models that support thinking.
- Display thinking/reasoning content from LLMs which return it.
- Enhanced handling of reasoning tags to better clean up model responses.
- Added deprecation warning for `remove_reasoning` setting, now replaced by `reasoning_tag`.
- Aider will notify you when it's completed the last request and needs your input:
- Added [notifications when LLM responses are ready](https://aider.chat/docs/usage/notifications.html) with `--notifications` flag.
- Specify desktop notification command with `--notifications-command`.
- Added support for QWQ 32B.
- Switch to `tree-sitter-language-pack` for tree sitter support.
- Improved error handling for EOF (Ctrl+D) in user input prompts.
- Added helper function to ensure hex color values have a # prefix.
- Fixed handling of Git errors when reading staged files.
- Improved SSL verification control for model information requests.
- Improved empty LLM response handling with clearer warning messages.
- Fixed Git identity retrieval to respect global configuration, by Akira Komamura.
- Offer to install dependencies for Bedrock and Vertex AI models.
- Deprecated model shortcut args (like --4o, --opus) in favor of the --model flag.
- Aider wrote 85% of the code in this release.
### Aider v0.75.3
- Support for V3 free on OpenRouter: `--model openrouter/deepseek/deepseek-chat:free`.
### Aider v0.75.2
- Added support for Claude 3.7 Sonnet models on OpenRouter, Bedrock and Vertex AI.
- Updated default model to Claude 3.7 Sonnet on OpenRouter.
- Added support for GPT-4.5-preview model.
- Added support for Claude 3.7 Sonnet:beta on OpenRouter.
- Fixed weak_model_name patterns to match main model name patterns for some models.
### Aider v0.75.1
- Added support for `openrouter/anthropic/claude-3.7-sonnet`
### Aider v0.75.0
- Basic support for Claude 3.7 Sonnet
- Use `--model sonnet` to use the new 3.7
- Thinking support coming soon.
- Bugfix to `/editor` command.
- Aider wrote 46% of the code in this release.
### Aider v0.74.3
- Downgrade streamlit dependency to avoid threading bug.
- Added support for tree-sitter language pack.
- Added openrouter/o3-mini-high model configuration.
- Added build.gradle.kts to special files for Kotlin project support, by Lucas Shadler.
### Aider v0.74.2
- Prevent more than one cache warming thread from becoming active.
- Fixed continuation prompt ". " for multiline input.
- Added HCL (Terraform) syntax support, by Warren Krewenki.
### Aider v0.74.1
- Have o1 & o3-mini generate markdown by sending the magic "Formatting re-enabled." string.
- Bugfix for multi-line inputs, which should not include the ". " continuation prompt.
### Aider v0.74.0
- Dynamically changes the Ollama context window to hold the current chat.
- Better support for o3-mini, DeepSeek V3 & R1, o1-mini, o1 especially via third-party API providers.
- Remove `<think>` tags from R1 responses for commit messages (and other weak model uses).
- Can now specify `use_temperature: <float>` in model settings, not just true/false.
- The full docker container now includes `boto3` for Bedrock.
- Docker containers now set `HOME=/app` which is the normal project mount-point, to persist `~/.aider`.
- Bugfix to prevent creating incorrect filenames like `python`, `php`, etc.
- Bugfix for `--timeout`
- Bugfix so that `/model` now correctly reports that the weak model is not changed.
- Bugfix so that multi-line mode persists through ^C at confirmation prompts.
- Watch files now fully ignores top-level directories named in ignore files, to reduce the chance of hitting OS watch limits. Helpful to ignore giant subtrees like `node_modules`.
- Fast startup with more providers and when model metadata provided in local files.
- Improved .gitignore handling:
- Honor ignores already in effect regardless of how they've been configured.
- Check for .env only when the file exists.
- Yes/No prompts now accept All/Skip as alias for Y/N even when not processing a group of confirmations.
- Aider wrote 77% of the code in this release.
### Aider v0.73.0
- Full support for o3-mini: `aider --model o3-mini`
- New `--reasoning-effort` argument: low, medium, high.
- Improved handling of context window size limits, with better messaging and Ollama-specific guidance.
- Added support for removing model-specific reasoning tags from responses with `remove_reasoning: tagname` model setting.
- Auto-create parent directories when creating new files, by xqyz.
- Support for R1 free on OpenRouter: `--model openrouter/deepseek/deepseek-r1:free`
- Aider wrote 69% of the code in this release.
### Aider v0.72.3
- Enforce user/assistant turn order to avoid R1 errors, by miradnanali.
- Case-insensitive model name matching while preserving original case.
### Aider v0.72.2
- Harden against user/assistant turn order problems which cause R1 errors.
### Aider v0.72.1
- Fix model metadata for `openrouter/deepseek/deepseek-r1`
### Aider v0.72.0
- Support for DeepSeek R1.
- Use shortcut: `--model r1`
- Also via OpenRouter: `--model openrouter/deepseek/deepseek-r1`
- Added Kotlin syntax support to repo map, by Paul Walker.
- Added `--line-endings` for file writing, by Titusz Pan.
- Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores.
- Bumped all dependencies, to pick up litellm support for o1 system messages.
- Bugfix for turn taking when reflecting lint/test errors.
- Aider wrote 52% of the code in this release.
### Aider v0.71.1
- Fix permissions issue in Docker images.
- Added read-only file announcements.
- Bugfix: ASCII fallback for unicode errors.
- Bugfix: integer indices for list slicing in repomap calculations.
### Aider v0.71.0
- Prompts to help DeepSeek work better when alternating between `/ask` and `/code`.
- Streaming pretty LLM responses is smoother and faster for long replies.
- Streaming automatically turns of for model that don't support it
- Can now switch to/from `/model o1` and a streaming model
- Pretty output remains enabled even when editing files with triple-backtick fences
- Bare `/ask`, `/code` and `/architect` commands now switch the chat mode.
- Increased default size of the repomap.
- Increased max chat history tokens limit from 4k to 8k.
- Turn off fancy input and watch files if terminal is dumb.
- Added support for custom voice format and input device settings.
- Disabled Streamlit email prompt, by apaz-cli.
- Docker container runs as non-root user.
- Fixed lint command handling of nested spaced strings, by Aaron Weisberg.
- Added token count feedback when adding command output to chat.
- Improved error handling for large audio files with automatic format conversion.
- Improved handling of git repo index errors, by Krazer.
- Improved unicode handling in console output with ASCII fallback.
- Added AssertionError, AttributeError to git error handling.
- Aider wrote 60% of the code in this release.
### Aider v0.70.0
- Full support for o1 models.
- Watch files now honors `--subtree-only`, and only watches that subtree.
- Improved prompting for watch files, to work more reliably with more models.
- New install methods via uv, including one-liners.
- Support for openrouter/deepseek/deepseek-chat model.
- Better error handling when interactive commands are attempted via `/load` or `--load`.
- Display read-only files with abs path if its shorter than rel path.
- Ask 10% of users to opt-in to analytics.
- Bugfix for auto-suggest.
- Gracefully handle unicode errors in git path names.
- Aider wrote 74% of the code in this release.
### Aider v0.69.1
- Fix for gemini model names in model metadata.
- Show hints about AI! and AI? when user makes AI comments.
- Support for running without git installed.
- Improved environment variable setup messages on Windows.
### Aider v0.69.0
- [Watch files](https://aider.chat/docs/usage/watch.html) improvements:
- Use `# ... AI?` comments to trigger aider and ask questions about your code.
- Now watches *all* files, not just certain source files.
- Use `# AI comments`, `// AI comments`, or `-- AI comments` to give aider instructions in any text file.
- Full support for Gemini Flash 2.0 Exp:
- `aider --model flash` or `aider --model gemini/gemini-2.0-flash-exp`
- [New `--multiline` flag and `/multiline-mode` command](https://aider.chat/docs/usage/commands.html#entering-multi-line-chat-messages) makes ENTER a soft newline and META-ENTER send the message, by @miradnanali.
- `/copy-context <instructions>` now takes optional "instructions" when [copying code context to the clipboard](https://aider.chat/docs/usage/copypaste.html#copy-aiders-code-context-to-your-clipboard-paste-into-the-web-ui).
- Improved clipboard error handling with helpful requirements install info.
- Ask 5% of users if they want to opt-in to analytics.
- `/voice` now lets you edit the transcribed text before sending.
- Disabled auto-complete in Y/N prompts.
- Aider wrote 68% of the code in this release.
### Aider v0.68.0
- [Aider works with LLM web chat UIs](https://aider.chat/docs/usage/copypaste.html).
- New `--copy-paste` mode.
- New `/copy-context` command.
- [Set API keys and other environment variables for all providers from command line or yaml conf file](https://aider.chat/docs/config/aider_conf.html#storing-llm-keys).
- New `--api-key provider=key` setting.
- New `--set-env VAR=value` setting.
- Added bash and zsh support to `--watch-files`.
- Better error messages when missing dependencies for Gemini and Bedrock models.
- Control-D now properly exits the program.
- Don't count token costs when API provider returns a hard error.
- Bugfix so watch files works with files that don't have tree-sitter support.
- Bugfix so o1 models can be used as weak model.
- Updated shell command prompt.
- Added docstrings for all Coders.
- Reorganized command line arguments with improved help messages and grouping.
- Use the exact `sys.python` for self-upgrades.
- Added experimental Gemini models.
- Aider wrote 71% of the code in this release.
### Aider v0.67.0
- [Use aider in your IDE or editor](https://aider.chat/docs/usage/watch.html).
- Run `aider --watch-files` and it will watch for instructions you add to your source files.
- One-liner `# ...` or `// ...` comments that start or end with "AI" are instructions to aider.
- When aider sees "AI!" it reads and follows all the instructions in AI comments.
- Support for new Amazon Bedrock Nova models.
- When `/run` or `/test` have non-zero exit codes, pre-fill "Fix that" into the next message prompt.
- `/diff` now invokes `git diff` to use your preferred diff tool.
- Added Ctrl-Z support for process suspension.
- Spinner now falls back to ASCII art if fancy symbols throw unicode errors.
- `--read` now expands `~` home dirs.
- Enabled exception capture in analytics.
- [Aider wrote 61% of the code in this release.](https://aider.chat/HISTORY.html)
### Aider v0.66.0
- PDF support for Sonnet and Gemini models.
- Added `--voice-input-device` to select audio input device for voice recording, by @preynal.
- Added `--timeout` option to configure API call timeouts.
- Set cwd to repo root when running shell commands.
- Added Ctrl-Up/Down keyboard shortcuts for per-message history navigation.
- Improved error handling for failed .gitignore file operations.
- Improved error handling for input history file permissions.
- Improved error handling for analytics file access.
- Removed spurious warning about disabling pretty in VSCode.
- Removed broken support for Dart.
- Bugfix when scraping URLs found in chat messages.
- Better handling of __version__ import errors.
- Improved `/drop` command to support substring matching for non-glob patterns.
- Aider wrote 82% of the code in this release.
### Aider v0.65.1
- Bugfix to `--alias`.
### Aider v0.65.0
- Added `--alias` config to define [custom model aliases](https://aider.chat/docs/config/model-aliases.html).
- Added `--[no-]detect-urls` flag to disable detecting and offering to scrape URLs found in the chat.

20
MANIFEST.in Normal file
View File

@@ -0,0 +1,20 @@
# This needs to sync with aider/help_pats.py
global-exclude .DS_Store
recursive-exclude aider/website/examples *
recursive-exclude aider/website/_posts *
exclude aider/website/HISTORY.md
exclude aider/website/docs/benchmarks*.md
exclude aider/website/docs/ctags.md
exclude aider/website/docs/unified-diffs.md
exclude aider/website/install.ps1
exclude aider/website/install.sh
recursive-exclude aider/website/docs/leaderboards *
recursive-exclude aider/website/assets *
recursive-exclude aider/website *.js
recursive-exclude aider/website *.html
recursive-exclude aider/website *.yml

View File

@@ -5,9 +5,8 @@
Aider lets you pair program with LLMs,
to edit code in your local git repository.
Start a new project or work with an existing git repo.
Aider works best with GPT-4o & Claude 3.5 Sonnet and can
[connect to almost any LLM](https://aider.chat/docs/llms.html).
Start a new project or work with an existing code base.
Aider works best with Claude 3.7 Sonnet, DeepSeek R1 & Chat V3, OpenAI o1, o3-mini & GPT-4o. Aider can [connect to almost any LLM, including local models](https://aider.chat/docs/llms.html).
<!-- SCREENCAST START -->
<p align="center">
@@ -43,28 +42,36 @@ VIDEO END -->
cog.out(open("aider/website/_includes/get-started.md").read())
]]]-->
You can get started quickly like this:
If you already have python 3.8-3.13 installed, you can get started quickly like this:
```
python -m pip install -U aider-chat
```bash
python -m pip install aider-install
aider-install
# Change directory into a git repo
cd /to/your/git/repo
# Change directory into your code base
cd /to/your/project
# Work with Claude 3.5 Sonnet on your repo
export ANTHROPIC_API_KEY=your-key-goes-here
aider
# Work with DeepSeek via DeepSeek's API
aider --model deepseek --api-key deepseek=your-key-goes-here
# Work with GPT-4o on your repo
export OPENAI_API_KEY=your-key-goes-here
aider
# Work with Claude 3.7 Sonnet via Anthropic's API
aider --model sonnet --api-key anthropic=your-key-goes-here
# Work with GPT-4o via OpenAI's API
aider --model gpt-4o --api-key openai=your-key-goes-here
# Work with Sonnet via OpenRouter's API
aider --model openrouter/anthropic/claude-3.7-sonnet --api-key openrouter=your-key-goes-here
# Work with DeepSeek via OpenRouter's API
aider --model openrouter/deepseek/deepseek-chat --api-key openrouter=your-key-goes-here
```
<!--[[[end]]]-->
See the
[installation instructions](https://aider.chat/docs/install.html)
and other
[documentation](https://aider.chat/docs/usage.html)
and
[usage documentation](https://aider.chat/docs/usage.html)
for more details.
## Features
@@ -73,21 +80,22 @@ for more details.
- Ask for changes:
- Add new features or test cases.
- Describe a bug.
- Paste in an error message or or GitHub issue URL.
- Paste in an error message or GitHub issue URL.
- Refactor code.
- Update docs.
- Aider will edit your files to complete your request.
- Aider [automatically git commits](https://aider.chat/docs/git.html) changes with a sensible commit message.
- [Use aider inside your favorite editor or IDE](https://aider.chat/docs/usage/watch.html).
- Aider works with [most popular languages](https://aider.chat/docs/languages.html): python, javascript, typescript, php, html, css, and more...
- Aider works best with GPT-4o & Claude 3.5 Sonnet and can [connect to almost any LLM](https://aider.chat/docs/llms.html).
- Aider can edit multiple files at once for complex requests.
- Aider uses a [map of your entire git repo](https://aider.chat/docs/repomap.html), which helps it work well in larger codebases.
- Edit files in your editor while chatting with aider,
- Edit files in your editor or IDE while chatting with aider,
and it will always use the latest version.
Pair program with AI.
- [Add images to the chat](https://aider.chat/docs/usage/images-urls.html) (GPT-4o, Claude 3.5 Sonnet, etc).
- [Add URLs to the chat](https://aider.chat/docs/usage/images-urls.html) and aider will read their content.
- [Code with your voice](https://aider.chat/docs/usage/voice.html).
- Aider works best with Claude 3.7 Sonnet, DeepSeek V3, o1 & GPT-4o and can [connect to almost any LLM](https://aider.chat/docs/llms.html).
## Top tier performance

View File

@@ -1,6 +1,20 @@
from packaging import version
__version__ = "0.76.2.dev"
safe_version = __version__
try:
from aider.__version__ import __version__
from aider._version import __version__
except Exception:
__version__ = "0.65.1.dev"
__version__ = safe_version + "+import"
if type(__version__) is not str:
__version__ = safe_version + "+type"
else:
try:
if version.parse(__version__) < version.parse(safe_version):
__version__ = safe_version + "+less"
except Exception:
__version__ = safe_version + "+parse"
__all__ = [__version__]

View File

@@ -5,13 +5,53 @@ import time
import uuid
from pathlib import Path
from mixpanel import Mixpanel, MixpanelException
from mixpanel import MixpanelException
from posthog import Posthog
from aider import __version__
from aider.dump import dump # noqa: F401
from aider.models import model_info_manager
PERCENT = 10
def compute_hex_threshold(percent):
"""Convert percentage to 6-digit hex threshold.
Args:
percent: Percentage threshold (0-100)
Returns:
str: 6-digit hex threshold
"""
return format(int(0xFFFFFF * percent / 100), "06x")
def is_uuid_in_percentage(uuid_str, percent):
"""Check if a UUID string falls within the first X percent of the UUID space.
Args:
uuid_str: UUID string to test
percent: Percentage threshold (0-100)
Returns:
bool: True if UUID falls within the first X percent
"""
if not (0 <= percent <= 100):
raise ValueError("Percentage must be between 0 and 100")
if not uuid_str:
return False
# Convert percentage to hex threshold (1% = "04...", 10% = "1a...", etc)
# Using first 6 hex digits
if percent == 0:
return False
threshold = compute_hex_threshold(percent)
return uuid_str[:6] <= threshold
mixpanel_project_token = "6da9a43058a5d1b9f3353153921fb04d"
posthog_project_api_key = "phc_99T7muzafUMMZX15H8XePbMSreEUzahHbtWjy3l5Qbv"
posthog_host = "https://us.i.posthog.com"
@@ -50,8 +90,14 @@ class Analytics:
self.disable(False)
return
self.mp = Mixpanel(mixpanel_project_token)
self.ph = Posthog(project_api_key=posthog_project_api_key, host=posthog_host)
# self.mp = Mixpanel(mixpanel_project_token)
self.ph = Posthog(
project_api_key=posthog_project_api_key,
host=posthog_host,
on_error=self.posthog_error,
enable_exception_autocapture=True,
super_properties=self.get_system_info(), # Add system info to all events
)
def disable(self, permanently):
self.mp = None
@@ -78,36 +124,17 @@ class Analytics:
if not self.user_id:
return False
PERCENT = 2.5
return self.is_uuid_in_percentage(self.user_id, PERCENT)
def is_uuid_in_percentage(self, uuid_str, percent):
"""Check if a UUID string falls within the first X percent of the UUID space.
Args:
uuid_str: UUID string to test
percent: Percentage threshold (0-100)
Returns:
bool: True if UUID falls within the first X percent
"""
if not (0 <= percent <= 100):
raise ValueError("Percentage must be between 0 and 100")
if not uuid_str:
return False
# Convert percentage to hex threshold (1% = "04...", 10% = "1a...", etc)
# Using first 6 hex digits
if percent == 0:
return False
threshold = format(int(0xFFFFFF * percent / 100), "06x")
return uuid_str[:6] <= threshold
return is_uuid_in_percentage(self.user_id, PERCENT)
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
try:
data_file = Path.home() / ".aider" / "analytics.json"
data_file.parent.mkdir(parents=True, exist_ok=True)
return data_file
except OSError:
# If we can't create/access the directory, just disable analytics
self.disable(permanently=False)
return None
def get_or_create_uuid(self):
self.load_data()
@@ -119,6 +146,9 @@ class Analytics:
def load_data(self):
data_file = self.get_data_file_path()
if not data_file:
return
if data_file.exists():
try:
data = json.loads(data_file.read_text())
@@ -130,14 +160,20 @@ class Analytics:
def save_data(self):
data_file = self.get_data_file_path()
if not data_file:
return
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))
try:
data_file.write_text(json.dumps(data, indent=4))
except OSError:
# If we can't write the file, just disable analytics
self.disable(permanently=False)
def get_system_info(self):
return {
@@ -145,6 +181,7 @@ class Analytics:
"os_platform": platform.system(),
"os_release": platform.release(),
"machine": platform.machine(),
"aider_version": __version__,
}
def _redact_model_name(self, model):
@@ -158,6 +195,13 @@ class Analytics:
return model.name.split("/")[0] + "/REDACTED"
return None
def posthog_error(self):
"""disable posthog if we get an error"""
print("X" * 100)
# https://github.com/PostHog/posthog-python/blob/9e1bb8c58afaa229da24c4fb576c08bb88a75752/posthog/consumer.py#L86
# https://github.com/Aider-AI/aider/issues/2532
self.ph = None
def event(self, event_name, main_model=None, **kwargs):
if not self.mp and not self.ph and not self.logfile:
return
@@ -170,7 +214,6 @@ class Analytics:
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():
@@ -179,8 +222,6 @@ class Analytics:
else:
properties[key] = str(value)
properties["aider_version"] = __version__
if self.mp:
try:
self.mp.track(self.user_id, event_name, dict(properties))
@@ -197,10 +238,13 @@ class Analytics:
"user_id": self.user_id,
"time": int(time.time()),
}
with open(self.logfile, "a") as f:
json.dump(log_entry, f)
f.write("\n")
try:
with open(self.logfile, "a") as f:
json.dump(log_entry, f)
f.write("\n")
except OSError:
pass # Ignore OS errors when writing to logfile
def __del__(self):
if self.ph:
self.ph.shutdown()
if __name__ == "__main__":
dump(compute_hex_threshold(PERCENT))

View File

@@ -12,6 +12,7 @@ from aider.args_formatter import (
MarkdownHelpFormatter,
YamlHelpFormatter,
)
from aider.deprecated import add_deprecated_model_args
from .dump import dump # noqa: F401
@@ -28,159 +29,71 @@ def get_parser(default_config_files, git_root):
config_file_parser_class=configargparse.YAMLConfigFileParser,
auto_env_var_prefix="AIDER_",
)
group = parser.add_argument_group("Main")
group = parser.add_argument_group("Main model")
group.add_argument(
"files", metavar="FILE", nargs="*", help="files to edit with an LLM (optional)"
)
group.add_argument(
"--openai-api-key",
metavar="OPENAI_API_KEY",
env_var="OPENAI_API_KEY",
help="Specify the OpenAI API key",
)
group.add_argument(
"--anthropic-api-key",
metavar="ANTHROPIC_API_KEY",
env_var="ANTHROPIC_API_KEY",
help="Specify the Anthropic API key",
)
group.add_argument(
"--model",
metavar="MODEL",
default=None,
help="Specify the model to use for the main chat",
)
opus_model = "claude-3-opus-20240229"
group.add_argument(
"--opus",
action="store_const",
dest="model",
const=opus_model,
help=f"Use {opus_model} model for the main chat",
)
sonnet_model = "claude-3-5-sonnet-20241022"
group.add_argument(
"--sonnet",
action="store_const",
dest="model",
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",
"-4",
action="store_const",
dest="model",
const=gpt_4_model,
help=f"Use {gpt_4_model} model for the main chat",
)
gpt_4o_model = "gpt-4o-2024-08-06"
group.add_argument(
"--4o",
action="store_const",
dest="model",
const=gpt_4o_model,
help=f"Use {gpt_4o_model} model for the main chat",
)
gpt_4o_mini_model = "gpt-4o-mini"
group.add_argument(
"--mini",
action="store_const",
dest="model",
const=gpt_4o_mini_model,
help=f"Use {gpt_4o_mini_model} model for the main chat",
)
gpt_4_turbo_model = "gpt-4-1106-preview"
group.add_argument(
"--4-turbo",
action="store_const",
dest="model",
const=gpt_4_turbo_model,
help=f"Use {gpt_4_turbo_model} model for the main chat",
)
gpt_3_model_name = "gpt-3.5-turbo"
group.add_argument(
"--35turbo",
"--35-turbo",
"--3",
"-3",
action="store_const",
dest="model",
const=gpt_3_model_name,
help=f"Use {gpt_3_model_name} model for the main chat",
)
deepseek_model = "deepseek/deepseek-coder"
group.add_argument(
"--deepseek",
action="store_const",
dest="model",
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")
group = parser.add_argument_group("API Keys and settings")
group.add_argument(
"--openai-api-key",
help="Specify the OpenAI API key",
)
group.add_argument(
"--anthropic-api-key",
help="Specify the Anthropic API key",
)
group.add_argument(
"--openai-api-base",
help="Specify the api base url",
)
group.add_argument(
"--openai-api-type",
help="(deprecated, use --set-env OPENAI_API_TYPE=<value>)",
)
group.add_argument(
"--openai-api-version",
help="(deprecated, use --set-env OPENAI_API_VERSION=<value>)",
)
group.add_argument(
"--openai-api-deployment-id",
help="(deprecated, use --set-env OPENAI_API_DEPLOYMENT_ID=<value>)",
)
group.add_argument(
"--openai-organization-id",
help="(deprecated, use --set-env OPENAI_ORGANIZATION=<value>)",
)
group.add_argument(
"--set-env",
action="append",
metavar="ENV_VAR_NAME=value",
help="Set an environment variable (to control API settings, can be used multiple times)",
default=[],
)
group.add_argument(
"--api-key",
action="append",
metavar="PROVIDER=KEY",
help=(
"Set an API key for a provider (eg: --api-key provider=<key> sets"
" PROVIDER_API_KEY=<key>)"
),
default=[],
)
group = parser.add_argument_group("Model settings")
group.add_argument(
"--list-models",
"--models",
metavar="MODEL",
help="List known models which match the (partial) MODEL name",
)
group.add_argument(
"--openai-api-base",
metavar="OPENAI_API_BASE",
env_var="OPENAI_API_BASE",
help="Specify the api base url",
)
group.add_argument(
"--openai-api-type",
metavar="OPENAI_API_TYPE",
env_var="OPENAI_API_TYPE",
help="Specify the api_type",
)
group.add_argument(
"--openai-api-version",
metavar="OPENAI_API_VERSION",
env_var="OPENAI_API_VERSION",
help="Specify the api_version",
)
group.add_argument(
"--openai-api-deployment-id",
metavar="OPENAI_API_DEPLOYMENT_ID",
env_var="OPENAI_API_DEPLOYMENT_ID",
help="Specify the deployment_id",
)
group.add_argument(
"--openai-organization-id",
metavar="OPENAI_ORGANIZATION_ID",
env_var="OPENAI_ORGANIZATION_ID",
help="Specify the OpenAI organization ID",
)
group.add_argument(
"--model-settings-file",
metavar="MODEL_SETTINGS_FILE",
@@ -199,12 +112,28 @@ def get_parser(default_config_files, git_root):
metavar="ALIAS:MODEL",
help="Add a model alias (can be used multiple times)",
)
group.add_argument(
"--reasoning-effort",
type=str,
help="Set the reasoning_effort API parameter (default: not set)",
)
group.add_argument(
"--thinking-tokens",
type=int,
help="Set the thinking token budget for models that support it (default: not set)",
)
group.add_argument(
"--verify-ssl",
action=argparse.BooleanOptionalAction,
default=True,
help="Verify the SSL cert when connecting to models (default: True)",
)
group.add_argument(
"--timeout",
type=float,
default=None,
help="Timeout in seconds for API calls (default: None)",
)
group.add_argument(
"--edit-format",
"--chat-mode",
@@ -255,17 +184,9 @@ def get_parser(default_config_files, git_root):
" 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(
"--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 = parser.add_argument_group("Cache settings")
group.add_argument(
"--cache-prompts",
action=argparse.BooleanOptionalAction,
@@ -280,12 +201,12 @@ def get_parser(default_config_files, git_root):
)
##########
group = parser.add_argument_group("Repomap Settings")
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)",
help="Suggested number of tokens to use for repo map, use 0 to disable",
)
group.add_argument(
"--map-refresh",
@@ -337,7 +258,7 @@ def get_parser(default_config_files, git_root):
)
##########
group = parser.add_argument_group("Output Settings")
group = parser.add_argument_group("Output settings")
group.add_argument(
"--dark-mode",
action="store_true",
@@ -425,7 +346,8 @@ def get_parser(default_config_files, git_root):
default="default",
help=(
"Set the markdown code theme (default: default, other options include monokai,"
" solarized-dark, solarized-light)"
" solarized-dark, solarized-light, or a Pygments builtin style,"
" see https://pygments.org/styles for available themes)"
),
)
group.add_argument(
@@ -436,7 +358,7 @@ def get_parser(default_config_files, git_root):
)
##########
group = parser.add_argument_group("Git Settings")
group = parser.add_argument_group("Git settings")
group.add_argument(
"--git",
action=argparse.BooleanOptionalAction,
@@ -523,6 +445,12 @@ def get_parser(default_config_files, git_root):
help="Skip the sanity check for the git repository (default: False)",
default=False,
)
group.add_argument(
"--watch-files",
action=argparse.BooleanOptionalAction,
default=False,
help="Enable/disable watching files for ai coding comments (default: False)",
)
group = parser.add_argument_group("Fixing and committing")
group.add_argument(
"--lint",
@@ -559,7 +487,7 @@ def get_parser(default_config_files, git_root):
group.add_argument(
"--test",
action="store_true",
help="Run tests and fix problems found",
help="Run tests, fix problems found and then exit",
default=False,
)
@@ -583,37 +511,8 @@ def get_parser(default_config_files, git_root):
default=False,
)
group = parser.add_argument_group("Other Settings")
group.add_argument(
"--file",
action="append",
metavar="FILE",
help="specify a file to edit (can be used multiple times)",
)
group.add_argument(
"--read",
action="append",
metavar="FILE",
help="specify a read-only file (can be used multiple times)",
)
group.add_argument(
"--vim",
action="store_true",
help="Use VI editing mode in the terminal (default: False)",
default=False,
)
group.add_argument(
"--chat-language",
metavar="CHAT_LANGUAGE",
default=None,
help="Specify the language to use in the chat (default: None, uses system settings)",
)
group.add_argument(
"--version",
action="version",
version=f"%(prog)s {__version__}",
help="Show the version number and exit",
)
#########
group = parser.add_argument_group("Upgrading")
group.add_argument(
"--just-check-update",
action="store_true",
@@ -646,47 +545,14 @@ def get_parser(default_config_files, git_root):
default=False,
)
group.add_argument(
"--apply",
metavar="FILE",
help="Apply the changes from the given file instead of running the chat (debug)",
)
group.add_argument(
"--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,
)
group.add_argument(
"-v",
"--verbose",
action="store_true",
help="Enable verbose output",
default=False,
)
group.add_argument(
"--show-repo-map",
action="store_true",
help="Print the repo map and exit (debug)",
default=False,
)
group.add_argument(
"--show-prompts",
action="store_true",
help="Print the system prompts and exit (debug)",
default=False,
)
group.add_argument(
"--exit",
action="store_true",
help="Do all startup activities then exit before accepting user input (debug)",
default=False,
"--version",
action="version",
version=f"%(prog)s {__version__}",
help="Show the version number and exit",
)
##########
group = parser.add_argument_group("Modes")
group.add_argument(
"--message",
"--msg",
@@ -705,6 +571,110 @@ def get_parser(default_config_files, git_root):
" (disables chat mode)"
),
)
group.add_argument(
"--gui",
"--browser",
action=argparse.BooleanOptionalAction,
help="Run aider in your browser (default: False)",
default=False,
)
group.add_argument(
"--copy-paste",
action=argparse.BooleanOptionalAction,
default=False,
help="Enable automatic copy/paste of chat between aider and web UI (default: False)",
)
group.add_argument(
"--apply",
metavar="FILE",
help="Apply the changes from the given file instead of running the chat (debug)",
)
group.add_argument(
"--apply-clipboard-edits",
action="store_true",
help="Apply clipboard contents as edits using the main model's editor format",
default=False,
)
group.add_argument(
"--exit",
action="store_true",
help="Do all startup activities then exit before accepting user input (debug)",
default=False,
)
group.add_argument(
"--show-repo-map",
action="store_true",
help="Print the repo map and exit (debug)",
default=False,
)
group.add_argument(
"--show-prompts",
action="store_true",
help="Print the system prompts and exit (debug)",
default=False,
)
##########
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)",
)
group.add_argument(
"--voice-input-device",
metavar="VOICE_INPUT_DEVICE",
default=None,
help="Specify the input device name for voice recording",
)
######
group = parser.add_argument_group("Other settings")
group.add_argument(
"--file",
action="append",
metavar="FILE",
help="specify a file to edit (can be used multiple times)",
)
group.add_argument(
"--read",
action="append",
metavar="FILE",
help="specify a read-only file (can be used multiple times)",
)
group.add_argument(
"--vim",
action="store_true",
help="Use VI editing mode in the terminal (default: False)",
default=False,
)
group.add_argument(
"--chat-language",
metavar="CHAT_LANGUAGE",
default=None,
help="Specify the language to use in the chat (default: None, uses system settings)",
)
group.add_argument(
"--yes-always",
action="store_true",
help="Always say yes to every confirmation",
default=None,
)
group.add_argument(
"-v",
"--verbose",
action="store_true",
help="Enable verbose output",
default=False,
)
group.add_argument(
"--load",
metavar="LOAD_FILE",
@@ -715,6 +685,12 @@ def get_parser(default_config_files, git_root):
default="utf-8",
help="Specify the encoding for input and output (default: utf-8)",
)
group.add_argument(
"--line-endings",
choices=["platform", "lf", "crlf"],
default="platform",
help="Line endings to use when writing files (default: platform)",
)
group.add_argument(
"-c",
"--config",
@@ -725,12 +701,13 @@ def get_parser(default_config_files, git_root):
" or home directory)"
),
)
# 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(
"--gui",
"--browser",
action=argparse.BooleanOptionalAction,
help="Run aider in your browser (default: False)",
default=False,
"--env-file",
metavar="ENV_FILE",
default=default_env_file(git_root),
help="Specify the .env file to load (default: .env in git root)",
)
group.add_argument(
"--suggest-shell-commands",
@@ -744,6 +721,30 @@ def get_parser(default_config_files, git_root):
default=True,
help="Enable/disable fancy input with history and completion (default: True)",
)
group.add_argument(
"--multiline",
action=argparse.BooleanOptionalAction,
default=False,
help="Enable/disable multi-line input mode with Meta-Enter to submit (default: False)",
)
group.add_argument(
"--notifications",
action=argparse.BooleanOptionalAction,
default=False,
help=(
"Enable/disable terminal bell notifications when LLM responses are ready (default:"
" False)"
),
)
group.add_argument(
"--notifications-command",
metavar="COMMAND",
default=None,
help=(
"Specify a command to run for notifications instead of the terminal bell. If not"
" specified, a default command for your OS may be used."
),
)
group.add_argument(
"--detect-urls",
action=argparse.BooleanOptionalAction,
@@ -756,20 +757,9 @@ def get_parser(default_config_files, git_root):
)
##########
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)",
)
group = parser.add_argument_group("Deprecated model settings")
# Add deprecated model shortcut arguments
add_deprecated_model_args(parser, group)
return parser

View File

@@ -148,11 +148,14 @@ class YamlHelpFormatter(argparse.HelpFormatter):
parts.append(f"#{switch}: xxx")
parts.append("## Specify multiple values like this:")
parts.append(f"#{switch}:")
parts.append(f"# - xxx")
parts.append(f"# - yyy")
parts.append(f"# - zzz")
parts.append("# - xxx")
parts.append("# - yyy")
parts.append("# - zzz")
else:
parts.append(f"#{switch}: xxx\n")
if switch.endswith("color"):
parts.append(f'#{switch}: "xxx"\n')
else:
parts.append(f"#{switch}: xxx\n")
###
# parts.append(str(action))

View File

@@ -7,6 +7,8 @@ class AskPrompts(CoderPrompts):
main_system = """Act as an expert code analyst.
Answer questions about the supplied code.
Always reply to the user in {language}.
Describe code changes however you like. Don't use SEARCH/REPLACE blocks!
"""
example_messages = []

View File

@@ -27,10 +27,16 @@ from aider.history import ChatSummary
from aider.io import ConfirmGroup, InputOutput
from aider.linter import Linter
from aider.llm import litellm
from aider.models import RETRY_TIMEOUT
from aider.reasoning_tags import (
REASONING_TAG,
format_reasoning_content,
remove_reasoning_content,
replace_reasoning_tags,
)
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_TIMEOUT, send_completion
from aider.utils import format_content, format_messages, format_tokens, is_image_file
from ..dump import dump # noqa: F401
@@ -59,7 +65,8 @@ def wrap_fence(name):
all_fences = [
("``" + "`", "``" + "`"),
("`" * 3, "`" * 3),
("`" * 4, "`" * 4), # LLMs ignore and revert to triple-backtick, causing #2879
wrap_fence("source"),
wrap_fence("code"),
wrap_fence("pre"),
@@ -84,7 +91,7 @@ class Coder:
max_reflections = 3
edit_format = None
yield_stream = False
temperature = 0
temperature = None
auto_lint = True
auto_test = False
test_cmd = None
@@ -103,6 +110,7 @@ class Coder:
detect_urls = True
ignore_mentions = None
chat_language = None
file_watcher = None
@classmethod
def create(
@@ -142,7 +150,13 @@ class Coder:
# the system prompt.
done_messages = from_coder.done_messages
if edit_format != from_coder.edit_format and done_messages and summarize_from_coder:
done_messages = from_coder.summarizer.summarize_all(done_messages)
try:
done_messages = from_coder.summarizer.summarize_all(done_messages)
except ValueError:
# If summarization fails, keep the original messages and warn the user
io.tool_warning(
"Chat history summarization failed, continuing with full history"
)
# Bring along context from the old Coder
update = dict(
@@ -153,12 +167,14 @@ class Coder:
aider_commit_hashes=from_coder.aider_commit_hashes,
commands=from_coder.commands.clone(),
total_cost=from_coder.total_cost,
ignore_mentions=from_coder.ignore_mentions,
file_watcher=from_coder.file_watcher,
)
use_kwargs.update(update) # override to complete the switch
use_kwargs.update(kwargs) # override passed kwargs
kwargs = use_kwargs
from_coder.ok_to_warm_cache = False
for coder in coders.__all__:
if hasattr(coder, "edit_format") and coder.edit_format == edit_format:
@@ -175,7 +191,6 @@ class Coder:
def clone(self, **kwargs):
new_coder = Coder.create(from_coder=self, **kwargs)
new_coder.ignore_mentions = self.ignore_mentions
return new_coder
def get_announcements(self):
@@ -229,10 +244,10 @@ class Coder:
if map_tokens > 0:
refresh = self.repo_map.refresh
lines.append(f"Repo-map: using {map_tokens} tokens, {refresh} refresh")
max_map_tokens = 2048
max_map_tokens = self.main_model.get_repo_map_tokens() * 2
if map_tokens > max_map_tokens:
lines.append(
f"Warning: map-tokens > {max_map_tokens} is not recommended as too much"
f"Warning: map-tokens > {max_map_tokens} is not recommended. Too much"
" irrelevant code can confuse LLMs."
)
else:
@@ -244,11 +259,20 @@ class Coder:
for fname in self.get_inchat_relative_files():
lines.append(f"Added {fname} to the chat.")
for fname in self.abs_read_only_fnames:
rel_fname = self.get_rel_fname(fname)
lines.append(f"Added {rel_fname} to the chat (read-only).")
if self.done_messages:
lines.append("Restored previous conversation history.")
if self.io.multiline_mode:
lines.append("Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text")
return lines
ok_to_warm_cache = False
def __init__(
self,
main_model,
@@ -283,6 +307,9 @@ class Coder:
suggest_shell_commands=True,
chat_language=None,
detect_urls=True,
ignore_mentions=None,
file_watcher=None,
auto_copy_context=False,
):
# Fill in a dummy Analytics if needed, but it is never .enable()'d
self.analytics = analytics if analytics is not None else Analytics()
@@ -293,7 +320,16 @@ class Coder:
self.aider_commit_hashes = set()
self.rejected_urls = set()
self.abs_root_path_cache = {}
self.ignore_mentions = set()
self.auto_copy_context = auto_copy_context
self.ignore_mentions = ignore_mentions
if not self.ignore_mentions:
self.ignore_mentions = set()
self.file_watcher = file_watcher
if self.file_watcher:
self.file_watcher.coder = self
self.suggest_shell_commands = suggest_shell_commands
self.detect_urls = detect_urls
@@ -332,7 +368,6 @@ class Coder:
self.done_messages = []
self.io = io
self.stream = stream
self.shell_commands = []
@@ -346,6 +381,12 @@ class Coder:
self.pretty = self.io.pretty
self.main_model = main_model
# Set the reasoning tag name based on model settings or default
self.reasoning_tag_name = (
self.main_model.reasoning_tag if self.main_model.reasoning_tag else REASONING_TAG
)
self.stream = stream and main_model.streaming
if cache_prompts and self.main_model.cache_control:
self.add_cache_headers = True
@@ -437,6 +478,7 @@ class Coder:
self.summarizer_thread = None
self.summarized_done_messages = []
self.summarizing_messages = None
if not self.done_messages and restore_chat_history:
history_md = self.io.read_text(self.io.chat_history_file)
@@ -503,7 +545,7 @@ class Coder:
return False
# only show pretty output if fences are the normal triple-backtick
if self.fence != self.fences[0]:
if self.fence[0][0] != "`":
return False
return True
@@ -597,9 +639,19 @@ class Coder:
def get_ident_filename_matches(self, idents):
all_fnames = defaultdict(set)
for fname in self.get_all_relative_files():
base = Path(fname).with_suffix("").name.lower()
if len(base) >= 5:
all_fnames[base].add(fname)
# Skip empty paths or just '.'
if not fname or fname == ".":
continue
try:
# Handle dotfiles properly
path = Path(fname)
base = path.stem.lower() # Use stem instead of with_suffix("").name
if len(base) >= 5:
all_fnames[base].add(fname)
except ValueError:
# Skip paths that can't be processed
continue
matches = set()
for ident in idents:
@@ -665,6 +717,8 @@ class Coder:
def get_readonly_files_messages(self):
readonly_messages = []
# Handle non-image files
read_only_content = self.get_read_only_files_content()
if read_only_content:
readonly_messages += [
@@ -676,6 +730,15 @@ class Coder:
content="Ok, I will use these files as references.",
),
]
# Handle image files
images_message = self.get_images_message(self.abs_read_only_fnames)
if images_message is not None:
readonly_messages += [
images_message,
dict(role="assistant", content="Ok, I will use these images as references."),
]
return readonly_messages
def get_chat_files_messages(self):
@@ -697,7 +760,7 @@ class Coder:
dict(role="assistant", content=files_reply),
]
images_message = self.get_images_message()
images_message = self.get_images_message(self.abs_fnames)
if images_message is not None:
chat_files_messages += [
images_message,
@@ -706,23 +769,42 @@ class Coder:
return chat_files_messages
def get_images_message(self):
if not self.main_model.info.get("supports_vision"):
def get_images_message(self, fnames):
supports_images = self.main_model.info.get("supports_vision")
supports_pdfs = self.main_model.info.get("supports_pdf_input") or self.main_model.info.get(
"max_pdf_size_mb"
)
# https://github.com/BerriAI/litellm/pull/6928
supports_pdfs = supports_pdfs or "claude-3-5-sonnet-20241022" in self.main_model.name
if not (supports_images or supports_pdfs):
return None
image_messages = []
for fname, content in self.get_abs_fnames_content():
if is_image_file(fname):
with open(fname, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
mime_type, _ = mimetypes.guess_type(fname)
if mime_type and mime_type.startswith("image/"):
image_url = f"data:{mime_type};base64,{encoded_string}"
rel_fname = self.get_rel_fname(fname)
image_messages += [
{"type": "text", "text": f"Image file: {rel_fname}"},
{"type": "image_url", "image_url": {"url": image_url, "detail": "high"}},
]
for fname in fnames:
if not is_image_file(fname):
continue
mime_type, _ = mimetypes.guess_type(fname)
if not mime_type:
continue
with open(fname, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
image_url = f"data:{mime_type};base64,{encoded_string}"
rel_fname = self.get_rel_fname(fname)
if mime_type.startswith("image/") and supports_images:
image_messages += [
{"type": "text", "text": f"Image file: {rel_fname}"},
{"type": "image_url", "image_url": {"url": image_url, "detail": "high"}},
]
elif mime_type == "application/pdf" and supports_pdfs:
image_messages += [
{"type": "text", "text": f"PDF file: {rel_fname}"},
{"type": "image_url", "image_url": image_url},
]
if not image_messages:
return None
@@ -741,6 +823,7 @@ class Coder:
self.lint_outcome = None
self.test_outcome = None
self.shell_commands = []
self.message_cost = 0
if self.repo:
self.commit_before_message.append(self.repo.get_head_commit_sha())
@@ -751,9 +834,10 @@ class Coder:
self.io.user_input(with_message)
self.run_one(with_message, preproc)
return self.partial_response_content
while True:
try:
if not self.io.placeholder:
self.copy_context()
user_message = self.get_input()
self.run_one(user_message, preproc)
self.show_undo_hint()
@@ -762,6 +846,10 @@ class Coder:
except EOFError:
return
def copy_context(self):
if self.auto_copy_context:
self.commands.cmd_copy_context()
def get_input(self):
inchat_files = self.get_inchat_relative_files()
read_only_files = [self.get_rel_fname(fname) for fname in self.abs_read_only_fnames]
@@ -784,7 +872,7 @@ class Coder:
return self.commands.run(inp)
self.check_for_file_mentions(inp)
self.check_for_urls(inp)
inp = self.check_for_urls(inp)
return inp
@@ -830,11 +918,10 @@ class Coder:
def check_for_urls(self, inp: str) -> List[str]:
"""Check input for URLs and offer to add them to the chat."""
if not self.detect_urls:
return []
return inp
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:
@@ -844,11 +931,10 @@ class Coder:
):
inp += "\n\n"
inp += self.commands.cmd_web(url, return_content=True)
added_urls.append(url)
else:
self.rejected_urls.add(url)
return added_urls
return inp
def keyboard_interrupt(self):
now = time.time()
@@ -856,6 +942,7 @@ class Coder:
thresh = 2 # seconds
if self.last_keyboard_interrupt and now - self.last_keyboard_interrupt < thresh:
self.io.tool_warning("\n\n^C KeyboardInterrupt")
self.event("exit", reason="Control-C")
sys.exit()
self.io.tool_warning("\n\n^C again to exit")
@@ -875,8 +962,9 @@ class Coder:
self.summarizer_thread.start()
def summarize_worker(self):
self.summarizing_messages = list(self.done_messages)
try:
self.summarized_done_messages = self.summarizer.summarize(self.done_messages)
self.summarized_done_messages = self.summarizer.summarize(self.summarizing_messages)
except ValueError as err:
self.io.tool_warning(err.args[0])
@@ -890,7 +978,9 @@ class Coder:
self.summarizer_thread.join()
self.summarizer_thread = None
self.done_messages = self.summarized_done_messages
if self.summarizing_messages == self.done_messages:
self.done_messages = self.summarized_done_messages
self.summarizing_messages = None
self.summarized_done_messages = []
def move_back_cur_messages(self, message):
@@ -984,14 +1074,26 @@ class Coder:
else:
language = "the same language they are using"
if self.fence[0] == "`" * 4:
quad_backtick_reminder = (
"\nIMPORTANT: Use *quadruple* backticks ```` as fences, not triple backticks!\n"
)
else:
quad_backtick_reminder = ""
prompt = prompt.format(
fence=self.fence,
quad_backtick_reminder=quad_backtick_reminder,
lazy_prompt=lazy_prompt,
platform=platform_text,
shell_cmd_prompt=shell_cmd_prompt,
shell_cmd_reminder=shell_cmd_reminder,
language=language,
)
if self.main_model.system_prompt_prefix:
prompt = self.main_model.system_prompt_prefix + prompt
return prompt
def format_chat_chunks(self):
@@ -1074,7 +1176,10 @@ class Coder:
# add the reminder anyway
total_tokens = 0
final = chunks.cur[-1]
if chunks.cur:
final = chunks.cur[-1]
else:
final = None
max_input_tokens = self.main_model.info.get("max_input_tokens") or 0
# Add the reminder prompt if we still have room to include it.
@@ -1085,7 +1190,7 @@ class Coder:
):
if self.main_model.reminder == "sys":
chunks.reminder = reminder_message
elif self.main_model.reminder == "user" and final["role"] == "user":
elif self.main_model.reminder == "user" and final and final["role"] == "user":
# stuff it into the user message
new_content = (
final["content"]
@@ -1108,8 +1213,11 @@ class Coder:
return
if not self.num_cache_warming_pings:
return
if not self.ok_to_warm_cache:
return
delay = 5 * 60 - 5
delay = float(os.environ.get("AIDER_CACHE_KEEPALIVE_DELAY", delay))
self.next_cache_warm = time.time() + delay
self.warming_pings_left = self.num_cache_warming_pings
self.cache_warming_chunks = chunks
@@ -1118,7 +1226,7 @@ class Coder:
return
def warm_cache_worker():
while True:
while self.ok_to_warm_cache:
time.sleep(1)
if self.warming_pings_left <= 0:
continue
@@ -1156,13 +1264,43 @@ class Coder:
return chunks
def check_tokens(self, messages):
"""Check if the messages will fit within the model's token limits."""
input_tokens = self.main_model.token_count(messages)
max_input_tokens = self.main_model.info.get("max_input_tokens") or 0
if max_input_tokens and input_tokens >= max_input_tokens:
self.io.tool_error(
f"Your estimated chat context of {input_tokens:,} tokens exceeds the"
f" {max_input_tokens:,} token limit for {self.main_model.name}!"
)
self.io.tool_output("To reduce the chat context:")
self.io.tool_output("- Use /drop to remove unneeded files from the chat")
self.io.tool_output("- Use /clear to clear the chat history")
self.io.tool_output("- Break your code into smaller files")
self.io.tool_output(
"It's probably safe to try and send the request, most providers won't charge if"
" the context limit is exceeded."
)
if not self.io.confirm_ask("Try to proceed anyway?"):
return False
return True
def send_message(self, inp):
self.event("message_send_starting")
# Notify IO that LLM processing is starting
self.io.llm_started()
self.cur_messages += [
dict(role="user", content=inp),
]
chunks = self.format_messages()
messages = chunks.all_messages()
if not self.check_tokens(messages):
return
self.warm_cache(chunks)
if self.verbose:
@@ -1223,7 +1361,7 @@ class Coder:
exhausted = True
break
self.multi_response_content = self.get_multi_response_content()
self.multi_response_content = self.get_multi_response_content_in_progress()
if messages[-1]["role"] == "assistant":
messages[-1]["content"] = self.multi_response_content
@@ -1236,20 +1374,37 @@ class Coder:
lines = traceback.format_exception(type(err), err, err.__traceback__)
self.io.tool_warning("".join(lines))
self.io.tool_error(str(err))
self.event("message_send_exception", exception=str(err))
return
finally:
if self.mdstream:
self.live_incremental_response(True)
self.mdstream = None
self.partial_response_content = self.get_multi_response_content(True)
self.partial_response_content = self.get_multi_response_content_in_progress(True)
self.remove_reasoning_content()
self.multi_response_content = ""
###
# print()
# print("=" * 20)
# dump(self.partial_response_content)
self.io.tool_output()
self.show_usage_report()
self.add_assistant_reply_to_cur_messages()
if exhausted:
if self.cur_messages and self.cur_messages[-1]["role"] == "user":
self.cur_messages += [
dict(
role="assistant",
content="FinishReasonLength exception: you sent too many tokens",
),
]
self.show_exhausted_error()
self.num_exhausted_context_windows += 1
return
@@ -1280,14 +1435,17 @@ class Coder:
interrupted = True
if interrupted:
content += "\n^C KeyboardInterrupt"
self.cur_messages += [dict(role="assistant", content=content)]
if self.cur_messages and self.cur_messages[-1]["role"] == "user":
self.cur_messages[-1]["content"] += "\n^C KeyboardInterrupt"
else:
self.cur_messages += [dict(role="user", content="^C KeyboardInterrupt")]
self.cur_messages += [
dict(role="assistant", content="I see that you interrupted my previous reply.")
]
return
edited = self.apply_updates()
self.update_cur_messages()
if edited:
self.aider_edited_files.update(edited)
saved_message = self.auto_commit(edited)
@@ -1308,7 +1466,6 @@ class Coder:
ok = self.io.confirm_ask("Attempt to fix lint errors?")
if ok:
self.reflected_message = lint_errors
self.update_cur_messages()
return
shared_output = self.run_shell_commands()
@@ -1325,7 +1482,6 @@ class Coder:
ok = self.io.confirm_ask("Attempt to fix test errors?")
if ok:
self.reflected_message = test_errors
self.update_cur_messages()
return
def reply_completed(self):
@@ -1370,9 +1526,7 @@ class Coder:
res.append("- Ask for smaller changes in each request.")
res.append("- Break your code into smaller source files.")
if "diff" not in self.main_model.edit_format:
res.append(
"- Use a stronger model like gpt-4o, sonnet or opus that can return diffs."
)
res.append("- Use a stronger model that can return diffs.")
if input_tokens >= max_input_tokens or total_tokens >= max_input_tokens:
res.append("")
@@ -1389,6 +1543,8 @@ class Coder:
def lint_edited(self, fnames):
res = ""
for fname in fnames:
if not fname:
continue
errors = self.linter.lint(self.abs_root_path(fname))
if errors:
@@ -1401,7 +1557,11 @@ class Coder:
return res
def update_cur_messages(self):
def __del__(self):
"""Cleanup when the Coder object is destroyed."""
self.ok_to_warm_cache = False
def add_assistant_reply_to_cur_messages(self):
if self.partial_response_content:
self.cur_messages += [dict(role="assistant", content=self.partial_response_content)]
if self.partial_response_function_call:
@@ -1417,7 +1577,7 @@ class Coder:
words = set(word for word in content.split())
# drop sentence punctuation from the end
words = set(word.rstrip(",.!;:") for word in words)
words = set(word.rstrip(",.!;:?") for word in words)
# strip away all kinds of quotes
quotes = "".join(['"', "'", "`"])
@@ -1467,7 +1627,9 @@ 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, allow_never=True):
if self.io.confirm_ask(
"Add file to the chat?", subject=rel_fname, group=group, allow_never=True
):
self.add_rel_fname(rel_fname)
added_fnames.append(rel_fname)
else:
@@ -1477,6 +1639,9 @@ class Coder:
return prompts.added_files.format(fnames=", ".join(added_fnames))
def send(self, messages, model=None, functions=None):
self.got_reasoning_content = False
self.ended_reasoning_content = False
if not model:
model = self.main_model
@@ -1485,20 +1650,13 @@ class Coder:
self.io.log_llm_history("TO LLM", format_messages(messages))
if self.main_model.use_temperature:
temp = self.temperature
else:
temp = None
completion = None
try:
hash_object, completion = send_completion(
model.name,
hash_object, completion = model.send_completion(
messages,
functions,
self.stream,
temp,
extra_params=model.extra_params,
self.temperature,
)
self.chat_completion_call_hashes.append(hash_object.hexdigest())
@@ -1506,6 +1664,16 @@ class Coder:
yield from self.show_send_output_stream(completion)
else:
self.show_send_output(completion)
# Calculate costs for successful responses
self.calculate_and_show_tokens_and_cost(messages, completion)
except LiteLLMExceptions().exceptions_tuple() as err:
ex_info = LiteLLMExceptions().get_ex_info(err)
if ex_info.name == "ContextWindowExceededError":
# Still calculate costs for context window errors
self.calculate_and_show_tokens_and_cost(messages, completion)
raise
except KeyboardInterrupt as kbi:
self.keyboard_interrupt()
raise kbi
@@ -1523,8 +1691,6 @@ class Coder:
if args:
self.io.ai_output(json.dumps(args, indent=4))
self.calculate_and_show_tokens_and_cost(messages, completion)
def show_send_output(self, completion):
if self.verbose:
print(completion)
@@ -1543,6 +1709,14 @@ class Coder:
except AttributeError as func_err:
show_func_err = func_err
try:
reasoning_content = completion.choices[0].message.reasoning_content
except AttributeError:
try:
reasoning_content = completion.choices[0].message.reasoning
except AttributeError:
reasoning_content = None
try:
self.partial_response_content = completion.choices[0].message.content or ""
except AttributeError as content_err:
@@ -1561,6 +1735,15 @@ class Coder:
raise Exception("No data found in LLM response!")
show_resp = self.render_incremental_response(True)
if reasoning_content:
formatted_reasoning = format_reasoning_content(
reasoning_content, self.reasoning_tag_name
)
show_resp = formatted_reasoning + show_resp
show_resp = replace_reasoning_tags(show_resp, self.reasoning_tag_name)
self.io.assistant_output(show_resp, pretty=self.show_pretty())
if (
@@ -1570,6 +1753,8 @@ class Coder:
raise FinishReasonLength()
def show_send_output_stream(self, completion):
received_content = False
for chunk in completion:
if len(chunk.choices) == 0:
continue
@@ -1588,19 +1773,46 @@ class Coder:
self.partial_response_function_call[k] += v
else:
self.partial_response_function_call[k] = v
received_content = True
except AttributeError:
pass
text = ""
try:
text = chunk.choices[0].delta.content
if text:
self.partial_response_content += text
reasoning_content = chunk.choices[0].delta.reasoning_content
except AttributeError:
text = None
try:
reasoning_content = chunk.choices[0].delta.reasoning
except AttributeError:
reasoning_content = None
if reasoning_content:
if not self.got_reasoning_content:
text += f"<{REASONING_TAG}>\n\n"
text += reasoning_content
self.got_reasoning_content = True
received_content = True
try:
content = chunk.choices[0].delta.content
if content:
if self.got_reasoning_content and not self.ended_reasoning_content:
text += f"\n\n</{self.reasoning_tag_name}>\n\n"
self.ended_reasoning_content = True
text += content
received_content = True
except AttributeError:
pass
self.partial_response_content += text
if self.show_pretty():
self.live_incremental_response(False)
elif text:
# Apply reasoning tag formatting
text = replace_reasoning_tags(text, self.reasoning_tag_name)
try:
sys.stdout.write(text)
except UnicodeEncodeError:
@@ -1612,12 +1824,25 @@ class Coder:
sys.stdout.flush()
yield text
if not received_content:
self.io.tool_warning("Empty response received from LLM. Check your provider account?")
def live_incremental_response(self, final):
show_resp = self.render_incremental_response(final)
# Apply any reasoning tag formatting
show_resp = replace_reasoning_tags(show_resp, self.reasoning_tag_name)
self.mdstream.update(show_resp, final=final)
def render_incremental_response(self, final):
return self.get_multi_response_content()
return self.get_multi_response_content_in_progress()
def remove_reasoning_content(self):
"""Remove reasoning content from the model's response."""
self.partial_response_content = remove_reasoning_content(
self.partial_response_content,
self.reasoning_tag_name,
)
def calculate_and_show_tokens_and_cost(self, messages, completion=None):
prompt_tokens = 0
@@ -1740,12 +1965,13 @@ class Coder:
self.message_tokens_sent = 0
self.message_tokens_received = 0
def get_multi_response_content(self, final=False):
def get_multi_response_content_in_progress(self, final=False):
cur = self.multi_response_content or ""
new = self.partial_response_content or ""
if new.rstrip() != new and not final:
new = new.rstrip()
return cur + new
def get_rel_fname(self, fname):
@@ -2086,7 +2312,7 @@ class Coder:
self.io.tool_output(f"Running {command}")
# Add the command to input history
self.io.add_to_input_history(f"/run {command.strip()}")
exit_status, output = run_cmd(command, error_print=self.io.tool_error)
exit_status, output = run_cmd(command, error_print=self.io.tool_error, cwd=self.root)
if output:
accumulated_output += f"Output from {command}\n{output}\n"

View File

@@ -401,6 +401,9 @@ missing_filename_err = (
" {fence[0]}"
)
# Always be willing to treat triple-backticks as a fence when searching for filenames
triple_backticks = "`" * 3
def strip_filename(filename, fence):
filename = filename.strip()
@@ -409,7 +412,7 @@ def strip_filename(filename, fence):
return
start_fence = fence[0]
if filename.startswith(start_fence):
if filename.startswith(start_fence) or filename.startswith(triple_backticks):
return
filename = filename.rstrip(":")
@@ -546,7 +549,7 @@ def find_filename(lines, fence, valid_fnames):
filenames.append(filename)
# Only continue as long as we keep seeing fences
if not line.startswith(fence[0]):
if not line.startswith(fence[0]) and not line.startswith(triple_backticks):
break
if not filenames:

View File

@@ -35,7 +35,9 @@ ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!
Just suggest shell commands this way, not example code.
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.
Only suggest at most a few shell commands at a time, not more than 1-3, one per line.
Do not suggest multi-line shell commands.
All shell commands will run from the root directory of the user's project.
Use the appropriate shell based on the user's system info:
{platform}
@@ -155,7 +157,7 @@ Every *SEARCH/REPLACE block* must use this format:
8. The closing fence: {fence[1]}
Use the *FULL* file path, as shown to you by the user.
{quad_backtick_reminder}
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.
@@ -181,6 +183,9 @@ If you want to put code in a new file, use a *SEARCH/REPLACE block* with:
To rename files which have been added to the chat, use shell commands at the end of your response.
If the user just says something like "ok" or "go ahead" or "do that" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.
The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.
{lazy_prompt}
ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!
{shell_cmd_reminder}

View File

@@ -3,5 +3,6 @@ from .editor_editblock_prompts import EditorEditBlockPrompts
class EditorEditBlockCoder(EditBlockCoder):
"A coder that uses search/replace blocks, focused purely on editing files."
edit_format = "editor-diff"
gpt_prompts = EditorEditBlockPrompts()

View File

@@ -3,5 +3,6 @@ from .wholefile_coder import WholeFileCoder
class EditorWholeFileCoder(WholeFileCoder):
"A coder that operates on entire files, focused purely on editing files."
edit_format = "editor-whole"
gpt_prompts = EditorWholeFilePrompts()

View File

@@ -3,7 +3,11 @@
import sys
from pathlib import Path
import git
try:
import git
except ImportError:
git = None
from diff_match_patch import diff_match_patch
from tqdm import tqdm

View File

@@ -38,7 +38,7 @@ class SingleWholeFileFunctionCoder(Coder):
self.gpt_prompts = SingleWholeFileFunctionPrompts()
super().__init__(*args, **kwargs)
def update_cur_messages(self, edited):
def add_assistant_reply_to_cur_messages(self, edited):
if edited:
self.cur_messages += [
dict(role="assistant", content=self.gpt_prompts.redacted_edit_message)

View File

@@ -17,10 +17,10 @@ class WholeFileCoder(Coder):
try:
return self.get_edits(mode="diff")
except ValueError:
return self.get_multi_response_content()
return self.get_multi_response_content_in_progress()
def get_edits(self, mode="update"):
content = self.get_multi_response_content()
content = self.get_multi_response_content_in_progress()
chat_files = self.get_inchat_relative_files()

View File

@@ -49,7 +49,7 @@ class WholeFileFunctionCoder(Coder):
self.gpt_prompts = WholeFileFunctionPrompts()
super().__init__(*args, **kwargs)
def update_cur_messages(self, edited):
def add_assistant_reply_to_cur_messages(self, edited):
if edited:
self.cur_messages += [
dict(role="assistant", content=self.gpt_prompts.redacted_edit_message)

View File

@@ -43,6 +43,8 @@ class Commands:
verify_ssl=self.verify_ssl,
args=self.args,
parser=self.parser,
verbose=self.verbose,
editor=self.editor,
)
def __init__(
@@ -50,6 +52,8 @@ class Commands:
io,
coder,
voice_language=None,
voice_input_device=None,
voice_format=None,
verify_ssl=True,
args=None,
parser=None,
@@ -67,6 +71,8 @@ class Commands:
voice_language = None
self.voice_language = voice_language
self.voice_format = voice_format
self.voice_input_device = voice_input_device
self.help = None
self.editor = editor
@@ -75,7 +81,7 @@ class Commands:
"Switch to a new LLM"
model_name = args.strip()
model = models.Model(model_name)
model = models.Model(model_name, weak_model=self.coder.main_model.weak_model.name)
models.sanity_check_models(self.io, model)
raise SwitchCoder(main_model=model)
@@ -101,6 +107,13 @@ class Commands:
("help", "Get help about using aider (usage, config, troubleshoot)."),
("ask", "Ask questions about your code without making any changes."),
("code", "Ask for changes to your code (using the best edit format)."),
(
"architect",
(
"Work with an architect model to design code changes, and an editor to make"
" them."
),
),
]
)
@@ -391,6 +404,7 @@ class Commands:
fence = "`" * 3
file_res = []
# files
for fname in self.coder.abs_fnames:
relative_fname = self.coder.get_rel_fname(fname)
@@ -401,7 +415,7 @@ class Commands:
# approximate
content = f"{relative_fname}\n{fence}\n" + content + "{fence}\n"
tokens = self.coder.main_model.token_count(content)
res.append((tokens, f"{relative_fname}", "/drop to remove"))
file_res.append((tokens, f"{relative_fname}", "/drop to remove"))
# read-only files
for fname in self.coder.abs_read_only_fnames:
@@ -411,7 +425,10 @@ class Commands:
# approximate
content = f"{relative_fname}\n{fence}\n" + content + "{fence}\n"
tokens = self.coder.main_model.token_count(content)
res.append((tokens, f"{relative_fname} (read-only)", "/drop to remove"))
file_res.append((tokens, f"{relative_fname} (read-only)", "/drop to remove"))
file_res.sort()
res.extend(file_res)
self.io.tool_output(
f"Approximate context window usage for {self.coder.main_model.name}, in tokens:"
@@ -588,6 +605,10 @@ class Commands:
self.io.tool_output(f"Diff since {commit_before_message[:7]}...")
if self.coder.pretty:
run_cmd(f"git diff {commit_before_message}")
return
diff = self.coder.repo.diff_commits(
self.coder.pretty,
commit_before_message,
@@ -739,6 +760,7 @@ class Commands:
if self.io.confirm_ask(f"No files matched '{word}'. Do you want to create {fname}?"):
try:
fname.parent.mkdir(parents=True, exist_ok=True)
fname.touch()
all_matched_files.add(str(fname))
except OSError as e:
@@ -785,7 +807,8 @@ class Commands:
self.io.tool_error(f"Unable to read {matched_file}")
else:
self.coder.abs_fnames.add(abs_file_path)
self.io.tool_output(f"Added {matched_file} to the chat")
fname = self.coder.get_rel_fname(abs_file_path)
self.io.tool_output(f"Added {fname} to the chat")
self.coder.check_added_files()
def completions_drop(self):
@@ -808,15 +831,33 @@ class Commands:
# Expand tilde in the path
expanded_word = os.path.expanduser(word)
# Handle read-only files separately, without glob_filtered_to_repo
read_only_matched = [f for f in self.coder.abs_read_only_fnames if expanded_word in f]
# Handle read-only files with substring matching and samefile check
read_only_matched = []
for f in self.coder.abs_read_only_fnames:
if expanded_word in f:
read_only_matched.append(f)
continue
if read_only_matched:
for matched_file in read_only_matched:
self.coder.abs_read_only_fnames.remove(matched_file)
self.io.tool_output(f"Removed read-only file {matched_file} from the chat")
# Try samefile comparison for relative paths
try:
abs_word = os.path.abspath(expanded_word)
if os.path.samefile(abs_word, f):
read_only_matched.append(f)
except (FileNotFoundError, OSError):
continue
matched_files = self.glob_filtered_to_repo(expanded_word)
for matched_file in read_only_matched:
self.coder.abs_read_only_fnames.remove(matched_file)
self.io.tool_output(f"Removed read-only file {matched_file} from the chat")
# For editable files, use glob if word contains glob chars, otherwise use substring
if any(c in expanded_word for c in "*?[]"):
matched_files = self.glob_filtered_to_repo(expanded_word)
else:
# Use substring matching like we do for read-only files
matched_files = [
self.coder.get_rel_fname(f) for f in self.coder.abs_fnames if expanded_word in f
]
if not matched_files:
matched_files.append(expanded_word)
@@ -876,16 +917,20 @@ class Commands:
def cmd_run(self, args, add_on_nonzero_exit=False):
"Run a shell command and optionally add the output to the chat (alias: !)"
exit_status, combined_output = run_cmd(
args, verbose=self.verbose, error_print=self.io.tool_error
args, verbose=self.verbose, error_print=self.io.tool_error, cwd=self.coder.root
)
if combined_output is None:
return
# Calculate token count of output
token_count = self.coder.main_model.token_count(combined_output)
k_tokens = token_count / 1000
if add_on_nonzero_exit:
add = exit_status != 0
else:
add = self.io.confirm_ask("Add command output to the chat?")
add = self.io.confirm_ask(f"Add {k_tokens:.1f}k tokens of command output to the chat?")
if add:
num_lines = len(combined_output.strip().splitlines())
@@ -902,13 +947,17 @@ class Commands:
dict(role="assistant", content="Ok."),
]
if add and exit_status != 0:
self.io.placeholder = "What's wrong? Fix"
def cmd_exit(self, args):
"Exit the application"
self.coder.event("exit", reason="/exit")
sys.exit()
def cmd_quit(self, args):
"Exit the application"
sys.exit()
self.cmd_exit(args)
def cmd_ls(self, args):
"List all known files and indicate which are included in the chat session"
@@ -973,7 +1022,7 @@ class Commands:
return
self.coder.event("interactive help")
from aider.coders import Coder
from aider.coders.base_coder import Coder
if not self.help:
res = install_help_extra(self.io)
@@ -1017,23 +1066,23 @@ class Commands:
)
def cmd_ask(self, args):
"Ask questions about the code base without editing any files"
"""Ask questions about the code base without editing any files. If no prompt provided, switches to ask mode.""" # noqa
return self._generic_chat_command(args, "ask")
def cmd_code(self, args):
"Ask for changes to your code"
"""Ask for changes to your code. If no prompt provided, switches to code mode.""" # noqa
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"
"""Enter architect/editor mode using 2 different models. If no prompt provided, switches to architect/editor mode.""" # noqa
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.")
return
# Switch to the corresponding chat mode if no args provided
return self.cmd_chat_mode(edit_format)
from aider.coders import Coder
from aider.coders.base_coder import Coder
coder = Coder.create(
io=self.io,
@@ -1080,43 +1129,23 @@ class Commands:
self.io.tool_error("To use /voice you must provide an OpenAI API key.")
return
try:
self.voice = voice.Voice(audio_format=self.args.voice_format)
self.voice = voice.Voice(
audio_format=self.voice_format or "wav", device_name=self.voice_input_device
)
except voice.SoundDeviceError:
self.io.tool_error(
"Unable to import `sounddevice` and/or `soundfile`, is portaudio installed?"
)
return
history_iter = self.io.get_input_history()
history = []
size = 0
for line in history_iter:
if line.startswith("/"):
continue
if line in history:
continue
if size + len(line) > 1024:
break
size += len(line)
history.append(line)
history.reverse()
history = "\n".join(history)
try:
text = self.voice.record_and_transcribe(history, language=self.voice_language)
text = self.voice.record_and_transcribe(None, language=self.voice_language)
except litellm.OpenAIError as err:
self.io.tool_error(f"Unable to use OpenAI whisper model: {err}")
return
if text:
self.io.add_to_input_history(text)
self.io.print()
self.io.user_input(text, log_only=False)
self.io.print()
return text
self.io.placeholder = text
def cmd_paste(self, args):
"""Paste image/text from the clipboard into the chat.\
@@ -1169,9 +1198,14 @@ class Commands:
self.io.tool_error(f"Error processing clipboard content: {e}")
def cmd_read_only(self, args):
"Add files to the chat that are for reference, not to be edited"
"Add files to the chat that are for reference only, or turn added files to read-only"
if not args.strip():
self.io.tool_error("Please provide filenames or directories to read.")
# Convert all files in chat to read-only
for fname in list(self.coder.abs_fnames):
self.coder.abs_fnames.remove(fname)
self.coder.abs_read_only_fnames.add(fname)
rel_fname = self.coder.get_rel_fname(fname)
self.io.tool_output(f"Converted {rel_fname} to read-only")
return
filenames = parse_quoted_filenames(args)
@@ -1288,7 +1322,12 @@ class Commands:
continue
self.io.tool_output(f"\nExecuting: {cmd}")
self.run(cmd)
try:
self.run(cmd)
except SwitchCoder:
self.io.tool_error(
f"Command '{cmd}' is only supported in interactive mode, skipping."
)
def completions_raw_save(self, document, complete_event):
return self.completions_raw_read_only(document, complete_event)
@@ -1320,6 +1359,10 @@ class Commands:
except Exception as e:
self.io.tool_error(f"Error saving commands to file: {e}")
def cmd_multiline_mode(self, args):
"Toggle multiline mode (swaps behavior of Enter and Meta+Enter)"
self.io.toggle_multiline_mode()
def cmd_copy(self, args):
"Copy the last assistant message to the clipboard"
all_messages = self.coder.done_messages + self.coder.cur_messages
@@ -1368,6 +1411,50 @@ class Commands:
if user_input.strip():
self.io.set_placeholder(user_input.rstrip())
def cmd_copy_context(self, args=None):
"""Copy the current chat context as markdown, suitable to paste into a web UI"""
chunks = self.coder.format_chat_chunks()
markdown = ""
# Only include specified chunks in order
for messages in [chunks.repo, chunks.readonly_files, chunks.chat_files]:
for msg in messages:
# Only include user messages
if msg["role"] != "user":
continue
content = msg["content"]
# Handle image/multipart content
if isinstance(content, list):
for part in content:
if part.get("type") == "text":
markdown += part["text"] + "\n\n"
else:
markdown += content + "\n\n"
args = args or ""
markdown += f"""
Just tell me how to edit the files to make the changes.
Don't give me back entire files.
Just show me the edits I need to make.
{args}
"""
try:
pyperclip.copy(markdown)
self.io.tool_output("Copied code context to clipboard.")
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 expand_subdir(file_path):
if file_path.is_file():

72
aider/copypaste.py Normal file
View File

@@ -0,0 +1,72 @@
import threading
import time
import pyperclip
class ClipboardWatcher:
"""Watches clipboard for changes and updates IO placeholder"""
def __init__(self, io, verbose=False):
self.io = io
self.verbose = verbose
self.stop_event = None
self.watcher_thread = None
self.last_clipboard = None
self.io.clipboard_watcher = self
def start(self):
"""Start watching clipboard for changes"""
self.stop_event = threading.Event()
self.last_clipboard = pyperclip.paste()
def watch_clipboard():
while not self.stop_event.is_set():
try:
current = pyperclip.paste()
if current != self.last_clipboard:
self.last_clipboard = current
self.io.interrupt_input()
self.io.placeholder = current
if len(current.splitlines()) > 1:
self.io.placeholder = "\n" + self.io.placeholder + "\n"
time.sleep(0.5)
except Exception as e:
if self.verbose:
from aider.dump import dump
dump(f"Clipboard watcher error: {e}")
continue
self.watcher_thread = threading.Thread(target=watch_clipboard, daemon=True)
self.watcher_thread.start()
def stop(self):
"""Stop watching clipboard for changes"""
if self.stop_event:
self.stop_event.set()
if self.watcher_thread:
self.watcher_thread.join()
self.watcher_thread = None
self.stop_event = None
def main():
"""Example usage of the clipboard watcher"""
from aider.io import InputOutput
io = InputOutput()
watcher = ClipboardWatcher(io, verbose=True)
try:
watcher.start()
while True:
time.sleep(1)
except KeyboardInterrupt:
print("\nStopped watching clipboard")
watcher.stop()
if __name__ == "__main__":
main()

125
aider/deprecated.py Normal file
View File

@@ -0,0 +1,125 @@
def add_deprecated_model_args(parser, group):
"""Add deprecated model shortcut arguments to the argparse parser."""
opus_model = "claude-3-opus-20240229"
group.add_argument(
"--opus",
action="store_true",
help=f"Use {opus_model} model for the main chat (deprecated, use --model)",
default=False,
)
sonnet_model = "anthropic/claude-3-7-sonnet-20250219"
group.add_argument(
"--sonnet",
action="store_true",
help=f"Use {sonnet_model} model for the main chat (deprecated, use --model)",
default=False,
)
haiku_model = "claude-3-5-haiku-20241022"
group.add_argument(
"--haiku",
action="store_true",
help=f"Use {haiku_model} model for the main chat (deprecated, use --model)",
default=False,
)
gpt_4_model = "gpt-4-0613"
group.add_argument(
"--4",
"-4",
action="store_true",
help=f"Use {gpt_4_model} model for the main chat (deprecated, use --model)",
default=False,
)
gpt_4o_model = "gpt-4o"
group.add_argument(
"--4o",
action="store_true",
help=f"Use {gpt_4o_model} model for the main chat (deprecated, use --model)",
default=False,
)
gpt_4o_mini_model = "gpt-4o-mini"
group.add_argument(
"--mini",
action="store_true",
help=f"Use {gpt_4o_mini_model} model for the main chat (deprecated, use --model)",
default=False,
)
gpt_4_turbo_model = "gpt-4-1106-preview"
group.add_argument(
"--4-turbo",
action="store_true",
help=f"Use {gpt_4_turbo_model} model for the main chat (deprecated, use --model)",
default=False,
)
gpt_3_model_name = "gpt-3.5-turbo"
group.add_argument(
"--35turbo",
"--35-turbo",
"--3",
"-3",
action="store_true",
help=f"Use {gpt_3_model_name} model for the main chat (deprecated, use --model)",
default=False,
)
deepseek_model = "deepseek/deepseek-chat"
group.add_argument(
"--deepseek",
action="store_true",
help=f"Use {deepseek_model} model for the main chat (deprecated, use --model)",
default=False,
)
o1_mini_model = "o1-mini"
group.add_argument(
"--o1-mini",
action="store_true",
help=f"Use {o1_mini_model} model for the main chat (deprecated, use --model)",
default=False,
)
o1_preview_model = "o1-preview"
group.add_argument(
"--o1-preview",
action="store_true",
help=f"Use {o1_preview_model} model for the main chat (deprecated, use --model)",
default=False,
)
def handle_deprecated_model_args(args, io):
"""Handle deprecated model shortcut arguments and provide appropriate warnings."""
# Define model mapping
model_map = {
"opus": "claude-3-opus-20240229",
"sonnet": "anthropic/claude-3-7-sonnet-20250219",
"haiku": "claude-3-5-haiku-20241022",
"4": "gpt-4-0613",
"4o": "gpt-4o",
"mini": "gpt-4o-mini",
"4_turbo": "gpt-4-1106-preview",
"35turbo": "gpt-3.5-turbo",
"deepseek": "deepseek/deepseek-chat",
"o1_mini": "o1-mini",
"o1_preview": "o1-preview",
}
# Check if any deprecated args are used
for arg_name, model_name in model_map.items():
arg_name_clean = arg_name.replace("-", "_")
if hasattr(args, arg_name_clean) and getattr(args, arg_name_clean):
# Find preferred name to display in warning
from aider.models import MODEL_ALIASES
display_name = model_name
# Check if there's a shorter alias for this model
for alias, full_name in MODEL_ALIASES.items():
if full_name == model_name:
display_name = alias
break
# Show the warning
io.tool_warning(
f"The --{arg_name.replace('_', '-')} flag is deprecated and will be removed in a"
f" future version. Please use --model {display_name} instead."
)
# Set the model
args.model = model_name
break

View File

@@ -10,12 +10,13 @@ This module provides functionality to:
import os
import platform
import shlex
import subprocess
import tempfile
from rich.console import Console
from aider.dump import dump # noqa
DEFAULT_EDITOR_NIX = "vi"
DEFAULT_EDITOR_OS_X = "vim"
DEFAULT_EDITOR_WINDOWS = "notepad"
@@ -87,13 +88,13 @@ def get_environment_editor(default=None):
def discover_editor(editor_override=None):
"""
Discovers and returns the appropriate editor command as a list of arguments.
Discovers and returns the appropriate editor command.
Handles cases where the editor command includes arguments, including quoted arguments
with spaces (e.g. 'vim -c "set noswapfile"').
:return: A list of command parts ready for subprocess execution
:rtype: list[str]
:return: The editor command as a string
:rtype: str
"""
system = platform.system()
if system == "Windows":
@@ -102,14 +103,13 @@ def discover_editor(editor_override=None):
default_editor = DEFAULT_EDITOR_OS_X
else:
default_editor = DEFAULT_EDITOR_NIX
if editor_override:
editor = editor_override
else:
editor = get_environment_editor(default_editor)
try:
return shlex.split(editor)
except ValueError as e:
raise RuntimeError(f"Invalid editor command format '{editor}': {e}")
return editor
def pipe_editor(input_data="", suffix=None, editor=None):
@@ -128,9 +128,10 @@ def pipe_editor(input_data="", suffix=None, editor=None):
:rtype: str
"""
filepath = write_temp_file(input_data, suffix)
command_parts = discover_editor(editor)
command_parts.append(filepath)
subprocess.call(command_parts)
command_str = discover_editor(editor)
command_str += " " + filepath
subprocess.call(command_str, shell=True)
with open(filepath, "r") as f:
output_data = f.read()
try:

View File

@@ -1,5 +1,7 @@
from dataclasses import dataclass
from aider.dump import dump # noqa: F401
@dataclass
class ExInfo:
@@ -50,6 +52,7 @@ EXCEPTIONS = [
class LiteLLMExceptions:
exceptions = dict()
exception_info = {exi.name: exi for exi in EXCEPTIONS}
def __init__(self):
self._load()
@@ -58,24 +61,26 @@ class LiteLLMExceptions:
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")
if var.endswith("Error"):
if var not in self.exception_info:
raise ValueError(f"{var} is in litellm but not in aider's exceptions list")
for var in self.exception_info:
ex = getattr(litellm, var)
self.exceptions[ex] = ex_info
self.exceptions[ex] = self.exception_info[var]
def exceptions_tuple(self):
return tuple(self.exceptions)
def get_ex_info(self, ex):
"""Return the ExInfo for a given exception instance"""
import litellm
if ex.__class__ is litellm.APIConnectionError:
if "google.auth" in str(ex):
return ExInfo(
"APIConnectionError", False, "You need to: pip install google-generativeai"
)
if "boto3" in str(ex):
return ExInfo("APIConnectionError", False, "You need to: pip install boto3")
return self.exceptions.get(ex.__class__, ExInfo(None, None, None))

View File

@@ -1,4 +1,7 @@
# This needs to sync with MANIFEST.in
exclude_website_pats = [
"**/.DS_Store",
"examples/**",
"_posts/**",
"HISTORY.md",
@@ -7,5 +10,4 @@ exclude_website_pats = [
"docs/unified-diffs.md",
"docs/leaderboards/index.md",
"assets/**",
"**/.DS_Store",
]

View File

@@ -2,7 +2,6 @@ import argparse
from aider import models, prompts
from aider.dump import dump # noqa: F401
from aider.sendchat import simple_send_with_retries
class ChatSummary:
@@ -26,6 +25,12 @@ class ChatSummary:
return sized
def summarize(self, messages, depth=0):
messages = self.summarize_real(messages)
if messages and messages[-1]["role"] != "assistant":
messages.append(dict(role="assistant", content="Ok."))
return messages
def summarize_real(self, messages, depth=0):
if not self.models:
raise ValueError("No models available for summarization")
@@ -88,7 +93,7 @@ class ChatSummary:
if summary_tokens + tail_tokens < self.max_tokens:
return result
return self.summarize(result, depth + 1)
return self.summarize_real(result, depth + 1)
def summarize_all(self, messages):
content = ""
@@ -108,9 +113,7 @@ class ChatSummary:
for model in self.models:
try:
summary = simple_send_with_retries(
model.name, summarize_messages, extra_params=model.extra_params
)
summary = model.simple_send_with_retries(summarize_messages)
if summary is not None:
summary = prompts.summary_prefix + summary
return [dict(role="user", content=summary)]

View File

@@ -1,5 +1,9 @@
import base64
import functools
import os
import shutil
import signal
import subprocess
import time
import webbrowser
from collections import defaultdict
@@ -11,9 +15,12 @@ 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.filters import Condition, is_searching
from prompt_toolkit.history import FileHistory
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.keys import Keys
from prompt_toolkit.lexers import PygmentsLexer
from prompt_toolkit.output.vt100 import is_dumb_terminal
from prompt_toolkit.shortcuts import CompleteStyle, PromptSession
from prompt_toolkit.styles import Style
from pygments.lexers import MarkdownLexer, guess_lexer_for_filename
@@ -29,6 +36,37 @@ from aider.mdstream import MarkdownStream
from .dump import dump # noqa: F401
from .utils import is_image_file
# Constants
NOTIFICATION_MESSAGE = "Aider is waiting for your input"
def ensure_hash_prefix(color):
"""Ensure hex color values have a # prefix."""
if not color:
return color
if isinstance(color, str) and color.strip() and not color.startswith("#"):
# Check if it's a valid hex color (3 or 6 hex digits)
if all(c in "0123456789ABCDEFabcdef" for c in color) and len(color) in (3, 6):
return f"#{color}"
return color
def restore_multiline(func):
"""Decorator to restore multiline mode after function execution"""
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
orig_multiline = self.multiline_mode
self.multiline_mode = False
try:
return func(self, *args, **kwargs)
except Exception:
raise
finally:
self.multiline_mode = orig_multiline
return wrapper
@dataclass
class ConfirmGroup:
@@ -173,6 +211,9 @@ class AutoCompleter(Completer):
class InputOutput:
num_error_outputs = 0
num_user_asks = 0
clipboard_watcher = None
bell_on_next_input = False
notifications_command = None
def __init__(
self,
@@ -193,27 +234,48 @@ class InputOutput:
completion_menu_current_bg_color=None,
code_theme="default",
encoding="utf-8",
line_endings="platform",
dry_run=False,
llm_history_file=None,
editingmode=EditingMode.EMACS,
fancy_input=True,
file_watcher=None,
multiline_mode=False,
root=".",
notifications=False,
notifications_command=None,
):
self.placeholder = None
self.interrupted = False
self.never_prompts = set()
self.editingmode = editingmode
self.multiline_mode = multiline_mode
self.bell_on_next_input = False
self.notifications = notifications
if notifications and notifications_command is None:
self.notifications_command = self.get_default_notification_command()
else:
self.notifications_command = notifications_command
no_color = os.environ.get("NO_COLOR")
if no_color is not None and no_color != "":
pretty = False
self.user_input_color = user_input_color if pretty else None
self.tool_output_color = tool_output_color if pretty else None
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.user_input_color = ensure_hash_prefix(user_input_color) if pretty else None
self.tool_output_color = ensure_hash_prefix(tool_output_color) if pretty else None
self.tool_error_color = ensure_hash_prefix(tool_error_color) if pretty else None
self.tool_warning_color = ensure_hash_prefix(tool_warning_color) if pretty else None
self.assistant_output_color = ensure_hash_prefix(assistant_output_color)
self.completion_menu_color = ensure_hash_prefix(completion_menu_color) if pretty else None
self.completion_menu_bg_color = (
ensure_hash_prefix(completion_menu_bg_color) if pretty else None
)
self.completion_menu_current_color = (
ensure_hash_prefix(completion_menu_current_color) if pretty else None
)
self.completion_menu_current_bg_color = (
ensure_hash_prefix(completion_menu_current_bg_color) if pretty else None
)
self.code_theme = code_theme
@@ -234,14 +296,29 @@ class InputOutput:
self.chat_history_file = None
self.encoding = encoding
valid_line_endings = {"platform", "lf", "crlf"}
if line_endings not in valid_line_endings:
raise ValueError(
f"Invalid line_endings value: {line_endings}. "
f"Must be one of: {', '.join(valid_line_endings)}"
)
self.newline = (
None if line_endings == "platform" else "\n" if line_endings == "lf" else "\r\n"
)
self.dry_run = dry_run
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.append_chat_history(f"\n# aider chat started at {current_time}\n\n")
self.prompt_session = None
self.is_dumb_terminal = is_dumb_terminal()
if self.is_dumb_terminal:
self.pretty = False
fancy_input = False
if fancy_input:
# Initialize PromptSession
# Initialize PromptSession only if we have a capable terminal
session_kwargs = {
"input": self.input,
"output": self.output,
@@ -260,6 +337,11 @@ class InputOutput:
self.tool_error(f"Can't initialize prompt toolkit: {err}") # non-pretty
else:
self.console = Console(force_terminal=False, no_color=True) # non-pretty
if self.is_dumb_terminal:
self.tool_output("Detected dumb terminal, disabling fancy input and pretty output.")
self.file_watcher = file_watcher
self.root = root
def _get_style(self):
style_dict = {}
@@ -314,25 +396,29 @@ class InputOutput:
self.tool_error(f"{filename}: {e}")
return
def read_text(self, filename):
def read_text(self, filename, silent=False):
if is_image_file(filename):
return self.read_image(filename)
try:
with open(str(filename), "r", encoding=self.encoding) as f:
return f.read()
except OSError as err:
self.tool_error(f"{filename}: unable to read: {err}")
return
except FileNotFoundError:
self.tool_error(f"{filename}: file not found error")
if not silent:
self.tool_error(f"{filename}: file not found error")
return
except IsADirectoryError:
self.tool_error(f"{filename}: is a directory")
if not silent:
self.tool_error(f"{filename}: is a directory")
return
except OSError as err:
if not silent:
self.tool_error(f"{filename}: unable to read: {err}")
return
except UnicodeError as e:
self.tool_error(f"{filename}: {e}")
self.tool_error("Use --encoding to set the unicode encoding.")
if not silent:
self.tool_error(f"{filename}: {e}")
self.tool_error("Use --encoding to set the unicode encoding.")
return
def write_text(self, filename, content, max_retries=5, initial_delay=0.1):
@@ -350,7 +436,7 @@ class InputOutput:
delay = initial_delay
for attempt in range(max_retries):
try:
with open(str(filename), "w", encoding=self.encoding) as f:
with open(str(filename), "w", encoding=self.encoding, newline=self.newline) as f:
f.write(content)
return # Successfully wrote the file
except PermissionError as err:
@@ -373,6 +459,13 @@ class InputOutput:
else:
print()
def interrupt_input(self):
if self.prompt_session and self.prompt_session.app:
# Store any partial input before interrupting
self.placeholder = self.prompt_session.app.current_buffer.text
self.interrupted = True
self.prompt_session.app.exit()
def get_input(
self,
root,
@@ -384,6 +477,9 @@ class InputOutput:
):
self.rule()
# Ring the bell if needed
self.ring_bell()
rel_fnames = list(rel_fnames)
show = ""
if rel_fnames:
@@ -393,6 +489,8 @@ class InputOutput:
show = self.format_files_for_input(rel_fnames, rel_read_only_fnames)
if edit_format:
show += edit_format
if self.multiline_mode:
show += (" " if edit_format else "") + "multi"
show += "> "
inp = ""
@@ -411,16 +509,51 @@ class InputOutput:
)
)
def suspend_to_bg(event):
"""Suspend currently running application."""
event.app.suspend_to_background()
kb = KeyBindings()
@kb.add(Keys.ControlZ, filter=Condition(lambda: hasattr(signal, "SIGTSTP")))
def _(event):
"Suspend to background with ctrl-z"
suspend_to_bg(event)
@kb.add("c-space")
def _(event):
"Ignore Ctrl when pressing space bar"
event.current_buffer.insert_text(" ")
@kb.add("escape", "c-m", eager=True)
@kb.add("c-up")
def _(event):
event.current_buffer.insert_text("\n")
"Navigate backward through history"
event.current_buffer.history_backward()
@kb.add("c-down")
def _(event):
"Navigate forward through history"
event.current_buffer.history_forward()
@kb.add("enter", eager=True, filter=~is_searching)
def _(event):
"Handle Enter key press"
if self.multiline_mode:
# In multiline mode, Enter adds a newline
event.current_buffer.insert_text("\n")
else:
# In normal mode, Enter submits
event.current_buffer.validate_and_handle()
@kb.add("escape", "enter", eager=True, filter=~is_searching) # This is Alt+Enter
def _(event):
"Handle Alt+Enter key press"
if self.multiline_mode:
# In multiline mode, Alt+Enter submits
event.current_buffer.validate_and_handle()
else:
# In normal mode, Alt+Enter adds a newline
event.current_buffer.insert_text("\n")
while True:
if multiline_input:
@@ -432,6 +565,16 @@ class InputOutput:
default = self.placeholder or ""
self.placeholder = None
self.interrupted = False
if not multiline_input:
if self.file_watcher:
self.file_watcher.start()
if self.clipboard_watcher:
self.clipboard_watcher.start()
def get_continuation(width, line_number, is_soft_wrap):
return ". "
line = self.prompt_session.prompt(
show,
default=default,
@@ -440,12 +583,35 @@ class InputOutput:
complete_style=CompleteStyle.MULTI_COLUMN,
style=style,
key_bindings=kb,
complete_while_typing=True,
prompt_continuation=get_continuation,
)
else:
line = input(show)
# Check if we were interrupted by a file change
if self.interrupted:
line = line or ""
if self.file_watcher:
cmd = self.file_watcher.process_changes()
return cmd
except EOFError:
raise
except Exception as err:
import traceback
self.tool_error(str(err))
self.tool_error(traceback.format_exc())
return ""
except UnicodeEncodeError as err:
self.tool_error(str(err))
return ""
finally:
if self.file_watcher:
self.file_watcher.stop()
if self.clipboard_watcher:
self.clipboard_watcher.stop()
if line.strip("\r\n") and not multiline_input:
stripped = line.strip("\r\n")
@@ -492,10 +658,13 @@ class InputOutput:
def add_to_input_history(self, inp):
if not self.input_history_file:
return
FileHistory(self.input_history_file).append_string(inp)
# Also add to the in-memory history if it exists
if self.prompt_session and self.prompt_session.history:
self.prompt_session.history.append_string(inp)
try:
FileHistory(self.input_history_file).append_string(inp)
# Also add to the in-memory history if it exists
if self.prompt_session and self.prompt_session.history:
self.prompt_session.history.append_string(inp)
except OSError as err:
self.tool_warning(f"Unable to write to input history file: {err}")
def get_input_history(self):
if not self.input_history_file:
@@ -551,6 +720,7 @@ class InputOutput:
return True
return False
@restore_multiline
def confirm_ask(
self,
question,
@@ -562,6 +732,9 @@ class InputOutput:
):
self.num_user_asks += 1
# Ring the bell if needed
self.ring_bell()
question_id = (question, subject)
if question_id in self.never_prompts:
@@ -572,19 +745,22 @@ class InputOutput:
if group:
allow_never = True
valid_responses = ["yes", "no"]
valid_responses = ["yes", "no", "skip", "all"]
options = " (Y)es/(N)o"
if group:
if not explicit_yes_required:
options += "/(A)ll"
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 default.lower().startswith("y"):
question += options + " [Yes]: "
elif default.lower().startswith("n"):
question += options + " [No]: "
else:
question += options + f" [{default}]: "
if subject:
self.tool_output()
@@ -613,16 +789,22 @@ class InputOutput:
self.user_input(f"{question}{res}", log_only=False)
else:
while True:
if self.prompt_session:
res = self.prompt_session.prompt(
question,
style=style,
)
else:
res = input(question)
try:
if self.prompt_session:
res = self.prompt_session.prompt(
question,
style=style,
complete_while_typing=False,
)
else:
res = input(question)
except EOFError:
# Treat EOF (Ctrl+D) as if the user pressed Enter
res = default
break
if not res:
res = "y" # Default to Yes if no input
res = default
break
res = res.lower()
good = any(valid_response.startswith(res) for valid_response in valid_responses)
@@ -659,9 +841,13 @@ class InputOutput:
return is_yes
@restore_multiline
def prompt_ask(self, question, default="", subject=None):
self.num_user_asks += 1
# Ring the bell if needed
self.ring_bell()
if subject:
self.tool_output()
self.tool_output(subject, bold=True)
@@ -673,10 +859,19 @@ class InputOutput:
elif self.yes is False:
res = "no"
else:
if self.prompt_session:
res = self.prompt_session.prompt(question + " ", default=default, style=style)
else:
res = input(question + " ")
try:
if self.prompt_session:
res = self.prompt_session.prompt(
question + " ",
default=default,
style=style,
complete_while_typing=True,
)
else:
res = input(question + " ")
except EOFError:
# Treat EOF (Ctrl+D) as if the user pressed Enter
res = default
hist = f"{question.strip()} {res.strip()}"
self.append_chat_history(hist, linebreak=True, blockquote=True)
@@ -694,9 +889,17 @@ class InputOutput:
hist = message.strip() if strip else message
self.append_chat_history(hist, linebreak=True, blockquote=True)
message = Text(message)
if not isinstance(message, Text):
message = Text(message)
style = dict(style=color) if self.pretty and color else dict()
self.console.print(message, **style)
try:
self.console.print(message, **style)
except UnicodeEncodeError:
# Fallback to ASCII-safe output
if isinstance(message, Text):
message = message.plain
message = str(message).encode("ascii", errors="replace").decode("ascii")
self.console.print(message, **style)
def tool_error(self, message="", strip=True):
self.num_error_outputs += 1
@@ -730,6 +933,10 @@ class InputOutput:
return mdStream
def assistant_output(self, message, pretty=None):
if not message:
self.tool_warning("Empty response received from LLM. Check your provider account?")
return
show_resp = message
# Coder will force pretty off if fence is not triple-backticks
@@ -741,7 +948,7 @@ class InputOutput:
message, style=self.assistant_output_color, code_theme=self.code_theme
)
else:
show_resp = Text(message or "<no response>")
show_resp = Text(message or "(empty response)")
self.console.print(show_resp)
@@ -752,6 +959,73 @@ class InputOutput:
def print(self, message=""):
print(message)
def llm_started(self):
"""Mark that the LLM has started processing, so we should ring the bell on next input"""
self.bell_on_next_input = True
def get_default_notification_command(self):
"""Return a default notification command based on the operating system."""
import platform
system = platform.system()
if system == "Darwin": # macOS
# Check for terminal-notifier first
if shutil.which("terminal-notifier"):
return f"terminal-notifier -title 'Aider' -message '{NOTIFICATION_MESSAGE}'"
# Fall back to osascript
return (
f'osascript -e \'display notification "{NOTIFICATION_MESSAGE}" with title "Aider"\''
)
elif system == "Linux":
# Check for common Linux notification tools
for cmd in ["notify-send", "zenity"]:
if shutil.which(cmd):
if cmd == "notify-send":
return f"notify-send 'Aider' '{NOTIFICATION_MESSAGE}'"
elif cmd == "zenity":
return f"zenity --notification --text='{NOTIFICATION_MESSAGE}'"
return None # No known notification tool found
elif system == "Windows":
# PowerShell notification
return (
"powershell -command"
" \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');"
f" [System.Windows.Forms.MessageBox]::Show('{NOTIFICATION_MESSAGE}',"
" 'Aider')\""
)
return None # Unknown system
def ring_bell(self):
"""Ring the terminal bell if needed and clear the flag"""
if self.bell_on_next_input and self.notifications:
if self.notifications_command:
try:
result = subprocess.run(
self.notifications_command, shell=True, capture_output=True
)
if result.returncode != 0 and result.stderr:
error_msg = result.stderr.decode("utf-8", errors="replace")
self.tool_warning(f"Failed to run notifications command: {error_msg}")
except Exception as e:
self.tool_warning(f"Failed to run notifications command: {e}")
else:
print("\a", end="", flush=True) # Ring the bell
self.bell_on_next_input = False # Clear the flag
def toggle_multiline_mode(self):
"""Toggle between normal and multiline input modes"""
self.multiline_mode = not self.multiline_mode
if self.multiline_mode:
self.tool_output(
"Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text"
)
else:
self.tool_output(
"Multiline mode: Disabled. Alt-Enter inserts newline, Enter submits text"
)
def append_chat_history(self, text, linebreak=False, blockquote=False, strip=True):
if blockquote:
if strip:
@@ -793,7 +1067,13 @@ class InputOutput:
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
# Use shorter of abs/rel paths for readonly files
ro_paths = []
for rel_path in read_only_files:
abs_path = os.path.abspath(os.path.join(self.root, rel_path))
ro_paths.append(abs_path if len(abs_path) < len(rel_path) else rel_path)
files_with_label = ["Readonly:"] + ro_paths
read_only_output = StringIO()
Console(file=read_only_output, force_terminal=False).print(Columns(files_with_label))
read_only_lines = read_only_output.getvalue().splitlines()

View File

@@ -8,9 +8,10 @@ from dataclasses import dataclass
from pathlib import Path
from grep_ast import TreeContext, filename_to_lang
from tree_sitter_languages import get_parser # noqa: E402
from grep_ast.tsl import get_parser # noqa: E402
from aider.dump import dump # noqa: F401
from aider.run_cmd import run_cmd_subprocess # noqa: F401
# tree_sitter is throwing a FutureWarning
warnings.simplefilter("ignore", category=FutureWarning)
@@ -44,26 +45,22 @@ class Linter:
def run_cmd(self, cmd, rel_fname, code):
cmd += " " + rel_fname
cmd = cmd.split()
returncode = 0
stdout = ""
try:
process = subprocess.Popen(
returncode, stdout = run_cmd_subprocess(
cmd,
cwd=self.root,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
encoding=self.encoding,
errors="replace",
)
except OSError as err:
print(f"Unable to execute lint command: {err}")
return
stdout, _ = process.communicate()
errors = stdout
if process.returncode == 0:
if returncode == 0:
return # zero exit status
cmd = " ".join(cmd)
res = f"## Running: {cmd}\n\n"
res += errors
@@ -152,12 +149,12 @@ class Linter:
try:
result = subprocess.run(
flake8_cmd,
cwd=self.root,
capture_output=True,
text=True,
check=False,
encoding=self.encoding,
errors="replace",
cwd=self.root,
)
errors = result.stdout + result.stderr
except Exception as e:

View File

@@ -2,6 +2,8 @@ import importlib
import os
import warnings
from aider.dump import dump # noqa: F401
warnings.filterwarnings("ignore", category=UserWarning, module="pydantic")
AIDER_SITE_URL = "https://aider.chat"
@@ -13,6 +15,8 @@ os.environ["LITELLM_MODE"] = "PRODUCTION"
# `import litellm` takes 1.5 seconds, defer it!
VERBOSE = False
class LazyLiteLLM:
_lazy_module = None
@@ -27,6 +31,9 @@ class LazyLiteLLM:
if self._lazy_module is not None:
return
if VERBOSE:
print("Loading litellm...")
self._lazy_module = importlib.import_module("litellm")
self._lazy_module.suppress_debug_info = True

View File

@@ -1,4 +1,3 @@
import configparser
import json
import os
import re
@@ -9,7 +8,11 @@ import webbrowser
from dataclasses import fields
from pathlib import Path
import git
try:
import git
except ImportError:
git = None
import importlib_resources
from dotenv import load_dotenv
from prompt_toolkit.enums import EditingMode
@@ -20,6 +23,8 @@ from aider.args import get_parser
from aider.coders import Coder
from aider.coders.base_coder import UnknownEditFormat
from aider.commands import Commands, SwitchCoder
from aider.copypaste import ClipboardWatcher
from aider.deprecated import handle_deprecated_model_args
from aider.format_settings import format_settings, scrub_sensitive_info
from aider.history import ChatSummary
from aider.io import InputOutput
@@ -28,6 +33,7 @@ from aider.models import ModelSettings
from aider.repo import ANY_GIT_ERROR, GitRepo
from aider.report import report_uncaught_exceptions
from aider.versioncheck import check_version, install_from_main_branch, install_upgrade
from aider.watch import FileWatcher
from .dump import dump # noqa: F401
@@ -91,6 +97,9 @@ def make_new_repo(git_root, io):
def setup_git(git_root, io):
if git is None:
return
try:
cwd = Path.cwd()
except OSError:
@@ -104,7 +113,9 @@ def setup_git(git_root, io):
except ANY_GIT_ERROR:
pass
elif cwd == Path.home():
io.tool_warning("You should probably run aider in a directory, not your home dir.")
io.tool_warning(
"You should probably run aider in your project's directory, not your home dir."
)
return
elif cwd and io.confirm_ask(
"No git repo found, create one to track aider's changes (recommended)?"
@@ -115,17 +126,8 @@ def setup_git(git_root, io):
if not repo:
return
user_name = None
user_email = None
with repo.config_reader() as config:
try:
user_name = config.get_value("user", "name", None)
except (configparser.NoSectionError, configparser.NoOptionError):
pass
try:
user_email = config.get_value("user", "email", None)
except (configparser.NoSectionError, configparser.NoOptionError):
pass
user_name = repo.git.config("--default", "", "--get", "user.name") or None
user_email = repo.git.config("--default", "", "--get", "user.email") or None
if user_name and user_email:
return repo.working_tree_dir
@@ -147,39 +149,51 @@ def check_gitignore(git_root, io, ask=True):
try:
repo = git.Repo(git_root)
if repo.ignored(".aider") and repo.ignored(".env"):
patterns_to_add = []
if not repo.ignored(".aider"):
patterns_to_add.append(".aider*")
env_path = Path(git_root) / ".env"
if env_path.exists() and not repo.ignored(".env"):
patterns_to_add.append(".env")
if not patterns_to_add:
return
gitignore_file = Path(git_root) / ".gitignore"
if gitignore_file.exists():
try:
content = io.read_text(gitignore_file)
if content is None:
return
if not content.endswith("\n"):
content += "\n"
except OSError as e:
io.tool_error(f"Error when trying to read {gitignore_file}: {e}")
return
else:
content = ""
except ANY_GIT_ERROR:
pass
return
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:
if ask:
io.tool_output("You can skip this check with --no-gitignore")
if not io.confirm_ask(f"Add {', '.join(patterns_to_add)} to .gitignore (recommended)?"):
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 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 += "\n".join(patterns_to_add) + "\n"
io.write_text(gitignore_file, content)
io.tool_output(f"Added {', '.join(patterns_to_add)} to .gitignore")
try:
io.write_text(gitignore_file, content)
io.tool_output(f"Added {', '.join(patterns_to_add)} to .gitignore")
except OSError as e:
io.tool_error(f"Error when trying to write to {gitignore_file}: {e}")
io.tool_output(
"Try running with appropriate permissions or manually add these patterns to .gitignore:"
)
for pattern in patterns_to_add:
io.tool_output(f" {pattern}")
def check_streamlit_install(io):
@@ -191,6 +205,22 @@ def check_streamlit_install(io):
)
def write_streamlit_credentials():
from streamlit.file_util import get_streamlit_file_path
# See https://github.com/Aider-AI/aider/issues/772
credential_path = Path(get_streamlit_file_path()) / "credentials.toml"
if not os.path.exists(credential_path):
empty_creds = '[general]\nemail = ""\n'
os.makedirs(os.path.dirname(credential_path), exist_ok=True)
with open(credential_path, "w") as f:
f.write(empty_creds)
else:
print("Streamlit credentials already exist.")
def launch_gui(args):
from streamlit.web import cli
@@ -199,6 +229,9 @@ def launch_gui(args):
print()
print("CONTROL-C to exit...")
# Necessary so streamlit does not prompt the user for an email address.
write_streamlit_credentials()
target = gui.__file__
st_args = ["run", target]
@@ -336,18 +369,18 @@ def load_dotenv_files(git_root, dotenv_fname, encoding="utf-8"):
def register_litellm_models(git_root, model_metadata_fname, io, verbose=False):
model_metatdata_files = []
model_metadata_files = []
# Add the resource file path
resource_metadata = importlib_resources.files("aider.resources").joinpath("model-metadata.json")
model_metatdata_files.append(str(resource_metadata))
model_metadata_files.append(str(resource_metadata))
model_metatdata_files += generate_search_path_list(
model_metadata_files += generate_search_path_list(
".aider.model.metadata.json", git_root, model_metadata_fname
)
try:
model_metadata_files_loaded = models.register_litellm_models(model_metatdata_files)
model_metadata_files_loaded = models.register_litellm_models(model_metadata_files)
if len(model_metadata_files_loaded) > 0 and verbose:
io.tool_output("Loaded model metadata from:")
for model_metadata_file in model_metadata_files_loaded:
@@ -371,6 +404,12 @@ def sanity_check_repo(repo, io):
if not repo.git_repo_error:
return True
error_msg = str(repo.git_repo_error)
except UnicodeDecodeError as exc:
error_msg = (
"Failed to read the Git repository. This issue is likely caused by a path encoded "
f'in a format different from the expected encoding "{sys.getfilesystemencoding()}".\n'
f"Internal error: {str(exc)}"
)
except ANY_GIT_ERROR as exc:
error_msg = str(exc)
bad_ver = "version in (1, 2)" in error_msg
@@ -396,7 +435,9 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if argv is None:
argv = sys.argv[1:]
if force_git_root:
if git is None:
git_root = None
elif force_git_root:
git_root = force_git_root
else:
git_root = get_git_root()
@@ -443,6 +484,9 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
# Parse again to include any arguments that might have been defined in .env
args = parser.parse_args(argv)
if git is None:
args.git = False
if args.analytics_disable:
analytics = Analytics(permanently_disable=True)
print("Analytics have been permanently disabled.")
@@ -454,6 +498,11 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
litellm._load_litellm()
litellm._lazy_module.client_session = httpx.Client(verify=False)
litellm._lazy_module.aclient_session = httpx.AsyncClient(verify=False)
# Set verify_ssl on the model_info_manager
models.model_info_manager.set_verify_ssl(False)
if args.timeout:
models.request_timeout = args.timeout
if args.dark_mode:
args.user_input_color = "#32FF32"
@@ -494,9 +543,13 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
code_theme=args.code_theme,
dry_run=args.dry_run,
encoding=args.encoding,
line_endings=args.line_endings,
llm_history_file=args.llm_history_file,
editingmode=editing_mode,
fancy_input=args.fancy_input,
multiline_mode=args.multiline,
notifications=args.notifications,
notifications_command=args.notifications_command,
)
io = get_io(args.pretty)
@@ -508,6 +561,53 @@ 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)")
# Process any environment variables set via --set-env
if args.set_env:
for env_setting in args.set_env:
try:
name, value = env_setting.split("=", 1)
os.environ[name.strip()] = value.strip()
except ValueError:
io.tool_error(f"Invalid --set-env format: {env_setting}")
io.tool_output("Format should be: ENV_VAR_NAME=value")
return 1
# Process any API keys set via --api-key
if args.api_key:
for api_setting in args.api_key:
try:
provider, key = api_setting.split("=", 1)
env_var = f"{provider.strip().upper()}_API_KEY"
os.environ[env_var] = key.strip()
except ValueError:
io.tool_error(f"Invalid --api-key format: {api_setting}")
io.tool_output("Format should be: provider=key")
return 1
if args.anthropic_api_key:
os.environ["ANTHROPIC_API_KEY"] = args.anthropic_api_key
if args.openai_api_key:
os.environ["OPENAI_API_KEY"] = args.openai_api_key
# Handle deprecated model shortcut args
handle_deprecated_model_args(args, io)
if args.openai_api_base:
os.environ["OPENAI_API_BASE"] = args.openai_api_base
if args.openai_api_version:
io.tool_warning(
"--openai-api-version is deprecated, use --set-env OPENAI_API_VERSION=<value>"
)
os.environ["OPENAI_API_VERSION"] = args.openai_api_version
if args.openai_api_type:
io.tool_warning("--openai-api-type is deprecated, use --set-env OPENAI_API_TYPE=<value>")
os.environ["OPENAI_API_TYPE"] = args.openai_api_type
if args.openai_organization_id:
io.tool_warning(
"--openai-organization-id is deprecated, use --set-env OPENAI_ORGANIZATION=<value>"
)
os.environ["OPENAI_ORGANIZATION"] = args.openai_organization_id
analytics = Analytics(logfile=args.analytics_log, permanently_disable=args.analytics_disable)
if args.analytics is not False:
if analytics.need_to_ask(args.analytics):
@@ -535,9 +635,11 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if args.gui and not return_coder:
if not check_streamlit_install(io):
analytics.event("exit", reason="Streamlit not installed")
return
analytics.event("gui session")
launch_gui(argv)
analytics.event("exit", reason="GUI session ended")
return
if args.verbose:
@@ -548,7 +650,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
fnames = [str(Path(fn).resolve()) for fn in all_files]
read_only_fnames = []
for fn in args.read or []:
path = Path(fn).resolve()
path = Path(fn).expanduser().resolve()
if path.is_dir():
read_only_fnames.extend(str(f) for f in path.rglob("*") if f.is_file())
else:
@@ -564,6 +666,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
io.tool_output(
"Provide either a single directory of a git repo, or a list of one or more files."
)
analytics.event("exit", reason="Invalid directory input")
return 1
git_dname = None
@@ -574,26 +677,31 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
fnames = []
else:
io.tool_error(f"{all_files[0]} is a directory, but --no-git selected.")
analytics.event("exit", reason="Directory with --no-git")
return 1
# We can't know the git repo for sure until after parsing the args.
# If we guessed wrong, reparse because that changes things like
# the location of the config.yml and history files.
if args.git and not force_git_root:
if args.git and not force_git_root and git is not None:
right_repo_root = guessed_wrong_repo(io, git_root, fnames, git_dname)
if right_repo_root:
analytics.event("exit", reason="Recursing with correct repo")
return main(argv, input, output, right_repo_root, return_coder=return_coder)
if args.just_check_update:
update_available = check_version(io, just_check=True, verbose=args.verbose)
analytics.event("exit", reason="Just checking update")
return 0 if not update_available else 1
if args.install_main_branch:
success = install_from_main_branch(io)
analytics.event("exit", reason="Installed main branch")
return 0 if success else 1
if args.upgrade:
success = install_upgrade(io)
analytics.event("exit", reason="Upgrade completed")
return 0 if success else 1
if args.check_update:
@@ -601,6 +709,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if args.list_models:
models.print_matching_models(io, args.list_models)
analytics.event("exit", reason="Listed models")
return 0
if args.git:
@@ -619,20 +728,6 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
is_first_run = is_first_run_of_new_version(io, verbose=args.verbose)
check_and_load_imports(io, is_first_run, verbose=args.verbose)
if args.anthropic_api_key:
os.environ["ANTHROPIC_API_KEY"] = args.anthropic_api_key
if args.openai_api_key:
os.environ["OPENAI_API_KEY"] = args.openai_api_key
if args.openai_api_base:
os.environ["OPENAI_API_BASE"] = args.openai_api_base
if args.openai_api_version:
os.environ["OPENAI_API_VERSION"] = args.openai_api_version
if args.openai_api_type:
os.environ["OPENAI_API_TYPE"] = args.openai_api_type
if args.openai_organization_id:
os.environ["OPENAI_ORGANIZATION"] = args.openai_organization_id
register_models(git_root, args.model_settings_file, io, verbose=args.verbose)
register_litellm_models(git_root, args.model_metadata_file, io, verbose=args.verbose)
@@ -644,14 +739,32 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if len(parts) != 2:
io.tool_error(f"Invalid alias format: {alias_def}")
io.tool_output("Format should be: alias:model-name")
analytics.event("exit", reason="Invalid alias format error")
return 1
alias, model = parts
models.MODEL_ALIASES[alias.strip()] = model.strip()
if not args.model:
args.model = "gpt-4o-2024-08-06"
if os.environ.get("ANTHROPIC_API_KEY"):
args.model = "claude-3-5-sonnet-20241022"
# Select model based on available API keys
model_key_pairs = [
("ANTHROPIC_API_KEY", "sonnet"),
("DEEPSEEK_API_KEY", "deepseek"),
("OPENROUTER_API_KEY", "openrouter/anthropic/claude-3.7-sonnet"),
("OPENAI_API_KEY", "gpt-4o"),
("GEMINI_API_KEY", "flash"),
]
for env_key, model_name in model_key_pairs:
if os.environ.get(env_key):
args.model = model_name
io.tool_warning(
f"Found {env_key} so using {model_name} since no --model was specified."
)
break
if not args.model:
io.tool_error("You need to specify a --model and an --api-key to use.")
io.offer_url(urls.models_and_keys, "Open documentation url for more info?")
return 1
main_model = models.Model(
args.model,
@@ -660,6 +773,24 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
editor_edit_format=args.editor_edit_format,
)
# Check if deprecated remove_reasoning is set
if main_model.remove_reasoning is not None:
io.tool_warning(
"Model setting 'remove_reasoning' is deprecated, please use 'reasoning_tag' instead."
)
# Set reasoning effort if specified
if args.reasoning_effort is not None:
main_model.set_reasoning_effort(args.reasoning_effort)
# Set thinking tokens if specified
if args.thinking_tokens is not None:
main_model.set_thinking_tokens(args.thinking_tokens)
if args.copy_paste and args.edit_format is None:
if main_model.edit_format in ("diff", "whole"):
main_model.edit_format = "editor-" + main_model.edit_format
if args.verbose:
io.tool_output("Model metadata:")
io.tool_output(json.dumps(main_model.info, indent=4))
@@ -672,6 +803,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
lint_cmds = parse_lint_cmds(args.lint_cmd, io)
if lint_cmds is None:
analytics.event("exit", reason="Invalid lint command format")
return 1
if args.show_model_warnings:
@@ -684,6 +816,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
io.offer_url(urls.model_warnings, "Open documentation url for more info?")
io.tool_output()
except KeyboardInterrupt:
analytics.event("exit", reason="Keyboard interrupt during model warnings")
return 1
repo = None
@@ -707,11 +840,20 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if not args.skip_sanity_check_repo:
if not sanity_check_repo(repo, io):
analytics.event("exit", reason="Repository sanity check failed")
return 1
if repo:
analytics.event("repo", num_files=len(repo.get_tracked_files()))
else:
analytics.event("no-repo")
commands = Commands(
io,
None,
voice_language=args.voice_language,
voice_input_device=args.voice_input_device,
voice_format=args.voice_format,
verify_ssl=args.verify_ssl,
args=args,
parser=parser,
@@ -734,6 +876,11 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
)
args.stream = False
if args.map_tokens is None:
map_tokens = main_model.get_repo_map_tokens()
else:
map_tokens = args.map_tokens
try:
coder = Coder.create(
main_model=main_model,
@@ -746,7 +893,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
auto_commits=args.auto_commits,
dirty_commits=args.dirty_commits,
dry_run=args.dry_run,
map_tokens=args.map_tokens,
map_tokens=map_tokens,
verbose=args.verbose,
stream=args.stream,
use_git=args.git,
@@ -765,18 +912,42 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
suggest_shell_commands=args.suggest_shell_commands,
chat_language=args.chat_language,
detect_urls=args.detect_urls,
auto_copy_context=args.copy_paste,
)
except UnknownEditFormat as err:
io.tool_error(str(err))
io.offer_url(urls.edit_formats, "Open documentation about edit formats?")
analytics.event("exit", reason="Unknown edit format")
return 1
except ValueError as err:
io.tool_error(str(err))
analytics.event("exit", reason="ValueError during coder creation")
return 1
if return_coder:
analytics.event("exit", reason="Returning coder object")
return coder
ignores = []
if git_root:
ignores.append(str(Path(git_root) / ".gitignore"))
if args.aiderignore:
ignores.append(args.aiderignore)
if args.watch_files:
file_watcher = FileWatcher(
coder,
gitignores=ignores,
verbose=args.verbose,
analytics=analytics,
root=str(Path.cwd()) if args.subtree_only else None,
)
coder.file_watcher = file_watcher
if args.copy_paste:
analytics.event("copy-paste mode")
ClipboardWatcher(coder.io, verbose=args.verbose)
coder.show_announcements()
if args.show_prompts:
@@ -785,6 +956,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
]
messages = coder.format_messages().all_messages()
utils.show_messages(messages)
analytics.event("exit", reason="Showed prompts")
return
if args.lint:
@@ -793,10 +965,11 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if args.test:
if not args.test_cmd:
io.tool_error("No --test-cmd provided.")
analytics.event("exit", reason="No test command provided")
return 1
test_errors = coder.commands.cmd_test(args.test_cmd)
if test_errors:
coder.run(test_errors)
coder.commands.cmd_test(args.test_cmd)
if io.placeholder:
coder.run(io.placeholder)
if args.commit:
if args.dry_run:
@@ -805,32 +978,33 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
coder.commands.cmd_commit()
if args.lint or args.test or args.commit:
analytics.event("exit", reason="Completed lint/test/commit")
return
if args.show_repo_map:
repo_map = coder.get_repo_map()
if repo_map:
io.tool_output(repo_map)
analytics.event("exit", reason="Showed repo map")
return
if args.apply:
content = io.read_text(args.apply)
if content is None:
analytics.event("exit", reason="Failed to read apply content")
return
coder.partial_response_content = content
# For testing #2879
# from aider.coders.base_coder import all_fences
# coder.fence = all_fences[1]
coder.apply_updates()
analytics.event("exit", reason="Applied 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.")
io.tool_output('Use /help <question> for help, run "aider --help" to see cmd line args')
if args.show_release_notes is True:
io.tool_output(f"Opening release notes: {urls.release_notes}")
io.tool_output()
@@ -862,6 +1036,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
coder.run(with_message=args.message)
except SwitchCoder:
pass
analytics.event("exit", reason="Completed --message")
return
if args.message_file:
@@ -871,22 +1046,31 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
coder.run(with_message=message_from_file)
except FileNotFoundError:
io.tool_error(f"Message file not found: {args.message_file}")
analytics.event("exit", reason="Message file not found")
return 1
except IOError as e:
io.tool_error(f"Error reading message file: {e}")
analytics.event("exit", reason="Message file IO error")
return 1
analytics.event("exit", reason="Completed --message-file")
return
if args.exit:
analytics.event("exit", reason="Exit flag set")
return
analytics.event("cli session", main_model=main_model, edit_format=main_model.edit_format)
while True:
try:
coder.ok_to_warm_cache = bool(args.cache_keepalive_pings)
coder.run()
analytics.event("exit", reason="Completed main CLI coder.run")
return
except SwitchCoder as switch:
coder.ok_to_warm_cache = False
kwargs = dict(io=io, from_coder=coder)
kwargs.update(switch.kwargs)
if "show_announcements" in kwargs:
@@ -903,6 +1087,10 @@ def is_first_run_of_new_version(io, verbose=False):
installs_file = Path.home() / ".aider" / "installs.json"
key = (__version__, sys.executable)
# Never show notes for .dev versions
if ".dev" in __version__:
return False
if verbose:
io.tool_output(
f"Checking imports for version {__version__} and executable {sys.executable}"

View File

@@ -10,10 +10,17 @@ from rich.text import Text
from aider.dump import dump # noqa: F401
_text = """
_text_prefix = """
# Header
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,
when an unknown printer took a galley of type and scrambled it to make a type
specimen book. It has survived not only five centuries, but also the leap into
electronic typesetting, remaining essentially unchanged. It was popularised in
the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
and more recently with desktop publishing software like Aldus PageMaker
including versions of Lorem Ipsum.
@@ -27,10 +34,9 @@ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem
```python
import sys
"""
def greeting():
print("Hello world!")
_text_suffix = """
```
## Sub header too
@@ -41,81 +47,146 @@ The end.
class MarkdownStream:
live = None
when = 0
min_delay = 0.050
live_window = 6
"""Streaming markdown renderer that progressively displays content with a live updating window.
Uses rich.console and rich.live to render markdown content with smooth scrolling
and partial updates. Maintains a sliding window of visible content while streaming
in new markdown text.
"""
live = None # Rich Live display instance
when = 0 # Timestamp of last update
min_delay = 1.0 / 20 # Minimum time between updates (20fps)
live_window = 6 # Number of lines to keep visible at bottom during streaming
def __init__(self, mdargs=None):
self.printed = []
"""Initialize the markdown stream.
Args:
mdargs (dict, optional): Additional arguments to pass to rich Markdown renderer
"""
self.printed = [] # Stores lines that have already been printed
if mdargs:
self.mdargs = mdargs
else:
self.mdargs = dict()
# Initialize rich Live display with empty text
self.live = Live(Text(""), refresh_per_second=1.0 / self.min_delay)
self.live.start()
def _render_markdown_to_lines(self, text):
"""Render markdown text to a list of lines.
Args:
text (str): Markdown text to render
Returns:
list: List of rendered lines with line endings preserved
"""
# Render the markdown to a string buffer
string_io = io.StringIO()
console = Console(file=string_io, force_terminal=True)
markdown = Markdown(text, **self.mdargs)
console.print(markdown)
output = string_io.getvalue()
# Split rendered output into lines
return output.splitlines(keepends=True)
def __del__(self):
"""Destructor to ensure Live display is properly cleaned up."""
if self.live:
try:
self.live.stop()
except Exception:
pass
pass # Ignore any errors during cleanup
def update(self, text, final=False):
"""Update the displayed markdown content.
Args:
text (str): The markdown text received so far
final (bool): If True, this is the final update and we should clean up
Splits the output into "stable" older lines and the "last few" lines
which aren't considered stable. They may shift around as new chunks
are appended to the markdown text.
The stable lines emit to the console above the Live window.
The unstable lines emit into the Live window so they can be repainted.
Markdown going to the console works better in terminal scrollback buffers.
The live window doesn't play nice with terminal scrollback.
"""
now = time.time()
# Throttle updates to maintain smooth rendering
if not final and now - self.when < self.min_delay:
return
self.when = now
string_io = io.StringIO()
console = Console(file=string_io, force_terminal=True)
# Measure render time and adjust min_delay to maintain smooth rendering
start = time.time()
lines = self._render_markdown_to_lines(text)
render_time = time.time() - start
markdown = Markdown(text, **self.mdargs)
# Set min_delay to render time plus a small buffer
self.min_delay = min(max(render_time * 10, 1.0 / 20), 2)
console.print(markdown)
output = string_io.getvalue()
lines = output.splitlines(keepends=True)
num_lines = len(lines)
# How many lines have "left" the live window and are now considered stable?
# Or if final, consider all lines to be stable.
if not final:
num_lines -= self.live_window
# If we have stable content to display...
if final or num_lines > 0:
# How many stable lines do we need to newly show above the live window?
num_printed = len(self.printed)
show = num_lines - num_printed
# Skip if no new lines to show above live window
if show <= 0:
return
# Get the new lines and display them
show = lines[num_printed:num_lines]
show = "".join(show)
show = Text.from_ansi(show)
self.live.console.print(show)
self.live.console.print(show) # to the console above the live area
# Update our record of printed lines
self.printed = lines[:num_lines]
# Handle final update cleanup
if final:
self.live.update(Text(""))
self.live.stop()
self.live = None
else:
rest = lines[num_lines:]
rest = "".join(rest)
# rest = '...\n' + rest
rest = Text.from_ansi(rest)
self.live.update(rest)
return
# Update the live window with remaining lines
rest = lines[num_lines:]
rest = "".join(rest)
rest = Text.from_ansi(rest)
self.live.update(rest)
def find_minimal_suffix(self, text, match_lines=50):
"""
Splits text into chunks on blank lines "\n\n".
"""
if __name__ == "__main__":
_text = 5 * _text
with open("aider/io.py", "r") as f:
code = f.read()
_text = _text_prefix + code + _text_suffix
_text = _text * 10
pm = MarkdownStream()
for i in range(6, len(_text)):
for i in range(6, len(_text), 5):
pm.update(_text[:i])
time.sleep(0.01)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,26 @@
; Based on https://github.com/tree-sitter/tree-sitter-c-sharp/blob/master/queries/tags.scm
; MIT License.
(class_declaration name: (identifier) @name.definition.class) @definition.class
(class_declaration (base_list (_) @name.reference.class)) @reference.class
(interface_declaration name: (identifier) @name.definition.interface) @definition.interface
(interface_declaration (base_list (_) @name.reference.interface)) @reference.interface
(method_declaration name: (identifier) @name.definition.method) @definition.method
(object_creation_expression type: (identifier) @name.reference.class) @reference.class
(type_parameter_constraints_clause (identifier) @name.reference.class) @reference.class
(type_parameter_constraint (type type: (identifier) @name.reference.class)) @reference.class
(variable_declaration type: (identifier) @name.reference.class) @reference.class
(invocation_expression function: (member_access_expression name: (identifier) @name.reference.send)) @reference.send
(namespace_declaration name: (identifier) @name.definition.module) @definition.module
(namespace_declaration name: (identifier) @name.definition.module) @module

View File

@@ -0,0 +1,88 @@
(
(comment)* @doc
.
(method_definition
name: (property_identifier) @name.definition.method) @definition.method
(#not-eq? @name.definition.method "constructor")
(#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$")
(#select-adjacent! @doc @definition.method)
)
(
(comment)* @doc
.
[
(class
name: (_) @name.definition.class)
(class_declaration
name: (_) @name.definition.class)
] @definition.class
(#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$")
(#select-adjacent! @doc @definition.class)
)
(
(comment)* @doc
.
[
(function_expression
name: (identifier) @name.definition.function)
(function_declaration
name: (identifier) @name.definition.function)
(generator_function
name: (identifier) @name.definition.function)
(generator_function_declaration
name: (identifier) @name.definition.function)
] @definition.function
(#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$")
(#select-adjacent! @doc @definition.function)
)
(
(comment)* @doc
.
(lexical_declaration
(variable_declarator
name: (identifier) @name.definition.function
value: [(arrow_function) (function_expression)]) @definition.function)
(#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$")
(#select-adjacent! @doc @definition.function)
)
(
(comment)* @doc
.
(variable_declaration
(variable_declarator
name: (identifier) @name.definition.function
value: [(arrow_function) (function_expression)]) @definition.function)
(#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$")
(#select-adjacent! @doc @definition.function)
)
(assignment_expression
left: [
(identifier) @name.definition.function
(member_expression
property: (property_identifier) @name.definition.function)
]
right: [(arrow_function) (function_expression)]
) @definition.function
(pair
key: (property_identifier) @name.definition.function
value: [(arrow_function) (function_expression)]) @definition.function
(
(call_expression
function: (identifier) @name.reference.call) @reference.call
(#not-match? @name.reference.call "^(require)$")
)
(call_expression
function: (member_expression
property: (property_identifier) @name.reference.call)
arguments: (_) @reference.call)
(new_expression
constructor: (_) @name.reference.class) @reference.class

View File

@@ -0,0 +1,77 @@
;; Based on https://github.com/tree-sitter-grammars/tree-sitter-hcl/blob/main/make_grammar.js
;; Which has Apache 2.0 License
;; tags.scm for Terraform (tree-sitter-hcl)
; === Definitions: Terraform Blocks ===
(block
(identifier) @block_type
(string_lit (template_literal) @resource_type)
(string_lit (template_literal) @name.definition.resource)
(body) @definition.resource
) (#eq? @block_type "resource")
(block
(identifier) @block_type
(string_lit (template_literal) @name.definition.module)
(body) @definition.module
) (#eq? @block_type "module")
(block
(identifier) @block_type
(string_lit (template_literal) @name.definition.variable)
(body) @definition.variable
) (#eq? @block_type "variable")
(block
(identifier) @block_type
(string_lit (template_literal) @name.definition.output)
(body) @definition.output
) (#eq? @block_type "output")
(block
(identifier) @block_type
(string_lit (template_literal) @name.definition.provider)
(body) @definition.provider
) (#eq? @block_type "provider")
(block
(identifier) @block_type
(body
(attribute
(identifier) @name.definition.local
(expression) @definition.local
)+
)
) (#eq? @block_type "locals")
; === References: Variables, Locals, Modules, Data, Resources ===
((variable_expr) @ref_type
(get_attr (identifier) @name.reference.variable)
) @reference.variable
(#eq? @ref_type "var")
((variable_expr) @ref_type
(get_attr (identifier) @name.reference.local)
) @reference.local
(#eq? @ref_type "local")
((variable_expr) @ref_type
(get_attr (identifier) @name.reference.module)
) @reference.module
(#eq? @ref_type "module")
((variable_expr) @ref_type
(get_attr (identifier) @data_source_type)
(get_attr (identifier) @name.reference.data)
) @reference.data
(#eq? @ref_type "data")
((variable_expr) @resource_type
(get_attr (identifier) @name.reference.resource)
) @reference.resource
(#not-eq? @resource_type "var")
(#not-eq? @resource_type "local")
(#not-eq? @resource_type "module")
(#not-eq? @resource_type "data")
(#not-eq? @resource_type "provider")
(#not-eq? @resource_type "output")

View File

@@ -0,0 +1,27 @@
; Definitions
(class_declaration
(type_identifier) @name.definition.class) @definition.class
(function_declaration
(simple_identifier) @name.definition.function) @definition.function
(object_declaration
(type_identifier) @name.definition.object) @definition.object
; References
(call_expression
[
(simple_identifier) @name.reference.call
(navigation_expression
(navigation_suffix
(simple_identifier) @name.reference.call))
]) @reference.call
(delegation_specifier
[
(user_type) @name.reference.type
(constructor_invocation
(user_type) @name.reference.type)
]) @reference.type

82
aider/reasoning_tags.py Normal file
View File

@@ -0,0 +1,82 @@
#!/usr/bin/env python
import re
from aider.dump import dump # noqa
# Standard tag identifier
REASONING_TAG = "thinking-content-" + "7bbeb8e1441453ad999a0bbba8a46d4b"
# Output formatting
REASONING_START = "--------------\n► **THINKING**"
REASONING_END = "------------\n► **ANSWER**"
def remove_reasoning_content(res, reasoning_tag):
"""
Remove reasoning content from text based on tags.
Args:
res (str): The text to process
reasoning_tag (str): The tag name to remove
Returns:
str: Text with reasoning content removed
"""
if not reasoning_tag:
return res
# Try to match the complete tag pattern first
pattern = f"<{reasoning_tag}>.*?</{reasoning_tag}>"
res = re.sub(pattern, "", res, flags=re.DOTALL).strip()
# If closing tag exists but opening tag might be missing, remove everything before closing
# tag
closing_tag = f"</{reasoning_tag}>"
if closing_tag in res:
# Split on the closing tag and keep everything after it
parts = res.split(closing_tag, 1)
res = parts[1].strip() if len(parts) > 1 else res
return res
def replace_reasoning_tags(text, tag_name):
"""
Replace opening and closing reasoning tags with standard formatting.
Ensures exactly one blank line before START and END markers.
Args:
text (str): The text containing the tags
tag_name (str): The name of the tag to replace
Returns:
str: Text with reasoning tags replaced with standard format
"""
if not text:
return text
# Replace opening tag with proper spacing
text = re.sub(f"\\s*<{tag_name}>\\s*", f"\n{REASONING_START}\n\n", text)
# Replace closing tag with proper spacing
text = re.sub(f"\\s*</{tag_name}>\\s*", f"\n\n{REASONING_END}\n\n", text)
return text
def format_reasoning_content(reasoning_content, tag_name):
"""
Format reasoning content with appropriate tags.
Args:
reasoning_content (str): The content to format
tag_name (str): The tag name to use
Returns:
str: Formatted reasoning content with tags
"""
if not reasoning_content:
return ""
formatted = f"<{tag_name}>\n\n{reasoning_content}\n\n</{tag_name}>"
return formatted

View File

@@ -2,23 +2,35 @@ import os
import time
from pathlib import Path, PurePosixPath
import git
try:
import git
ANY_GIT_ERROR = [
git.exc.ODBError,
git.exc.GitError,
git.exc.InvalidGitRepositoryError,
]
except ImportError:
git = None
ANY_GIT_ERROR = []
import pathspec
from aider import prompts, utils
from aider.sendchat import simple_send_with_retries
from .dump import dump # noqa: F401
ANY_GIT_ERROR = (
git.exc.ODBError,
git.exc.GitError,
ANY_GIT_ERROR += [
OSError,
IndexError,
BufferError,
TypeError,
ValueError,
)
AttributeError,
AssertionError,
TimeoutError,
]
ANY_GIT_ERROR = tuple(ANY_GIT_ERROR)
class GitRepo:
@@ -133,7 +145,7 @@ class GitRepo:
else:
cmd += ["-a"]
original_user_name = self.repo.config_reader().get_value("user", "name")
original_user_name = self.repo.git.config("--get", "user.name")
original_committer_name_env = os.environ.get("GIT_COMMITTER_NAME")
committer_name = f"{original_user_name} (aider)"
@@ -141,7 +153,7 @@ class GitRepo:
os.environ["GIT_COMMITTER_NAME"] = committer_name
if aider_edits and self.attribute_author:
original_auther_name_env = os.environ.get("GIT_AUTHOR_NAME")
original_author_name_env = os.environ.get("GIT_AUTHOR_NAME")
os.environ["GIT_AUTHOR_NAME"] = committer_name
try:
@@ -161,8 +173,8 @@ class GitRepo:
del os.environ["GIT_COMMITTER_NAME"]
if aider_edits and self.attribute_author:
if original_auther_name_env is not None:
os.environ["GIT_AUTHOR_NAME"] = original_auther_name_env
if original_author_name_env is not None:
os.environ["GIT_AUTHOR_NAME"] = original_author_name_env
else:
del os.environ["GIT_AUTHOR_NAME"]
@@ -192,9 +204,7 @@ class GitRepo:
max_tokens = model.info.get("max_input_tokens") or 0
if max_tokens and num_tokens > max_tokens:
continue
commit_message = simple_send_with_retries(
model.name, messages, extra_params=model.extra_params
)
commit_message = model.simple_send_with_retries(messages)
if commit_message:
break
@@ -278,9 +288,17 @@ class GitRepo:
files = self.tree_files[commit]
else:
try:
for blob in commit.tree.traverse():
if blob.type == "blob": # blob is a file
files.add(blob.path)
iterator = commit.tree.traverse()
while True:
try:
blob = next(iterator)
if blob.type == "blob": # blob is a file
files.add(blob.path)
except IndexError:
self.io.tool_warning(f"GitRepo: read error skipping {blob.path}")
continue
except StopIteration:
break
except ANY_GIT_ERROR as err:
self.git_repo_error = err
self.io.tool_error(f"Unable to list files in git repo: {err}")
@@ -291,8 +309,11 @@ class GitRepo:
# Add staged files
index = self.repo.index
staged_files = [path for path, _ in index.entries.keys()]
files.update(self.normalize_path(path) for path in staged_files)
try:
staged_files = [path for path, _ in index.entries.keys()]
files.update(self.normalize_path(path) for path in staged_files)
except ANY_GIT_ERROR as err:
self.io.tool_error(f"Unable to read staged files: {err}")
res = [fname for fname in files if not self.ignored_file(fname)]
@@ -352,8 +373,8 @@ class GitRepo:
def ignored_file_raw(self, fname):
if self.subtree_only:
fname_path = Path(self.normalize_path(fname))
try:
fname_path = Path(self.normalize_path(fname))
cwd_path = Path.cwd().resolve().relative_to(Path(self.root).resolve())
except ValueError:
# Issue #1524

View File

@@ -23,7 +23,7 @@ from aider.utils import Spinner
# tree_sitter is throwing a FutureWarning
warnings.simplefilter("ignore", category=FutureWarning)
from tree_sitter_languages import get_language, get_parser # noqa: E402
from grep_ast.tsl import USING_TSL_PACK, get_language, get_parser # noqa: E402
Tag = namedtuple("Tag", "rel_fname fname line name kind".split())
@@ -31,8 +31,12 @@ Tag = namedtuple("Tag", "rel_fname fname line name kind".split())
SQLITE_ERRORS = (sqlite3.OperationalError, sqlite3.DatabaseError, OSError)
CACHE_VERSION = 3
if USING_TSL_PACK:
CACHE_VERSION = 4
class RepoMap:
CACHE_VERSION = 3
TAGS_CACHE_DIR = f".aider.tags.cache.v{CACHE_VERSION}"
warned_files = set()
@@ -282,10 +286,15 @@ class RepoMap:
query = language.query(query_scm)
captures = query.captures(tree.root_node)
captures = list(captures)
saw = set()
for node, tag in captures:
if USING_TSL_PACK:
all_nodes = []
for tag, nodes in captures.items():
all_nodes += [(node, tag) for node in nodes]
else:
all_nodes = list(captures)
for node, tag in all_nodes:
if tag.startswith("name.definition."):
kind = "def"
elif tag.startswith("name.reference."):
@@ -422,6 +431,15 @@ class RepoMap:
G = nx.MultiDiGraph()
# Add a small self-edge for every definition that has no references
# Helps with tree-sitter 0.23.2 with ruby, where "def greet(name)"
# isn't counted as a def AND a ref. tree-sitter 0.24.0 does.
for ident in defines.keys():
if ident in references:
continue
for definer in defines[ident]:
G.add_edge(definer, definer, weight=0.1, ident=ident)
for ident in idents:
if progress:
progress()
@@ -605,7 +623,7 @@ class RepoMap:
self.tree_cache = dict()
middle = min(max_map_tokens // 25, num_tags)
middle = min(int(max_map_tokens // 25), num_tags)
while lower_bound <= upper_bound:
# dump(lower_bound, middle, upper_bound)
@@ -628,7 +646,7 @@ class RepoMap:
else:
upper_bound = middle - 1
middle = (lower_bound + upper_bound) // 2
middle = int((lower_bound + upper_bound) // 2)
spin.end()
return best_tree
@@ -732,8 +750,27 @@ def get_random_color():
def get_scm_fname(lang):
# Load the tags queries
if USING_TSL_PACK:
subdir = "tree-sitter-language-pack"
try:
path = resources.files(__package__).joinpath(
"queries",
subdir,
f"{lang}-tags.scm",
)
if path.exists():
return path
except KeyError:
pass
# Fall back to tree-sitter-languages
subdir = "tree-sitter-languages"
try:
return resources.files(__package__).joinpath("queries", f"tree-sitter-{lang}-tags.scm")
return resources.files(__package__).joinpath(
"queries",
subdir,
f"{lang}-tags.scm",
)
except KeyError:
return

View File

@@ -0,0 +1,244 @@
{
"deepseek-reasoner": {
"max_tokens": 8192,
"max_input_tokens": 64000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.00000055,
"input_cost_per_token_cache_hit": 0.00000014,
"cache_read_input_token_cost": 0.00000014,
"cache_creation_input_token_cost": 0.0,
"output_cost_per_token": 0.00000219,
"litellm_provider": "deepseek",
"mode": "chat",
//"supports_function_calling": true,
"supports_assistant_prefill": true,
//"supports_tool_choice": true,
"supports_prompt_caching": true
},
"openrouter/deepseek/deepseek-r1": {
"max_tokens": 8192,
"max_input_tokens": 64000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.00000055,
"input_cost_per_token_cache_hit": 0.00000014,
"cache_read_input_token_cost": 0.00000014,
"cache_creation_input_token_cost": 0.0,
"output_cost_per_token": 0.00000219,
"litellm_provider": "openrouter",
"mode": "chat",
//"supports_function_calling": true,
"supports_assistant_prefill": true,
//"supports_tool_choice": true,
"supports_prompt_caching": true
},
"openrouter/deepseek/deepseek-r1:free": {
"max_tokens": 8192,
"max_input_tokens": 64000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.0,
"input_cost_per_token_cache_hit": 0.0,
"cache_read_input_token_cost": 0.00,
"cache_creation_input_token_cost": 0.0,
"output_cost_per_token": 0.0,
"litellm_provider": "openrouter",
"mode": "chat",
//"supports_function_calling": true,
"supports_assistant_prefill": true,
//"supports_tool_choice": true,
"supports_prompt_caching": true
},
"openrouter/deepseek/deepseek-chat:free": {
"max_tokens": 8192,
"max_input_tokens": 64000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.0,
"input_cost_per_token_cache_hit": 0.0,
"cache_read_input_token_cost": 0.00,
"cache_creation_input_token_cost": 0.0,
"output_cost_per_token": 0.0,
"litellm_provider": "openrouter",
"mode": "chat",
//"supports_function_calling": true,
"supports_assistant_prefill": true,
//"supports_tool_choice": true,
"supports_prompt_caching": true
},
"fireworks_ai/accounts/fireworks/models/deepseek-r1": {
"max_tokens": 160000,
"max_input_tokens": 128000,
"max_output_tokens": 20480,
"litellm_provider": "fireworks_ai",
"input_cost_per_token": 0.000008,
"output_cost_per_token": 0.000008,
"mode": "chat",
},
"fireworks_ai/accounts/fireworks/models/deepseek-v3": {
"max_tokens": 128000,
"max_input_tokens": 100000,
"max_output_tokens": 8192,
"litellm_provider": "fireworks_ai",
"input_cost_per_token": 0.0000009,
"output_cost_per_token": 0.0000009,
"mode": "chat",
},
"o3-mini": {
"max_tokens": 100000,
"max_input_tokens": 200000,
"max_output_tokens": 100000,
"input_cost_per_token": 0.0000011,
"output_cost_per_token": 0.0000044,
"cache_read_input_token_cost": 0.00000055,
"litellm_provider": "openai",
"mode": "chat",
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_vision": true,
"supports_prompt_caching": true,
"supports_system_messages": true,
"supports_response_schema": true
},
"openrouter/openai/o3-mini": {
"max_tokens": 100000,
"max_input_tokens": 200000,
"max_output_tokens": 100000,
"input_cost_per_token": 0.0000011,
"output_cost_per_token": 0.0000044,
"cache_read_input_token_cost": 0.00000055,
"litellm_provider": "openrouter",
"mode": "chat",
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_vision": true,
"supports_prompt_caching": true,
"supports_system_messages": true,
"supports_response_schema": true
},
"openrouter/openai/o3-mini-high": {
"max_tokens": 100000,
"max_input_tokens": 200000,
"max_output_tokens": 100000,
"input_cost_per_token": 0.0000011,
"output_cost_per_token": 0.0000044,
"cache_read_input_token_cost": 0.00000055,
"litellm_provider": "openrouter",
"mode": "chat",
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_vision": true,
"supports_prompt_caching": true,
"supports_system_messages": true,
"supports_response_schema": true
},
"openrouter/openai/gpt-4o-mini": {
"max_tokens": 16384,
"max_input_tokens": 128000,
"max_output_tokens": 16384,
"input_cost_per_token": 0.00000015,
"output_cost_per_token": 0.00000060,
"input_cost_per_token_batches": 0.000000075,
"output_cost_per_token_batches": 0.00000030,
"cache_read_input_token_cost": 0.000000075,
"litellm_provider": "openrouter",
"mode": "chat",
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_response_schema": true,
"supports_vision": true,
"supports_prompt_caching": true,
"supports_system_messages": true
},
"claude-3-7-sonnet-20250219": {
"max_tokens": 8192,
"max_input_tokens": 200000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.000003,
"output_cost_per_token": 0.000015,
"cache_creation_input_token_cost": 0.00000375,
"cache_read_input_token_cost": 0.0000003,
"litellm_provider": "anthropic",
"mode": "chat",
"supports_function_calling": true,
"supports_vision": true,
"tool_use_system_prompt_tokens": 159,
"supports_assistant_prefill": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_response_schema": true,
"deprecation_date": "2025-10-01",
"supports_tool_choice": true
},
"anthropic/claude-3-7-sonnet-20250219": {
"max_tokens": 8192,
"max_input_tokens": 200000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.000003,
"output_cost_per_token": 0.000015,
"cache_creation_input_token_cost": 0.00000375,
"cache_read_input_token_cost": 0.0000003,
"litellm_provider": "anthropic",
"mode": "chat",
"supports_function_calling": true,
"supports_vision": true,
"tool_use_system_prompt_tokens": 159,
"supports_assistant_prefill": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_response_schema": true,
"deprecation_date": "2025-10-01",
"supports_tool_choice": true
},
"openrouter/anthropic/claude-3.7-sonnet": {
"max_tokens": 8192,
"max_input_tokens": 200000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.000003,
"output_cost_per_token": 0.000015,
"cache_creation_input_token_cost": 0.00000375,
"cache_read_input_token_cost": 0.0000003,
"litellm_provider": "openrouter",
"mode": "chat",
"supports_function_calling": true,
"supports_vision": true,
"tool_use_system_prompt_tokens": 159,
"supports_assistant_prefill": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_response_schema": true,
"deprecation_date": "2025-10-01",
"supports_tool_choice": true
},
"gpt-4.5-preview": {
"max_tokens": 16384,
"max_input_tokens": 128000,
"max_output_tokens": 16384,
"input_cost_per_token": 0.000075,
"output_cost_per_token": 0.00015,
"cache_read_input_token_cost": 0.0000375,
"litellm_provider": "openai",
"mode": "chat",
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_response_schema": true,
"supports_vision": true,
"supports_prompt_caching": true,
"supports_system_messages": true,
"supports_tool_choice": true
},
"openai/gpt-4.5-preview": {
"max_tokens": 16384,
"max_input_tokens": 128000,
"max_output_tokens": 16384,
"input_cost_per_token": 0.000075,
"output_cost_per_token": 0.00015,
"cache_read_input_token_cost": 0.0000375,
"litellm_provider": "openai",
"mode": "chat",
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_response_schema": true,
"supports_vision": true,
"supports_prompt_caching": true,
"supports_system_messages": true,
"supports_tool_choice": true
},
}

View File

@@ -0,0 +1,885 @@
- name: gpt-3.5-turbo
weak_model_name: gpt-4o-mini
reminder: sys
- name: gpt-3.5-turbo-0125
weak_model_name: gpt-4o-mini
reminder: sys
- name: gpt-3.5-turbo-1106
weak_model_name: gpt-4o-mini
reminder: sys
- name: gpt-3.5-turbo-0613
weak_model_name: gpt-4o-mini
reminder: sys
- name: gpt-3.5-turbo-16k-0613
weak_model_name: gpt-4o-mini
reminder: sys
- name: gpt-4-turbo-2024-04-09
edit_format: udiff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
- name: gpt-4-turbo
edit_format: udiff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
- name: openai/gpt-4o
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
editor_edit_format: editor-diff
- name: openai/gpt-4o-2024-08-06
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
- name: gpt-4o-2024-08-06
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
- name: gpt-4o-2024-11-20
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
- name: openai/gpt-4o-2024-11-20
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
- name: gpt-4o
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
editor_edit_format: editor-diff
- name: gpt-4o-mini
weak_model_name: gpt-4o-mini
lazy: true
reminder: sys
- name: openai/gpt-4o-mini
weak_model_name: openai/gpt-4o-mini
lazy: true
reminder: sys
- name: gpt-4-0125-preview
edit_format: udiff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
- name: gpt-4-1106-preview
edit_format: udiff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
- name: gpt-4-vision-preview
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
reminder: sys
- name: gpt-4-0314
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
reminder: sys
examples_as_sys_msg: true
- name: gpt-4-0613
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
reminder: sys
- name: gpt-4-32k-0613
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
reminder: sys
- name: claude-3-opus-20240229
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
- name: openrouter/anthropic/claude-3-opus
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku
use_repo_map: true
- name: claude-3-sonnet-20240229
weak_model_name: claude-3-5-haiku-20241022
- name: claude-3-5-sonnet-20240620
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
max_tokens: 8192
cache_control: true
editor_model_name: claude-3-5-sonnet-20240620
editor_edit_format: editor-diff
- name: anthropic/claude-3-5-sonnet-20240620
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
max_tokens: 8192
cache_control: true
editor_model_name: anthropic/claude-3-5-sonnet-20240620
editor_edit_format: editor-diff
- name: anthropic/claude-3-5-sonnet-20241022
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
max_tokens: 8192
cache_control: true
editor_model_name: anthropic/claude-3-5-sonnet-20241022
editor_edit_format: editor-diff
- name: anthropic/claude-3-7-sonnet-20250219
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: anthropic/claude-3-7-sonnet-20250219
editor_edit_format: editor-diff
- name: anthropic/claude-3-7-sonnet-latest
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: anthropic/claude-3-7-sonnet-latest
editor_edit_format: editor-diff
- name: claude-3-7-sonnet-20250219
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: claude-3-7-sonnet-20250219
editor_edit_format: editor-diff
- name: claude-3-7-sonnet-latest
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: claude-3-7-sonnet-latest
editor_edit_format: editor-diff
- name: bedrock/anthropic.claude-3-7-sonnet-20250219-v1:0
edit_format: diff
weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock/anthropic.claude-3-7-sonnet-20250219-v1:0
editor_edit_format: editor-diff
- name: bedrock/us.anthropic.claude-3-7-sonnet-20250219-v1:0
edit_format: diff
weak_model_name: bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock/us.anthropic.claude-3-7-sonnet-20250219-v1:0
editor_edit_format: editor-diff
- name: bedrock_converse/anthropic.claude-3-7-sonnet-20250219-v1:0
edit_format: diff
weak_model_name: bedrock_converse/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock_converse/anthropic.claude-3-7-sonnet-20250219-v1:0
editor_edit_format: editor-diff
- name: bedrock_converse/us.anthropic.claude-3-7-sonnet-20250219-v1:0
edit_format: diff
weak_model_name: bedrock_converse/us.anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: bedrock_converse/us.anthropic.claude-3-7-sonnet-20250219-v1:0
editor_edit_format: editor-diff
- name: vertex_ai/claude-3-7-sonnet@20250219
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai/claude-3-7-sonnet@20250219
editor_edit_format: editor-diff
- name: vertex_ai-anthropic_models/vertex_ai/claude-3-7-sonnet@20250219
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 64000
editor_model_name: vertex_ai-anthropic_models/vertex_ai/claude-3-7-sonnet@20250219
editor_edit_format: editor-diff
- name: openrouter/anthropic/claude-3.7-sonnet
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: openrouter/anthropic/claude-3.7-sonnet
editor_edit_format: editor-diff
- name: openrouter/anthropic/claude-3.7-sonnet:beta
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25,output-128k-2025-02-19
max_tokens: 64000
cache_control: true
editor_model_name: openrouter/anthropic/claude-3.7-sonnet
editor_edit_format: editor-diff
- name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0
edit_format: diff
weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
max_tokens: 8192
cache_control: true
editor_model_name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0
editor_edit_format: editor-diff
- name: anthropic/claude-3-5-sonnet-latest
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
max_tokens: 8192
cache_control: true
editor_model_name: anthropic/claude-3-5-sonnet-20241022
editor_edit_format: editor-diff
- name: claude-3-5-sonnet-20241022
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
max_tokens: 8192
cache_control: true
editor_model_name: claude-3-5-sonnet-20241022
editor_edit_format: editor-diff
- name: anthropic/claude-3-haiku-20240307
weak_model_name: anthropic/claude-3-haiku-20240307
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
cache_control: true
- name: anthropic/claude-3-5-haiku-20241022
edit_format: diff
weak_model_name: anthropic/claude-3-5-haiku-20241022
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
cache_control: true
- name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0
edit_format: diff
weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0
use_repo_map: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
cache_control: true
- name: claude-3-5-haiku-20241022
edit_format: diff
weak_model_name: claude-3-5-haiku-20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
cache_control: true
- name: vertex_ai/claude-3-5-haiku@20241022
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
extra_params:
max_tokens: 4096
- name: claude-3-haiku-20240307
weak_model_name: claude-3-haiku-20240307
examples_as_sys_msg: true
extra_params:
extra_headers:
anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25
cache_control: true
- name: openrouter/anthropic/claude-3.5-sonnet
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
cache_control: true
editor_model_name: openrouter/anthropic/claude-3.5-sonnet
editor_edit_format: editor-diff
- name: openrouter/anthropic/claude-3.5-sonnet:beta
edit_format: diff
weak_model_name: openrouter/anthropic/claude-3-5-haiku:beta
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
cache_control: true
editor_model_name: openrouter/anthropic/claude-3.5-sonnet:beta
editor_edit_format: editor-diff
- name: vertex_ai/claude-3-5-sonnet@20240620
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
editor_model_name: vertex_ai/claude-3-5-sonnet@20240620
editor_edit_format: editor-diff
- name: vertex_ai/claude-3-5-sonnet-v2@20241022
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
editor_model_name: vertex_ai/claude-3-5-sonnet-v2@20241022
editor_edit_format: editor-diff
- name: vertex_ai/claude-3-opus@20240229
edit_format: diff
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
use_repo_map: true
- name: vertex_ai/claude-3-sonnet@20240229
weak_model_name: vertex_ai/claude-3-5-haiku@20241022
- name: command-r-plus
weak_model_name: command-r-plus
use_repo_map: true
- name: command-r-08-2024
weak_model_name: command-r-08-2024
use_repo_map: true
- name: command-r-plus-08-2024
weak_model_name: command-r-plus-08-2024
use_repo_map: true
- name: groq/llama3-70b-8192
edit_format: diff
weak_model_name: groq/llama3-8b-8192
examples_as_sys_msg: true
- name: openrouter/meta-llama/llama-3-70b-instruct
edit_format: diff
weak_model_name: openrouter/meta-llama/llama-3-70b-instruct
examples_as_sys_msg: true
- name: gemini/gemini-1.5-pro-002
edit_format: diff
use_repo_map: true
- name: gemini/gemini-1.5-flash-002
- name: gemini/gemini-1.5-pro
edit_format: diff-fenced
use_repo_map: true
- name: gemini/gemini-1.5-pro-latest
edit_format: diff-fenced
use_repo_map: true
- name: gemini/gemini-1.5-pro-exp-0827
edit_format: diff-fenced
use_repo_map: true
- name: gemini/gemini-exp-1206
edit_format: diff
use_repo_map: true
- name: gemini/gemini-exp-1114
edit_format: diff
use_repo_map: true
- name: gemini/gemini-exp-1121
edit_format: diff
use_repo_map: true
- name: vertex_ai/gemini-pro-experimental
edit_format: diff-fenced
use_repo_map: true
- name: gemini/gemini-1.5-flash-exp-0827
- name: gemini/gemini-2.0-flash-exp
edit_format: diff
use_repo_map: true
- name: gemini/gemini-2.0-flash
edit_format: diff
use_repo_map: true
- name: openrouter/deepseek/deepseek-r1
edit_format: diff
weak_model_name: openrouter/deepseek/deepseek-chat
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
include_reasoning: true
caches_by_default: true
editor_model_name: openrouter/deepseek/deepseek-chat
editor_edit_format: editor-diff
- name: openrouter/deepseek/deepseek-r1:free
edit_format: diff
weak_model_name: openrouter/deepseek/deepseek-r1:free
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
caches_by_default: true
use_temperature: false
editor_model_name: openrouter/deepseek/deepseek-r1:free
editor_edit_format: editor-diff
- name: deepseek/deepseek-reasoner
edit_format: diff
weak_model_name: deepseek/deepseek-chat
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
caches_by_default: true
use_temperature: false
editor_model_name: deepseek/deepseek-chat
editor_edit_format: editor-diff
- name: deepseek/deepseek-chat
edit_format: diff
use_repo_map: true
reminder: sys
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
caches_by_default: true
- name: openrouter/deepseek/deepseek-chat:free
edit_format: diff
weak_model_name: openrouter/deepseek/deepseek-chat:free
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
caches_by_default: true
use_temperature: false
editor_model_name: openrouter/deepseek/deepseek-chat:free
editor_edit_format: editor-diff
- name: deepseek/deepseek-coder
edit_format: diff
use_repo_map: true
reminder: sys
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
caches_by_default: true
- name: deepseek-chat
edit_format: diff
use_repo_map: true
reminder: sys
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
- name: deepseek-coder
edit_format: diff
use_repo_map: true
reminder: sys
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
caches_by_default: true
- name: openrouter/deepseek/deepseek-coder
edit_format: diff
use_repo_map: true
reminder: sys
examples_as_sys_msg: true
- name: openrouter/deepseek/deepseek-chat
edit_format: diff
use_repo_map: true
reminder: sys
examples_as_sys_msg: true
- name: openrouter/openai/gpt-4o
edit_format: diff
weak_model_name: openrouter/openai/gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
editor_edit_format: editor-diff
- name: openai/o1-mini
weak_model_name: openai/gpt-4o-mini
use_repo_map: true
use_system_prompt: false
use_temperature: false
editor_model_name: openai/gpt-4o
editor_edit_format: editor-diff
- name: azure/o1-mini
weak_model_name: azure/gpt-4o-mini
use_repo_map: true
use_system_prompt: false
use_temperature: false
editor_model_name: azure/gpt-4o
editor_edit_format: editor-diff
- name: o1-mini
weak_model_name: gpt-4o-mini
use_repo_map: true
use_system_prompt: false
use_temperature: false
editor_model_name: gpt-4o
editor_edit_format: editor-diff
- name: openai/o1-preview
edit_format: diff
weak_model_name: openai/gpt-4o-mini
use_repo_map: true
use_system_prompt: false
use_temperature: false
editor_model_name: openai/gpt-4o
editor_edit_format: editor-diff
- name: azure/o1-preview
edit_format: diff
weak_model_name: azure/gpt-4o-mini
use_repo_map: true
use_system_prompt: false
use_temperature: false
editor_model_name: azure/gpt-4o
editor_edit_format: editor-diff
- name: azure/o1
edit_format: diff
weak_model_name: azure/gpt-4o-mini
use_repo_map: true
use_temperature: false
streaming: false
editor_model_name: azure/gpt-4o
editor_edit_format: editor-diff
- name: o1-preview
edit_format: architect
weak_model_name: gpt-4o-mini
use_repo_map: true
use_system_prompt: false
use_temperature: false
editor_model_name: gpt-4o
editor_edit_format: editor-diff
- name: openrouter/openai/o1-mini
weak_model_name: openrouter/openai/gpt-4o-mini
use_repo_map: true
use_system_prompt: false
use_temperature: false
streaming: false
editor_model_name: openrouter/openai/gpt-4o
editor_edit_format: editor-diff
- name: openrouter/openai/o1-preview
edit_format: diff
weak_model_name: openrouter/openai/gpt-4o-mini
use_repo_map: true
use_system_prompt: false
use_temperature: false
streaming: false
editor_model_name: openrouter/openai/gpt-4o
editor_edit_format: editor-diff
- name: openrouter/openai/o1
edit_format: diff
weak_model_name: openrouter/openai/gpt-4o-mini
use_repo_map: true
use_temperature: false
streaming: false
editor_model_name: openrouter/openai/gpt-4o
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
- name: openai/o1
edit_format: diff
weak_model_name: openai/gpt-4o-mini
use_repo_map: true
use_temperature: false
streaming: false
editor_model_name: openai/gpt-4o
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
- name: o1
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
use_temperature: false
streaming: false
editor_model_name: gpt-4o
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
- name: openrouter/qwen/qwen-2.5-coder-32b-instruct
edit_format: diff
weak_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct
use_repo_map: true
editor_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct
editor_edit_format: editor-diff
- name: openrouter/deepseek/deepseek-r1-distill-llama-70b
edit_format: diff
weak_model_name: openrouter/deepseek/deepseek-chat
use_repo_map: true
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
caches_by_default: true
use_temperature: false
editor_model_name: openrouter/deepseek/deepseek-chat
editor_edit_format: editor-diff
- name: fireworks_ai/accounts/fireworks/models/deepseek-r1
edit_format: diff
weak_model_name: fireworks_ai/accounts/fireworks/models/deepseek-v3
use_repo_map: true
use_temperature: false
streaming: true
editor_model_name: fireworks_ai/accounts/fireworks/models/deepseek-v3
editor_edit_format: editor-diff
reasoning_tag: think
extra_params:
max_tokens: 160000
- name: fireworks_ai/accounts/fireworks/models/deepseek-v3
edit_format: diff
use_repo_map: true
reminder: sys
examples_as_sys_msg: true
extra_params:
max_tokens: 128000
- name: openai/o3-mini
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
use_temperature: false
editor_model_name: gpt-4o
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
- name: o3-mini
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
use_temperature: false
editor_model_name: gpt-4o
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
- name: openrouter/openai/o3-mini
edit_format: diff
weak_model_name: openrouter/openai/gpt-4o-mini
use_repo_map: true
use_temperature: false
editor_model_name: openrouter/openai/gpt-4o
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
- name: openrouter/openai/o3-mini-high
edit_format: diff
weak_model_name: openrouter/openai/gpt-4o-mini
use_repo_map: true
use_temperature: false
editor_model_name: openrouter/openai/gpt-4o
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
- name: azure/o3-mini
edit_format: diff
weak_model_name: azure/gpt-4o-mini
use_repo_map: true
use_temperature: false
editor_model_name: azure/gpt-4o
editor_edit_format: editor-diff
system_prompt_prefix: "Formatting re-enabled. "
- name: gpt-4.5-preview
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
editor_model_name: gpt-4o
editor_edit_format: editor-diff
- name: openai/gpt-4.5-preview
edit_format: diff
weak_model_name: gpt-4o-mini
use_repo_map: true
lazy: true
reminder: sys
examples_as_sys_msg: true
editor_model_name: openai/gpt-4o
editor_edit_format: editor-diff
- name: fireworks_ai/accounts/fireworks/models/qwq-32b
reasoning_tag: think
edit_format: diff
weak_model_name: fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct
use_repo_map: true
editor_model_name: fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct
editor_edit_format: editor-diff
reminder: user
examples_as_sys_msg: true
use_temperature: 0.6
extra_params:
max_tokens: 32000
top_p: 0.95
- name: groq/qwen-qwq-32b
reasoning_tag: think
edit_format: diff
weak_model_name: groq/qwen-2.5-coder-32b
use_repo_map: true
editor_model_name: groq/qwen-2.5-coder-32b
editor_edit_format: editor-diff
use_temperature: 0.6
extra_params:
max_tokens: 128000
top_p: 0.95

View File

@@ -8,12 +8,12 @@ import pexpect
import psutil
def run_cmd(command, verbose=False, error_print=None):
def run_cmd(command, verbose=False, error_print=None, cwd=None):
try:
if sys.stdin.isatty() and hasattr(pexpect, "spawn") and platform.system() != "Windows":
return run_cmd_pexpect(command, verbose)
return run_cmd_pexpect(command, verbose, cwd)
return run_cmd_subprocess(command, verbose)
return run_cmd_subprocess(command, verbose, cwd)
except OSError as e:
error_message = f"Error occurred while running command '{command}': {str(e)}"
if error_print is None:
@@ -39,7 +39,7 @@ def get_windows_parent_process_name():
return None
def run_cmd_subprocess(command, verbose=False):
def run_cmd_subprocess(command, verbose=False, cwd=None, encoding=sys.stdout.encoding):
if verbose:
print("Using run_cmd_subprocess:", command)
@@ -65,10 +65,11 @@ def run_cmd_subprocess(command, verbose=False):
stderr=subprocess.STDOUT,
text=True,
shell=True,
encoding=sys.stdout.encoding,
encoding=encoding,
errors="replace",
bufsize=0, # Set bufsize to 0 for unbuffered output
universal_newlines=True,
cwd=cwd,
)
output = []
@@ -85,7 +86,7 @@ def run_cmd_subprocess(command, verbose=False):
return 1, str(e)
def run_cmd_pexpect(command, verbose=False):
def run_cmd_pexpect(command, verbose=False, cwd=None):
"""
Run a shell command interactively using pexpect, capturing all output.
@@ -112,12 +113,12 @@ def run_cmd_pexpect(command, verbose=False):
# Use the shell from SHELL environment variable
if verbose:
print("Running pexpect.spawn with shell:", shell)
child = pexpect.spawn(shell, args=["-c", command], encoding="utf-8")
child = pexpect.spawn(shell, args=["-i", "-c", command], encoding="utf-8", cwd=cwd)
else:
# Fall back to spawning the command directly
if verbose:
print("Running pexpect.spawn without shell.")
child = pexpect.spawn(command, encoding="utf-8")
child = pexpect.spawn(command, encoding="utf-8", cwd=cwd)
# Transfer control to the user, capturing output
child.interact(output_filter=output_callback)

View File

@@ -1,97 +1,61 @@
import hashlib
import json
import time
from aider.dump import dump # noqa: F401
from aider.exceptions import LiteLLMExceptions
from aider.llm import litellm
# from diskcache import Cache
from aider.utils import format_messages
CACHE_PATH = "~/.aider.send.cache.v1"
CACHE = None
# CACHE = Cache(CACHE_PATH)
def sanity_check_messages(messages):
"""Check if messages alternate between user and assistant roles.
System messages can be interspersed anywhere.
Also verifies the last non-system message is from the user.
Returns True if valid, False otherwise."""
last_role = None
last_non_system_role = None
RETRY_TIMEOUT = 60
def send_completion(
model_name,
messages,
functions,
stream,
temperature=0,
extra_params=None,
):
kwargs = dict(
model=model_name,
messages=messages,
stream=stream,
)
if temperature is not None:
kwargs["temperature"] = temperature
if functions is not None:
function = functions[0]
kwargs["tools"] = [dict(type="function", function=function)]
kwargs["tool_choice"] = {"type": "function", "function": {"name": function["name"]}}
if extra_params is not None:
kwargs.update(extra_params)
key = json.dumps(kwargs, sort_keys=True).encode()
# Generate SHA1 hash of kwargs and append it to chat_completion_call_hashes
hash_object = hashlib.sha1(key)
if not stream and CACHE is not None and key in CACHE:
return hash_object, CACHE[key]
res = litellm.completion(**kwargs)
if not stream and CACHE is not None:
CACHE[key] = res
return hash_object, res
def simple_send_with_retries(model_name, messages, extra_params=None):
litellm_ex = LiteLLMExceptions()
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)
for msg in messages:
role = msg.get("role")
if role == "system":
continue
except AttributeError:
return None
if last_role and role == last_role:
turns = format_messages(messages)
raise ValueError("Messages don't properly alternate user/assistant:\n\n" + turns)
last_role = role
last_non_system_role = role
# Ensure last non-system message is from user
return last_non_system_role == "user"
def ensure_alternating_roles(messages):
"""Ensure messages alternate between 'assistant' and 'user' roles.
Inserts empty messages of the opposite role when consecutive messages
of the same role are found.
Args:
messages: List of message dictionaries with 'role' and 'content' keys.
Returns:
List of messages with alternating roles.
"""
if not messages:
return messages
fixed_messages = []
prev_role = None
for msg in messages:
current_role = msg.get("role") # Get 'role', None if missing
# If current role same as previous, insert empty message
# of the opposite role
if current_role == prev_role:
if current_role == "user":
fixed_messages.append({"role": "assistant", "content": ""})
else:
fixed_messages.append({"role": "user", "content": ""})
fixed_messages.append(msg)
prev_role = current_role
return fixed_messages

View File

@@ -41,6 +41,7 @@ ROOT_IMPORTANT_FILES = [
"composer.lock",
"pom.xml",
"build.gradle",
"build.gradle.kts",
"build.sbt",
"go.mod",
"go.sum",

View File

@@ -14,3 +14,4 @@ install_properly = "https://aider.chat/docs/troubleshooting/imports.html"
analytics = "https://aider.chat/docs/more/analytics.html"
release_notes = "https://aider.chat/HISTORY.html#release-notes"
edit_formats = "https://aider.chat/docs/more/edit-formats.html"
models_and_keys = "https://aider.chat/docs/troubleshooting/models-and-keys.html"

View File

@@ -2,18 +2,15 @@ import itertools
import os
import platform
import shlex
import shutil
import subprocess
import sys
import tempfile
import time
from pathlib import Path
import git
from aider.dump import dump # noqa: F401
IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".webp"}
IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".webp", ".pdf"}
class IgnorantTemporaryDirectory:
@@ -74,6 +71,8 @@ class GitTemporaryDirectory(ChdirTemporaryDirectory):
def make_repo(path=None):
import git
if not path:
path = "."
repo = git.Repo.init(path)
@@ -113,7 +112,7 @@ def format_messages(messages, title=None):
output.append(f"{title.upper()} {'*' * 50}")
for msg in messages:
output.append("")
output.append("-------")
role = msg["role"].upper()
content = msg.get("content")
if isinstance(content, list): # Handle list content (e.g., image messages)
@@ -194,25 +193,9 @@ def split_chat_history_markdown(text, include_tool=False):
return messages
# Copied from pip, MIT license
# https://github.com/pypa/pip/blob/b989e6ef04810bbd4033a3683020bd4ddcbdb627/src/pip/_internal/utils/entrypoints.py#L73
def get_best_invocation_for_this_python() -> str:
"""Try to figure out the best way to invoke the current Python."""
exe = sys.executable
exe_name = os.path.basename(exe)
# Try to use the basename, if it's the first executable.
found_executable = shutil.which(exe_name)
if found_executable and os.path.samefile(found_executable, exe):
return exe_name
# Use the full executable name, because we couldn't find something simpler.
return exe
def get_pip_install(args):
cmd = [
get_best_invocation_for_this_python(),
sys.executable,
"-m",
"pip",
"install",
@@ -268,7 +251,8 @@ def run_install(cmd):
class Spinner:
spinner_chars = itertools.cycle(["", "", "", "", "", "", "", "", "", ""])
unicode_spinner = ["", "", "", "", "", "", "", "", "", ""]
ascii_spinner = ["|", "/", "-", "\\"]
def __init__(self, text):
self.text = text
@@ -276,6 +260,20 @@ class Spinner:
self.last_update = 0
self.visible = False
self.is_tty = sys.stdout.isatty()
self.tested = False
def test_charset(self):
if self.tested:
return
self.tested = True
# Try unicode first, fall back to ascii if needed
try:
# Test if we can print unicode characters
print(self.unicode_spinner[0], end="", flush=True)
print("\r", end="", flush=True)
self.spinner_chars = itertools.cycle(self.unicode_spinner)
except UnicodeEncodeError:
self.spinner_chars = itertools.cycle(self.ascii_spinner)
def step(self):
if not self.is_tty:
@@ -293,6 +291,7 @@ class Spinner:
if not self.visible:
return
self.test_charset()
print(f"\r{self.text} {next(self.spinner_chars)}\r{self.text} ", end="", flush=True)
def end(self):
@@ -301,12 +300,15 @@ class Spinner:
def find_common_root(abs_fnames):
if len(abs_fnames) == 1:
return safe_abs_path(os.path.dirname(list(abs_fnames)[0]))
elif abs_fnames:
return safe_abs_path(os.path.commonpath(list(abs_fnames)))
else:
return safe_abs_path(os.getcwd())
try:
if len(abs_fnames) == 1:
return safe_abs_path(os.path.dirname(list(abs_fnames)[0]))
elif abs_fnames:
return safe_abs_path(os.path.commonpath(list(abs_fnames)))
except OSError:
pass
return safe_abs_path(os.getcwd())
def format_tokens(count):
@@ -382,3 +384,15 @@ def printable_shell_command(cmd_list):
return subprocess.list2cmdline(cmd_list)
else:
return shlex.join(cmd_list)
def main():
spinner = Spinner("Running spinner...")
for _ in range(40): # 40 steps * 0.25 seconds = 10 seconds
time.sleep(0.25)
spinner.step()
spinner.end()
if __name__ == "__main__":
main()

View File

@@ -14,8 +14,11 @@ from .dump import dump # noqa: F401
warnings.filterwarnings(
"ignore", message="Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work"
)
warnings.filterwarnings("ignore", category=SyntaxWarning)
from pydub import AudioSegment # noqa
from pydub.exceptions import CouldntDecodeError, CouldntEncodeError # noqa
try:
import soundfile as sf
@@ -34,7 +37,7 @@ class Voice:
threshold = 0.15
def __init__(self, audio_format="wav"):
def __init__(self, audio_format="wav", device_name=None):
if sf is None:
raise SoundDeviceError
try:
@@ -42,6 +45,29 @@ class Voice:
import sounddevice as sd
self.sd = sd
devices = sd.query_devices()
if device_name:
# Find the device with matching name
device_id = None
for i, device in enumerate(devices):
if device_name in device["name"]:
device_id = i
break
if device_id is None:
available_inputs = [d["name"] for d in devices if d["max_input_channels"] > 0]
raise ValueError(
f"Device '{device_name}' not found. Available input devices:"
f" {available_inputs}"
)
print(f"Using input device: {device_name} (ID: {device_id})")
self.device_id = device_id
else:
self.device_id = None
except (OSError, ModuleNotFoundError):
raise SoundDeviceError
if audio_format not in ["wav", "mp3", "webm"]:
@@ -93,7 +119,7 @@ class Voice:
temp_wav = tempfile.mktemp(suffix=".wav")
try:
sample_rate = int(self.sd.query_devices(None, "input")["default_samplerate"])
sample_rate = int(self.sd.query_devices(self.device_id, "input")["default_samplerate"])
except (TypeError, ValueError):
sample_rate = 16000 # fallback to 16kHz if unable to query device
except self.sd.PortAudioError:
@@ -104,7 +130,9 @@ class Voice:
self.start_time = time.time()
try:
with self.sd.InputStream(samplerate=sample_rate, channels=1, callback=self.callback):
with self.sd.InputStream(
samplerate=sample_rate, channels=1, callback=self.callback, device=self.device_id
):
prompt(self.get_prompt, refresh_interval=0.1)
except self.sd.PortAudioError as err:
raise SoundDeviceError(f"Error accessing audio input device: {err}")
@@ -113,13 +141,28 @@ class Voice:
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
use_audio_format = self.audio_format
# Check file size and offer to convert to mp3 if too large
file_size = os.path.getsize(temp_wav)
if file_size > 24.9 * 1024 * 1024 and self.audio_format == "wav":
print("\nWarning: {temp_wav} is too large, switching to mp3 format.")
use_audio_format = "mp3"
filename = temp_wav
if use_audio_format != "wav":
try:
new_filename = tempfile.mktemp(suffix=f".{use_audio_format}")
audio = AudioSegment.from_wav(temp_wav)
audio.export(new_filename, format=use_audio_format)
os.remove(temp_wav)
filename = new_filename
except (CouldntDecodeError, CouldntEncodeError) as e:
print(f"Error converting audio: {e}")
except (OSError, FileNotFoundError) as e:
print(f"File system error during conversion: {e}")
except Exception as e:
print(f"Unexpected error during audio conversion: {e}")
with open(filename, "rb") as fh:
try:
@@ -130,7 +173,7 @@ class Voice:
print(f"Unable to transcribe {filename}: {err}")
return
if self.audio_format != "wav":
if filename != temp_wav:
os.remove(filename)
text = transcript.text

310
aider/watch.py Normal file
View File

@@ -0,0 +1,310 @@
import re
import threading
from pathlib import Path
from typing import Optional
from grep_ast import TreeContext
from pathspec import PathSpec
from pathspec.patterns import GitWildMatchPattern
from watchfiles import watch
from aider.dump import dump # noqa
from aider.watch_prompts import watch_ask_prompt, watch_code_prompt
def load_gitignores(gitignore_paths: list[Path]) -> Optional[PathSpec]:
"""Load and parse multiple .gitignore files into a single PathSpec"""
if not gitignore_paths:
return None
patterns = [
".aider*",
".git",
# Common editor backup/temp files
"*~", # Emacs/vim backup
"*.bak", # Generic backup
"*.swp", # Vim swap
"*.swo", # Vim swap
"\\#*\\#", # Emacs auto-save
".#*", # Emacs lock files
"*.tmp", # Generic temp files
"*.temp", # Generic temp files
"*.orig", # Merge conflict originals
"*.pyc", # Python bytecode
"__pycache__/", # Python cache dir
".DS_Store", # macOS metadata
"Thumbs.db", # Windows thumbnail cache
# IDE files
".idea/", # JetBrains IDEs
".vscode/", # VS Code
"*.sublime-*", # Sublime Text
".project", # Eclipse
".settings/", # Eclipse
"*.code-workspace", # VS Code workspace
# Environment files
".env", # Environment variables
".venv/", # Python virtual environments
"node_modules/", # Node.js dependencies
"vendor/", # Various dependencies
# Logs and caches
"*.log", # Log files
".cache/", # Cache directories
".pytest_cache/", # Python test cache
"coverage/", # Code coverage reports
] # Always ignore
for path in gitignore_paths:
if path.exists():
with open(path) as f:
patterns.extend(f.readlines())
return PathSpec.from_lines(GitWildMatchPattern, patterns) if patterns else None
class FileWatcher:
"""Watches source files for changes and AI comments"""
# Compiled regex pattern for AI comments
ai_comment_pattern = re.compile(r"(?:#|//|--) *(ai\b.*|ai\b.*|.*\bai[?!]?) *$", re.IGNORECASE)
def __init__(self, coder, gitignores=None, verbose=False, analytics=None, root=None):
self.coder = coder
self.io = coder.io
self.root = Path(root) if root else Path(coder.root)
self.verbose = verbose
self.analytics = analytics
self.stop_event = None
self.watcher_thread = None
self.changed_files = set()
self.gitignores = gitignores
self.gitignore_spec = load_gitignores(
[Path(g) for g in self.gitignores] if self.gitignores else []
)
coder.io.file_watcher = self
def filter_func(self, change_type, path):
"""Filter function for the file watcher"""
path_obj = Path(path)
path_abs = path_obj.absolute()
if not path_abs.is_relative_to(self.root.absolute()):
return False
rel_path = path_abs.relative_to(self.root)
if self.verbose:
dump(rel_path)
if self.gitignore_spec and self.gitignore_spec.match_file(
rel_path.as_posix() + ("/" if path_abs.is_dir() else "")
):
return False
if self.verbose:
dump("ok", rel_path)
# Check if file contains AI markers
try:
comments, _, _ = self.get_ai_comments(str(path_abs))
return bool(comments)
except Exception:
return
def get_roots_to_watch(self):
"""Determine which root paths to watch based on gitignore rules"""
if self.gitignore_spec:
roots = [
str(path)
for path in self.root.iterdir()
if not self.gitignore_spec.match_file(
path.relative_to(self.root).as_posix() + ("/" if path.is_dir() else "")
)
]
# Fallback to watching root if all top-level items are filtered out
return roots if roots else [str(self.root)]
return [str(self.root)]
def handle_changes(self, changes):
"""Process the detected changes and update state"""
if not changes:
return False
changed_files = {str(Path(change[1])) for change in changes}
self.changed_files.update(changed_files)
self.io.interrupt_input()
return True
def watch_files(self):
"""Watch for file changes and process them"""
try:
roots_to_watch = self.get_roots_to_watch()
for changes in watch(
*roots_to_watch,
watch_filter=self.filter_func,
stop_event=self.stop_event,
ignore_permission_denied=True,
):
if self.handle_changes(changes):
return
except Exception as e:
if self.verbose:
dump(f"File watcher error: {e}")
raise e
def start(self):
"""Start watching for file changes"""
self.stop_event = threading.Event()
self.changed_files = set()
self.watcher_thread = threading.Thread(target=self.watch_files, daemon=True)
self.watcher_thread.start()
def stop(self):
"""Stop watching for file changes"""
if self.stop_event:
self.stop_event.set()
if self.watcher_thread:
self.watcher_thread.join()
self.watcher_thread = None
self.stop_event = None
def process_changes(self):
"""Get any detected file changes"""
has_action = None
added = False
for fname in self.changed_files:
_, _, action = self.get_ai_comments(fname)
if action in ("!", "?"):
has_action = action
if fname in self.coder.abs_fnames:
continue
if self.analytics:
self.analytics.event("ai-comments file-add")
self.coder.abs_fnames.add(fname)
rel_fname = self.coder.get_rel_fname(fname)
if not added:
self.io.tool_output()
added = True
self.io.tool_output(f"Added {rel_fname} to the chat")
if not has_action:
if added:
self.io.tool_output(
"End your comment with AI! to request changes or AI? to ask questions"
)
return ""
if self.analytics:
self.analytics.event("ai-comments execute")
self.io.tool_output("Processing your request...")
if has_action == "!":
res = watch_code_prompt
elif has_action == "?":
res = watch_ask_prompt
# Refresh all AI comments from tracked files
for fname in self.coder.abs_fnames:
line_nums, comments, _action = self.get_ai_comments(fname)
if not line_nums:
continue
code = self.io.read_text(fname)
if not code:
continue
rel_fname = self.coder.get_rel_fname(fname)
res += f"\n{rel_fname}:\n"
# Convert comment line numbers to line indices (0-based)
lois = [ln - 1 for ln, _ in zip(line_nums, comments) if ln > 0]
try:
context = TreeContext(
rel_fname,
code,
color=False,
line_number=False,
child_context=False,
last_line=False,
margin=0,
mark_lois=True,
loi_pad=3,
show_top_of_file_parent_scope=False,
)
context.lines_of_interest = set()
context.add_lines_of_interest(lois)
context.add_context()
res += context.format()
except ValueError:
for ln, comment in zip(line_nums, comments):
res += f" Line {ln}: {comment}\n"
return res
def get_ai_comments(self, filepath):
"""Extract AI comment line numbers, comments and action status from a file"""
line_nums = []
comments = []
has_action = None # None, "!" or "?"
content = self.io.read_text(filepath, silent=True)
if not content:
return None, None, None
for i, line in enumerate(content.splitlines(), 1):
if match := self.ai_comment_pattern.search(line):
comment = match.group(0).strip()
if comment:
line_nums.append(i)
comments.append(comment)
comment = comment.lower()
comment = comment.lstrip("/#-")
comment = comment.strip()
if comment.startswith("ai!") or comment.endswith("ai!"):
has_action = "!"
elif comment.startswith("ai?") or comment.endswith("ai?"):
has_action = "?"
if not line_nums:
return None, None, None
return line_nums, comments, has_action
def main():
"""Example usage of the file watcher"""
import argparse
parser = argparse.ArgumentParser(description="Watch source files for changes")
parser.add_argument("directory", help="Directory to watch")
parser.add_argument(
"--gitignore",
action="append",
help="Path to .gitignore file (can be specified multiple times)",
)
args = parser.parse_args()
directory = args.directory
print(f"Watching source files in {directory}...")
# Example ignore function that ignores files with "test" in the name
def ignore_test_files(path):
return "test" in path.name.lower()
watcher = FileWatcher(directory, gitignores=args.gitignore)
try:
watcher.start()
while True:
if changes := watcher.get_changes():
for file in sorted(changes.keys()):
print(file)
watcher.changed_files = None
except KeyboardInterrupt:
print("\nStopped watching files")
watcher.stop()
if __name__ == "__main__":
main()

12
aider/watch_prompts.py Normal file
View File

@@ -0,0 +1,12 @@
watch_code_prompt = """
I've written your instructions in comments in the code and marked them with "ai"
You can see the "AI" comments shown below (marked with █).
Find them in the code files I've shared with you, and follow their instructions.
After completing those instructions, also be sure to remove all the "AI" comments from the code too.
"""
watch_ask_prompt = """/ask
Find the "AI" comments below (marked with █) in the code files I've shared with you.
They contain my questions that I need you to answer and other instructions for you.
"""

View File

@@ -1,7 +1,6 @@
---
title: Release history
parent: More info
nav_order: 900
nav_order: 925
highlight_image: /assets/blame.jpg
description: Release notes and stats on aider writing its own code.
---
@@ -24,7 +23,251 @@ cog.out(text)
]]]-->
### main branch
### Aider v0.76.1
- Added ignore_permission_denied option to file watcher to prevent errors when accessing restricted files, by Yutaka Matsubara.
- Aider wrote 0% of the code in this release.
### Aider v0.76.0
- Improved support for thinking/reasoningmodels:
- Added `--thinking-tokens` CLI option to control token budget for models that support thinking.
- Display thinking/reasoning content from LLMs which return it.
- Enhanced handling of reasoning tags to better clean up model responses.
- Added deprecation warning for `remove_reasoning` setting, now replaced by `reasoning_tag`.
- Aider will notify you when it's completed the last request and needs your input:
- Added [notifications when LLM responses are ready](https://aider.chat/docs/usage/notifications.html) with `--notifications` flag.
- Specify desktop notification command with `--notifications-command`.
- Added support for QWQ 32B.
- Switch to `tree-sitter-language-pack` for tree sitter support.
- Improved error handling for EOF (Ctrl+D) in user input prompts.
- Added helper function to ensure hex color values have a # prefix.
- Fixed handling of Git errors when reading staged files.
- Improved SSL verification control for model information requests.
- Improved empty LLM response handling with clearer warning messages.
- Fixed Git identity retrieval to respect global configuration, by Akira Komamura.
- Offer to install dependencies for Bedrock and Vertex AI models.
- Deprecated model shortcut args (like --4o, --opus) in favor of the --model flag.
- Aider wrote 85% of the code in this release.
### Aider v0.75.3
- Support for V3 free on OpenRouter: `--model openrouter/deepseek/deepseek-chat:free`.
### Aider v0.75.2
- Added support for Claude 3.7 Sonnet models on OpenRouter, Bedrock and Vertex AI.
- Updated default model to Claude 3.7 Sonnet on OpenRouter.
- Added support for GPT-4.5-preview model.
- Added support for Claude 3.7 Sonnet:beta on OpenRouter.
- Fixed weak_model_name patterns to match main model name patterns for some models.
### Aider v0.75.1
- Added support for `openrouter/anthropic/claude-3.7-sonnet`
### Aider v0.75.0
- Basic support for Claude 3.7 Sonnet
- Use `--model sonnet` to use the new 3.7
- Thinking support coming soon.
- Bugfix to `/editor` command.
- Aider wrote 46% of the code in this release.
### Aider v0.74.3
- Downgrade streamlit dependency to avoid threading bug.
- Added support for tree-sitter language pack.
- Added openrouter/o3-mini-high model configuration.
- Added build.gradle.kts to special files for Kotlin project support, by Lucas Shadler.
### Aider v0.74.2
- Prevent more than one cache warming thread from becoming active.
- Fixed continuation prompt ". " for multiline input.
- Added HCL (Terraform) syntax support, by Warren Krewenki.
### Aider v0.74.1
- Have o1 & o3-mini generate markdown by sending the magic "Formatting re-enabled." string.
- Bugfix for multi-line inputs, which should not include the ". " continuation prompt.
### Aider v0.74.0
- Dynamically changes the Ollama context window to hold the current chat.
- Better support for o3-mini, DeepSeek V3 & R1, o1-mini, o1 especially via third-party API providers.
- Remove `<think>` tags from R1 responses for commit messages (and other weak model uses).
- Can now specify `use_temperature: <float>` in model settings, not just true/false.
- The full docker container now includes `boto3` for Bedrock.
- Docker containers now set `HOME=/app` which is the normal project mount-point, to persist `~/.aider`.
- Bugfix to prevent creating incorrect filenames like `python`, `php`, etc.
- Bugfix for `--timeout`
- Bugfix so that `/model` now correctly reports that the weak model is not changed.
- Bugfix so that multi-line mode persists through ^C at confirmation prompts.
- Watch files now fully ignores top-level directories named in ignore files, to reduce the chance of hitting OS watch limits. Helpful to ignore giant subtrees like `node_modules`.
- Fast startup with more providers and when model metadata provided in local files.
- Improved .gitignore handling:
- Honor ignores already in effect regardless of how they've been configured.
- Check for .env only when the file exists.
- Yes/No prompts now accept All/Skip as alias for Y/N even when not processing a group of confirmations.
- Aider wrote 77% of the code in this release.
### Aider v0.73.0
- Full support for o3-mini: `aider --model o3-mini`
- New `--reasoning-effort` argument: low, medium, high.
- Improved handling of context window size limits, with better messaging and Ollama-specific guidance.
- Added support for removing model-specific reasoning tags from responses with `remove_reasoning: tagname` model setting.
- Auto-create parent directories when creating new files, by xqyz.
- Support for R1 free on OpenRouter: `--model openrouter/deepseek/deepseek-r1:free`
- Aider wrote 69% of the code in this release.
### Aider v0.72.3
- Enforce user/assistant turn order to avoid R1 errors, by miradnanali.
- Case-insensitive model name matching while preserving original case.
### Aider v0.72.2
- Harden against user/assistant turn order problems which cause R1 errors.
### Aider v0.72.1
- Fix model metadata for `openrouter/deepseek/deepseek-r1`
### Aider v0.72.0
- Support for DeepSeek R1.
- Use shortcut: `--model r1`
- Also via OpenRouter: `--model openrouter/deepseek/deepseek-r1`
- Added Kotlin syntax support to repo map, by Paul Walker.
- Added `--line-endings` for file writing, by Titusz Pan.
- Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores.
- Bumped all dependencies, to pick up litellm support for o1 system messages.
- Bugfix for turn taking when reflecting lint/test errors.
- Aider wrote 52% of the code in this release.
### Aider v0.71.1
- Fix permissions issue in Docker images.
- Added read-only file announcements.
- Bugfix: ASCII fallback for unicode errors.
- Bugfix: integer indices for list slicing in repomap calculations.
### Aider v0.71.0
- Prompts to help DeepSeek work better when alternating between `/ask` and `/code`.
- Streaming pretty LLM responses is smoother and faster for long replies.
- Streaming automatically turns of for model that don't support it
- Can now switch to/from `/model o1` and a streaming model
- Pretty output remains enabled even when editing files with triple-backtick fences
- Bare `/ask`, `/code` and `/architect` commands now switch the chat mode.
- Increased default size of the repomap.
- Increased max chat history tokens limit from 4k to 8k.
- Turn off fancy input and watch files if terminal is dumb.
- Added support for custom voice format and input device settings.
- Disabled Streamlit email prompt, by apaz-cli.
- Docker container runs as non-root user.
- Fixed lint command handling of nested spaced strings, by Aaron Weisberg.
- Added token count feedback when adding command output to chat.
- Improved error handling for large audio files with automatic format conversion.
- Improved handling of git repo index errors, by Krazer.
- Improved unicode handling in console output with ASCII fallback.
- Added AssertionError, AttributeError to git error handling.
- Aider wrote 60% of the code in this release.
### Aider v0.70.0
- Full support for o1 models.
- Watch files now honors `--subtree-only`, and only watches that subtree.
- Improved prompting for watch files, to work more reliably with more models.
- New install methods via uv, including one-liners.
- Support for openrouter/deepseek/deepseek-chat model.
- Better error handling when interactive commands are attempted via `/load` or `--load`.
- Display read-only files with abs path if its shorter than rel path.
- Ask 10% of users to opt-in to analytics.
- Bugfix for auto-suggest.
- Gracefully handle unicode errors in git path names.
- Aider wrote 74% of the code in this release.
### Aider v0.69.1
- Fix for gemini model names in model metadata.
- Show hints about AI! and AI? when user makes AI comments.
- Support for running without git installed.
- Improved environment variable setup messages on Windows.
### Aider v0.69.0
- [Watch files](https://aider.chat/docs/usage/watch.html) improvements:
- Use `# ... AI?` comments to trigger aider and ask questions about your code.
- Now watches *all* files, not just certain source files.
- Use `# AI comments`, `// AI comments`, or `-- AI comments` to give aider instructions in any text file.
- Full support for Gemini Flash 2.0 Exp:
- `aider --model flash` or `aider --model gemini/gemini-2.0-flash-exp`
- [New `--multiline` flag and `/multiline-mode` command](https://aider.chat/docs/usage/commands.html#entering-multi-line-chat-messages) makes ENTER a soft newline and META-ENTER send the message, by @miradnanali.
- `/copy-context <instructions>` now takes optional "instructions" when [copying code context to the clipboard](https://aider.chat/docs/usage/copypaste.html#copy-aiders-code-context-to-your-clipboard-paste-into-the-web-ui).
- Improved clipboard error handling with helpful requirements install info.
- Ask 5% of users if they want to opt-in to analytics.
- `/voice` now lets you edit the transcribed text before sending.
- Disabled auto-complete in Y/N prompts.
- Aider wrote 68% of the code in this release.
### Aider v0.68.0
- [Aider works with LLM web chat UIs](https://aider.chat/docs/usage/copypaste.html).
- New `--copy-paste` mode.
- New `/copy-context` command.
- [Set API keys and other environment variables for all providers from command line or yaml conf file](https://aider.chat/docs/config/aider_conf.html#storing-llm-keys).
- New `--api-key provider=key` setting.
- New `--set-env VAR=value` setting.
- Added bash and zsh support to `--watch-files`.
- Better error messages when missing dependencies for Gemini and Bedrock models.
- Control-D now properly exits the program.
- Don't count token costs when API provider returns a hard error.
- Bugfix so watch files works with files that don't have tree-sitter support.
- Bugfix so o1 models can be used as weak model.
- Updated shell command prompt.
- Added docstrings for all Coders.
- Reorganized command line arguments with improved help messages and grouping.
- Use the exact `sys.python` for self-upgrades.
- Added experimental Gemini models.
- Aider wrote 71% of the code in this release.
### Aider v0.67.0
- [Use aider in your IDE or editor](https://aider.chat/docs/usage/watch.html).
- Run `aider --watch-files` and it will watch for instructions you add to your source files.
- One-liner `# ...` or `// ...` comments that start or end with "AI" are instructions to aider.
- When aider sees "AI!" it reads and follows all the instructions in AI comments.
- Support for new Amazon Bedrock Nova models.
- When `/run` or `/test` have non-zero exit codes, pre-fill "Fix that" into the next message prompt.
- `/diff` now invokes `git diff` to use your preferred diff tool.
- Added Ctrl-Z support for process suspension.
- Spinner now falls back to ASCII art if fancy symbols throw unicode errors.
- `--read` now expands `~` home dirs.
- Enabled exception capture in analytics.
- [Aider wrote 61% of the code in this release.](https://aider.chat/HISTORY.html)
### Aider v0.66.0
- PDF support for Sonnet and Gemini models.
- Added `--voice-input-device` to select audio input device for voice recording, by @preynal.
- Added `--timeout` option to configure API call timeouts.
- Set cwd to repo root when running shell commands.
- Added Ctrl-Up/Down keyboard shortcuts for per-message history navigation.
- Improved error handling for failed .gitignore file operations.
- Improved error handling for input history file permissions.
- Improved error handling for analytics file access.
- Removed spurious warning about disabling pretty in VSCode.
- Removed broken support for Dart.
- Bugfix when scraping URLs found in chat messages.
- Better handling of __version__ import errors.
- Improved `/drop` command to support substring matching for non-glob patterns.
- Aider wrote 82% of the code in this release.
### Aider v0.65.1
- Bugfix to `--alias`.
### Aider v0.65.0
- Added `--alias` config to define [custom model aliases](https://aider.chat/docs/config/model-aliases.html).
- Added `--[no-]detect-urls` flag to disable detecting and offering to scrape URLs found in the chat.

View File

@@ -1,6 +1,12 @@
theme: just-the-docs
url: "https://aider.chat"
# Analytics configuration
analytics:
enabled: false # Single switch to control analytics and cookie consent
posthog_key: 'phc_99T7muzafUMMZX15H8XePbMSreEUzahHbtWjy3l5Qbv'
posthog_host: 'https://us.i.posthog.com'
plugins:
- jekyll-redirect-from
- jekyll-sitemap
@@ -45,4 +51,4 @@ callouts:
note:
title: Note
color: yellow

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,130 @@
- dirname: 2024-12-25-13-31-51--deepseekv3preview-diff2
test_cases: 225
model: DeepSeek
edit_format: diff
commit_hash: 0a23c4a-dirty
pass_rate_1: 22.7
pass_rate_2: 48.4
pass_num_1: 51
pass_num_2: 109
percent_cases_well_formed: 98.7
error_outputs: 7
num_malformed_responses: 7
num_with_malformed_responses: 3
user_asks: 19
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 8
total_tests: 225
command: aider --model deepseek/deepseek-chat
date: 2024-12-25
versions: 0.69.2.dev
seconds_per_case: 34.8
total_cost: 0.3369
- dirname: 2025-01-28-17-47-49--v3-fireworks
test_cases: 225
model: Fireworks
edit_format: diff
commit_hash: 0336a98-dirty
pass_rate_1: 22.2
pass_rate_2: 48.4
pass_num_1: 50
pass_num_2: 109
percent_cases_well_formed: 96.9
error_outputs: 18
num_malformed_responses: 16
num_with_malformed_responses: 7
user_asks: 14
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 2
test_timeouts: 9
total_tests: 225
command: aider --model fireworks_ai/accounts/fireworks/models/deepseek-v3
date: 2025-01-28
versions: 0.72.4.dev
seconds_per_case: 115.9
total_cost: 2.1177
- dirname: 2025-01-28-19-25-32--or-v3-deepinfra-diff
test_cases: 222
model: "OpenRouter: DeepInfra"
edit_format: diff
commit_hash: bfc5745, 77d2bc5-dirty
pass_rate_1: 23.9
pass_rate_2: 48.0
pass_num_1: 53
pass_num_2: 108
percent_cases_well_formed: 99.5
error_outputs: 18
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 17
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 2
test_timeouts: 4
total_tests: 225
command: aider --model openrouter/deepseek/deepseek-chat
date: 2025-01-28
versions: 0.72.4.dev
seconds_per_case: 187.0
total_cost: 0.2733
- dirname: 2025-01-28-21-07-23--or-v3-novita-diff
test_cases: 225
model: "OpenRouter: Novita"
edit_format: diff
commit_hash: 66025a0
pass_rate_1: 20.4
pass_rate_2: 42.7
pass_num_1: 46
pass_num_2: 96
percent_cases_well_formed: 84.0
error_outputs: 265
num_malformed_responses: 67
num_with_malformed_responses: 36
user_asks: 5
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 8
total_tests: 225
command: aider --model openrouter/deepseek/deepseek-chat
date: 2025-01-28
versions: 0.72.4.dev
seconds_per_case: 472.5
total_cost: 0.0000
- dirname: 2025-01-29-00-36-49--v3-hyperolic-diff
test_cases: 224
model: Hyperbolic
edit_format: diff
commit_hash: 298f713
pass_rate_1: 20.5
pass_rate_2: 48.4
pass_num_1: 46
pass_num_2: 109
percent_cases_well_formed: 97.3
error_outputs: 29
num_malformed_responses: 6
num_with_malformed_responses: 6
user_asks: 7
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 7
total_tests: 225
command: OPENAI_API_BASE=https://api.hyperbolic.xyz/v1/ aider --model openai/deepseek-ai/DeepSeek-V3
date: 2025-01-29
versions: 0.72.4.dev
seconds_per_case: 365.4
total_cost: 0.0000

View File

@@ -644,7 +644,7 @@
- dirname: 2024-07-19-08-57-13--openrouter-deepseek-chat-v2-0628
test_cases: 133
model: DeepSeek Chat V2 0628 (deprecated)
model: DeepSeek Chat V2 0628
edit_format: diff
commit_hash: 96ff06e-dirty
pass_rate_1: 60.9
@@ -716,7 +716,7 @@
- dirname: 2024-07-24-07-10-58--deepseek-coder2-0724-diff-direct
test_cases: 133
model: DeepSeek Coder V2 0724 (deprecated)
model: DeepSeek Coder V2 0724
edit_format: diff
commit_hash: 89965bf
pass_rate_1: 57.9
@@ -1232,7 +1232,7 @@
- dirname: 2024-09-24-16-33-23--gemini-1.5-flash-002-whole
test_cases: 133
model: gemini-1.5-flash-002
model: gemini-1.5-flash-002 (0924)
edit_format: whole
commit_hash: 3edcd71
pass_rate_1: 37.6
@@ -1945,4 +1945,288 @@
command: aider --model gemini/gemini-exp-1114
date: 2024-11-15
versions: 0.63.2.dev
seconds_per_case: 38.6
seconds_per_case: 38.6
- dirname: 2024-11-27-07-41-51--qwen2.5-coder-14b-whole-1
test_cases: 133
model: ollama/qwen2.5-coder:14b
edit_format: whole
commit_hash: 200295e
pass_rate_1: 53.4
pass_rate_2: 61.7
percent_cases_well_formed: 98.5
error_outputs: 4
num_malformed_responses: 4
num_with_malformed_responses: 2
user_asks: 48
lazy_comments: 0
syntax_errors: 2
indentation_errors: 2
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model ollama/qwen2.5-coder:14b
date: 2024-11-27
versions: 0.65.2.dev
seconds_per_case: 58.0
total_cost: 0.0000
- dirname: 2024-11-28-07-42-56--qwen2.5-coder-32b-whole-4
test_cases: 133
model: ollama/qwen2.5-coder:32b
edit_format: whole
commit_hash: 200295e
pass_rate_1: 58.6
pass_rate_2: 72.9
percent_cases_well_formed: 100.0
num_malformed_responses: 0
num_with_malformed_responses: 0
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
command: aider --model ollama/qwen2.5-coder:32b
date: 2024-11-28
versions: 0.65.2.dev
seconds_per_case: 147.5
total_cost: 0.0000
- dirname: 2024-11-28-13-14-00--tulu3-whole-2
test_cases: 133
model: ollama/tulu3
edit_format: whole
commit_hash: 200295e
pass_rate_1: 21.8
pass_rate_2: 26.3
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
exhausted_context_windows: 0
command: aider --model ollama/tulu3
date: 2024-11-28
versions: 0.65.2.dev
seconds_per_case: 35.8
total_cost: 0.0000
- dirname: 2024-11-28-14-41-46--granite3-dense-8b-whole-1
test_cases: 133
model: ollama/granite3-dense:8b
edit_format: whole
commit_hash: 200295e
pass_rate_1: 17.3
pass_rate_2: 20.3
percent_cases_well_formed: 78.9
exhausted_context_windows: 0
command: aider --model ollama/granite3-dense:8b
date: 2024-11-28
versions: 0.65.2.dev
seconds_per_case: 38.1
total_cost: 0.0000
- dirname: 2024-12-04-13-53-03--nova-whole
test_cases: 133
model: Nova Pro
edit_format: whole
commit_hash: 699e283
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: 7
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 4
command: aider --model bedrock/us.amazon.nova-pro-v1:0
date: 2024-12-04
versions: 0.66.1.dev
seconds_per_case: 8.7
total_cost: 0.0000
- dirname: 2024-12-06-18-27-47--llama33-diff
test_cases: 133
model: llama-3.3-70b-instruct
edit_format: diff
commit_hash: 53e0d67
pass_rate_1: 42.1
pass_rate_2: 59.4
percent_cases_well_formed: 88.7
error_outputs: 33
num_malformed_responses: 33
num_with_malformed_responses: 15
user_asks: 3
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model openrouter/meta-llama/llama-3.3-70b-instruct
date: 2024-12-06
versions: 0.67.1.dev
seconds_per_case: 20.2
total_cost: 0.0000
- dirname: 2024-12-06-21-35-50--gemini-exp-1206-diff
test_cases: 133
model: gemini-exp-1206 (diff)
edit_format: diff
commit_hash: f2d2ab5
pass_rate_1: 55.6
pass_rate_2: 69.2
percent_cases_well_formed: 84.2
error_outputs: 68
num_malformed_responses: 68
num_with_malformed_responses: 21
user_asks: 5
lazy_comments: 0
syntax_errors: 2
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model gemini/gemini-exp-1206
date: 2024-12-06
versions: 0.67.1.dev
seconds_per_case: 32.1
total_cost: 0.0000
- dirname: 2024-12-08-21-39-06--gemini-exp-1206-whole
test_cases: 133
model: gemini-exp-1206 (whole)
edit_format: whole
commit_hash: f2d2ab5
pass_rate_1: 60.9
pass_rate_2: 80.5
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: 3
command: aider --model gemini/gemini-exp-1206
date: 2024-12-08
versions: 0.67.1.dev
seconds_per_case: 64.2
total_cost: 0.0000
- dirname: 2024-12-10-14-45-21--deepseek-1210-diff
test_cases: 133
model: DeepSeek-V2.5-1210
edit_format: diff
commit_hash: 16332b2
pass_rate_1: 58.6
pass_rate_2: 72.2
percent_cases_well_formed: 99.2
error_outputs: 1
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 2
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model deepseek/deepseek-chat
date: 2024-12-10
versions: 0.67.1.dev
seconds_per_case: 32.7
total_cost: 0.1106
- dirname: 2024-12-11-00-37-08--yi-test
test_cases: 133
model: yi-lightning
edit_format: whole
commit_hash: e909a3d-dirty
pass_rate_1: 49.6
pass_rate_2: 65.4
percent_cases_well_formed: 97.0
error_outputs: 304
num_malformed_responses: 5
num_with_malformed_responses: 4
user_asks: 34
lazy_comments: 2
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model openai/yi-lightning
date: 2024-12-11
versions: 0.67.1.dev
seconds_per_case: 57.8
total_cost: 0.0000
- dirname: 2024-12-11-21-07-00--gemini-2-flash-diff
test_cases: 133
model: gemini-2.0-flash-exp
edit_format: diff
commit_hash: fcb2bac-dirty, 02e7e31-dirty
pass_rate_1: 56.4
pass_rate_2: 69.9
percent_cases_well_formed: 97.0
error_outputs: 10
num_malformed_responses: 6
num_with_malformed_responses: 4
user_asks: 8
lazy_comments: 0
syntax_errors: 1
indentation_errors: 0
exhausted_context_windows: 2
test_timeouts: 1
command: aider --model gemini/gemini-2.0-flash-exp
date: 2024-12-11
versions: 0.68.1.dev
seconds_per_case: 7.3
total_cost: 0.0000
- dirname: 2024-12-18-01-50-08--o1
test_cases: 133
model: o1
edit_format: diff
commit_hash: 074c636-dirty
pass_rate_1: 65.4
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: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model openrouter/openai/o1
date: 2024-12-18
versions: 0.69.2.dev
seconds_per_case: 29.9
total_cost: 0.0000
- dirname: 2024-12-21-22-06-01--polyglot-o1-mini-whole
test_cases: 225
model: o1-mini-2024-09-12
edit_format: whole
commit_hash: a755079-dirty
pass_rate_1: 8.9
pass_rate_2: 27.1
pass_num_1: 20
pass_num_2: 61
percent_cases_well_formed: 95.6
error_outputs: 15
num_malformed_responses: 14
num_with_malformed_responses: 10
user_asks: 37
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 5
total_tests: 225
command: aider --model o1-mini
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 34.3
total_cost: 17.6270

View File

@@ -0,0 +1,259 @@
- dirname: 2024-12-21-18-41-18--polyglot-gpt-4o-mini
test_cases: 225
model: gpt-4o-mini-2024-07-18
edit_format: whole
commit_hash: a755079-dirty
pass_rate_1: 0.9
pass_rate_2: 3.6
pass_num_1: 2
pass_num_2: 8
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 36
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
total_tests: 225
command: aider --model gpt-4o-mini-2024-07-18
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 17.3
total_cost: 0.3236
- dirname: 2024-12-21-18-44-28--polyglot-sonnet
test_cases: 225
model: claude-3-5-sonnet-20241022
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 18.7
pass_rate_2: 45.3
pass_num_1: 42
pass_num_2: 102
percent_cases_well_formed: 100.0
error_outputs: 1
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 14
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 12
total_tests: 225
command: aider --model claude-3-5-sonnet-20241022
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 30.8
total_cost: 13.4847
- dirname: 2024-12-21-18-52-34--polyglot-gpt-4o-diff
test_cases: 225
model: gpt-4o-2024-11-20
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 4.9
pass_rate_2: 15.1
pass_num_1: 11
pass_num_2: 34
percent_cases_well_formed: 96.0
error_outputs: 12
num_malformed_responses: 11
num_with_malformed_responses: 9
user_asks: 34
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 19
total_tests: 225
command: aider --model gpt-4o-2024-11-20
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 22.2
total_cost: 7.1835
- dirname: 2024-12-21-19-23-03--polyglot-o1-hard-diff
test_cases: 224
model: o1-2024-12-17 (high)
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 23.7
pass_rate_2: 61.7
pass_num_1: 53
pass_num_2: 139
percent_cases_well_formed: 91.5
error_outputs: 25
num_malformed_responses: 24
num_with_malformed_responses: 19
user_asks: 16
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
total_tests: 225
command: aider --model openrouter/openai/o1
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 133.2
total_cost: 0.0000
- dirname: 2024-12-21-20-56-21--polyglot-deepseek-diff
test_cases: 225
model: DeepSeek Chat V2.5
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 5.3
pass_rate_2: 17.8
pass_num_1: 12
pass_num_2: 40
percent_cases_well_formed: 92.9
error_outputs: 42
num_malformed_responses: 37
num_with_malformed_responses: 16
user_asks: 23
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 5
test_timeouts: 5
total_tests: 225
command: aider --model deepseek/deepseek-chat
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 184.0
total_cost: 0.5101
- dirname: 2024-12-21-21-46-27--polyglot-haiku-diff
test_cases: 225
model: claude-3-5-haiku-20241022
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 7.1
pass_rate_2: 28.0
pass_num_1: 16
pass_num_2: 63
percent_cases_well_formed: 91.1
error_outputs: 31
num_malformed_responses: 30
num_with_malformed_responses: 20
user_asks: 13
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 9
total_tests: 225
command: aider --model claude-3-5-haiku-20241022
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 31.8
total_cost: 6.0583
- dirname: 2024-12-22-13-22-32--polyglot-qwen-diff
test_cases: 225
model: Qwen2.5-Coder-32B-Instruct
edit_format: diff
commit_hash: 6d7e8be-dirty
pass_rate_1: 4.4
pass_rate_2: 8.0
pass_num_1: 10
pass_num_2: 18
percent_cases_well_formed: 71.6
error_outputs: 158
num_malformed_responses: 148
num_with_malformed_responses: 64
user_asks: 132
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 2
total_tests: 225
command: "aider --model openai/Qwen/Qwen2.5-Coder-32B-Instruct # via hyperbolic"
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 84.4
total_cost: 0.0000
- dirname: 2024-12-22-21-26-35--polyglot-o1mini-whole
test_cases: 225
model: o1-mini-2024-09-12
edit_format: whole
commit_hash: 37df899
pass_rate_1: 5.8
pass_rate_2: 32.9
pass_num_1: 13
pass_num_2: 74
percent_cases_well_formed: 96.9
error_outputs: 8
num_malformed_responses: 8
num_with_malformed_responses: 7
user_asks: 27
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
total_tests: 225
command: aider --model o1-mini
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 34.7
total_cost: 18.5770
- dirname: 2024-12-22-18-43-25--gemini-exp-1206-polyglot-whole-2
test_cases: 225
model: gemini-exp-1206
edit_format: whole
commit_hash: b1bc2f8
pass_rate_1: 19.6
pass_rate_2: 38.2
pass_num_1: 44
pass_num_2: 86
percent_cases_well_formed: 98.2
error_outputs: 8
num_malformed_responses: 8
num_with_malformed_responses: 4
user_asks: 32
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 9
total_tests: 225
command: aider --model gemini/gemini-exp-1206
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 45.5
total_cost: 0.0000
- dirname: 2024-12-22-20-08-13--gemini-2.0-flash-exp-polyglot-whole
test_cases: 225
model: gemini-2.0-flash-exp
edit_format: whole
commit_hash: b1bc2f8
pass_rate_1: 11.6
pass_rate_2: 22.2
pass_num_1: 26
pass_num_2: 50
percent_cases_well_formed: 100.0
error_outputs: 1
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 9
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 8
total_tests: 225
command: aider --model gemini/gemini-2.0-flash-exp
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 12.2
total_cost: 0.0000

View File

@@ -0,0 +1,730 @@
- dirname: 2025-02-25-20-23-07--gemini-pro
test_cases: 225
model: gemini/gemini-2.0-pro-exp-02-05
edit_format: whole
commit_hash: 2fccd47
pass_rate_1: 20.4
pass_rate_2: 35.6
pass_num_1: 46
pass_num_2: 80
percent_cases_well_formed: 100.0
error_outputs: 430
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 13
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 5
total_tests: 225
command: aider --model gemini/gemini-2.0-pro-exp-02-05
date: 2025-02-25
versions: 0.75.2.dev
seconds_per_case: 34.8
total_cost: 0.0000
- dirname: 2024-12-21-18-41-18--polyglot-gpt-4o-mini
test_cases: 225
model: gpt-4o-mini-2024-07-18
edit_format: whole
commit_hash: a755079-dirty
pass_rate_1: 0.9
pass_rate_2: 3.6
pass_num_1: 2
pass_num_2: 8
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 36
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
total_tests: 225
command: aider --model gpt-4o-mini-2024-07-18
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 17.3
total_cost: 0.3236
- dirname: 2025-01-17-19-44-33--sonnet-baseline-jan-17
test_cases: 225
model: claude-3-5-sonnet-20241022
edit_format: diff
commit_hash: 6451d59
pass_rate_1: 22.2
pass_rate_2: 51.6
pass_num_1: 50
pass_num_2: 116
percent_cases_well_formed: 99.6
error_outputs: 2
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 11
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 8
total_tests: 225
command: aider --model claude-3-5-sonnet-20241022
date: 2025-01-17
versions: 0.71.2.dev
seconds_per_case: 21.4
total_cost: 14.4063
- dirname: 2024-12-30-20-57-12--gpt-4o-2024-11-20-ex-as-sys
test_cases: 225
model: gpt-4o-2024-11-20
edit_format: diff
commit_hash: 09ee197-dirty
pass_rate_1: 4.9
pass_rate_2: 18.2
pass_num_1: 11
pass_num_2: 41
percent_cases_well_formed: 95.1
error_outputs: 12
num_malformed_responses: 12
num_with_malformed_responses: 11
user_asks: 53
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 12
total_tests: 225
command: aider --model gpt-4o-2024-11-20
date: 2024-12-30
versions: 0.70.1.dev
seconds_per_case: 12.1
total_cost: 6.7351
- dirname: 2024-12-30-20-44-54--gpt4o-ex-as-sys-clean-prompt
test_cases: 225
model: gpt-4o-2024-08-06
edit_format: diff
commit_hash: 09ee197-dirty
pass_rate_1: 4.9
pass_rate_2: 23.1
pass_num_1: 11
pass_num_2: 52
percent_cases_well_formed: 94.2
error_outputs: 21
num_malformed_responses: 21
num_with_malformed_responses: 13
user_asks: 65
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
total_tests: 225
command: aider --model gpt-4o-2024-08-06
date: 2024-12-30
versions: 0.70.1.dev
seconds_per_case: 16.0
total_cost: 7.0286
- dirname: 2024-12-21-19-23-03--polyglot-o1-hard-diff
test_cases: 224
model: o1-2024-12-17 (high)
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 23.7
pass_rate_2: 61.7
pass_num_1: 53
pass_num_2: 139
percent_cases_well_formed: 91.5
error_outputs: 25
num_malformed_responses: 24
num_with_malformed_responses: 19
user_asks: 16
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
total_tests: 225
command: aider --model openrouter/openai/o1
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 133.2
total_cost: 186.4958
- dirname: 2024-12-21-20-56-21--polyglot-deepseek-diff
test_cases: 225
model: DeepSeek Chat V2.5
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 5.3
pass_rate_2: 17.8
pass_num_1: 12
pass_num_2: 40
percent_cases_well_formed: 92.9
error_outputs: 42
num_malformed_responses: 37
num_with_malformed_responses: 16
user_asks: 23
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 5
test_timeouts: 5
total_tests: 225
command: aider --model deepseek/deepseek-chat
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 184.0
total_cost: 0.5101
- dirname: 2024-12-21-21-46-27--polyglot-haiku-diff
test_cases: 225
model: claude-3-5-haiku-20241022
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 7.1
pass_rate_2: 28.0
pass_num_1: 16
pass_num_2: 63
percent_cases_well_formed: 91.1
error_outputs: 31
num_malformed_responses: 30
num_with_malformed_responses: 20
user_asks: 13
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 9
total_tests: 225
command: aider --model claude-3-5-haiku-20241022
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 31.8
total_cost: 6.0583
- dirname: 2024-12-22-13-22-32--polyglot-qwen-diff
test_cases: 225
model: Qwen2.5-Coder-32B-Instruct
edit_format: diff
commit_hash: 6d7e8be-dirty
pass_rate_1: 4.4
pass_rate_2: 8.0
pass_num_1: 10
pass_num_2: 18
percent_cases_well_formed: 71.6
error_outputs: 158
num_malformed_responses: 148
num_with_malformed_responses: 64
user_asks: 132
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 2
total_tests: 225
command: "aider --model openai/Qwen/Qwen2.5-Coder-32B-Instruct # via hyperbolic"
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 84.4
total_cost: 0.0000
- dirname: 2024-12-22-21-26-35--polyglot-o1mini-whole
test_cases: 225
model: o1-mini-2024-09-12
edit_format: whole
commit_hash: 37df899
pass_rate_1: 5.8
pass_rate_2: 32.9
pass_num_1: 13
pass_num_2: 74
percent_cases_well_formed: 96.9
error_outputs: 8
num_malformed_responses: 8
num_with_malformed_responses: 7
user_asks: 27
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
total_tests: 225
command: aider --model o1-mini
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 34.7
total_cost: 18.5770
- dirname: 2024-12-22-18-43-25--gemini-exp-1206-polyglot-whole-2
test_cases: 225
model: gemini-exp-1206
edit_format: whole
commit_hash: b1bc2f8
pass_rate_1: 19.6
pass_rate_2: 38.2
pass_num_1: 44
pass_num_2: 86
percent_cases_well_formed: 98.2
error_outputs: 8
num_malformed_responses: 8
num_with_malformed_responses: 4
user_asks: 32
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 9
total_tests: 225
command: aider --model gemini/gemini-exp-1206
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 45.5
total_cost: 0.0000
- dirname: 2024-12-22-20-08-13--gemini-2.0-flash-exp-polyglot-whole
test_cases: 225
model: gemini-2.0-flash-exp
edit_format: whole
commit_hash: b1bc2f8
pass_rate_1: 11.6
pass_rate_2: 22.2
pass_num_1: 26
pass_num_2: 50
percent_cases_well_formed: 100.0
error_outputs: 1
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 9
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 8
total_tests: 225
command: aider --model gemini/gemini-2.0-flash-exp
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 12.2
total_cost: 0.0000
- dirname: 2024-12-23-01-11-56--yi-test
test_cases: 225
model: yi-lightning
edit_format: whole
commit_hash: 2b1625e
pass_rate_1: 5.8
pass_rate_2: 12.9
pass_num_1: 13
pass_num_2: 29
percent_cases_well_formed: 92.9
error_outputs: 87
num_malformed_responses: 72
num_with_malformed_responses: 16
user_asks: 107
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 6
total_tests: 225
command: aider --model openai/yi-lightning
date: 2024-12-23
versions: 0.69.2.dev
seconds_per_case: 146.7
total_cost: 0.0000
- dirname: 2024-12-25-13-31-51--deepseekv3preview-diff2
test_cases: 225
model: DeepSeek Chat V3
edit_format: diff
commit_hash: 0a23c4a-dirty
pass_rate_1: 22.7
pass_rate_2: 48.4
pass_num_1: 51
pass_num_2: 109
percent_cases_well_formed: 98.7
error_outputs: 7
num_malformed_responses: 7
num_with_malformed_responses: 3
user_asks: 19
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 8
total_tests: 225
command: aider --model deepseek/deepseek-chat
date: 2024-12-25
versions: 0.69.2.dev
seconds_per_case: 34.8
total_cost: 0.3369
- dirname: 2024-12-26-00-55-20--Qwen2.5-Coder-32B-Instruct
test_cases: 225
model: Qwen2.5-Coder-32B-Instruct
edit_format: whole
commit_hash: b51768b0
pass_rate_1: 4.9
pass_rate_2: 16.4
pass_num_1: 11
pass_num_2: 37
percent_cases_well_formed: 99.6
error_outputs: 1
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 33
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 6
total_tests: 225
command: aider --model openai/Qwen2.5-Coder-32B-Instruct
date: 2024-12-26
versions: 0.69.2.dev
seconds_per_case: 42.0
total_cost: 0.0000
- dirname: 2025-01-13-18-17-25--codestral-whole2
test_cases: 225
model: Codestral 25.01
edit_format: whole
commit_hash: 0cba898-dirty
pass_rate_1: 4.0
pass_rate_2: 11.1
pass_num_1: 9
pass_num_2: 25
percent_cases_well_formed: 100.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 47
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 4
total_tests: 225
command: aider --model mistral/codestral-latest
date: 2025-01-13
versions: 0.71.2.dev
seconds_per_case: 9.3
total_cost: 1.9834
- dirname: 2025-01-20-19-11-38--ds-turns-upd-cur-msgs-fix-with-summarizer
test_cases: 225
model: DeepSeek R1
edit_format: diff
commit_hash: 5650697-dirty
pass_rate_1: 26.7
pass_rate_2: 56.9
pass_num_1: 60
pass_num_2: 128
percent_cases_well_formed: 96.9
error_outputs: 8
num_malformed_responses: 7
num_with_malformed_responses: 7
user_asks: 15
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 5
total_tests: 225
command: aider --model deepseek/deepseek-reasoner
date: 2025-01-20
versions: 0.71.2.dev
seconds_per_case: 113.7
total_cost: 5.4193
- dirname: 2025-01-23-19-14-48--r1-architect-sonnet
test_cases: 225
model: DeepSeek R1 + claude-3-5-sonnet-20241022
edit_format: architect
commit_hash: 05a77c7
editor_model: claude-3-5-sonnet-20241022
editor_edit_format: editor-diff
pass_rate_1: 27.1
pass_rate_2: 64.0
pass_num_1: 61
pass_num_2: 144
percent_cases_well_formed: 100.0
error_outputs: 2
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 392
lazy_comments: 6
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 5
total_tests: 225
command: aider --architect --model r1 --editor-model sonnet
date: 2025-01-23
versions: 0.72.3.dev
seconds_per_case: 251.6
total_cost: 13.2933
- dirname: 2025-01-28-16-00-03--qwen-max-2025-01-25-polyglot-diff
test_cases: 225
model: qwen-max-2025-01-25
edit_format: diff
commit_hash: ae7d459
pass_rate_1: 9.3
pass_rate_2: 21.8
pass_num_1: 21
pass_num_2: 49
percent_cases_well_formed: 90.2
error_outputs: 46
num_malformed_responses: 44
num_with_malformed_responses: 22
user_asks: 23
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 9
total_tests: 225
command: OPENAI_API_BASE=https://dashscope-intl.aliyuncs.com/compatible-mode/v1 aider --model openai/qwen-max-2025-01-25
date: 2025-01-28
versions: 0.72.4.dev
seconds_per_case: 39.5
- dirname: 2025-01-31-20-27-46--o3-mini-diff2
test_cases: 225
model: o3-mini (medium)
edit_format: diff
commit_hash: 2fb517b-dirty
pass_rate_1: 19.1
pass_rate_2: 53.8
pass_num_1: 43
pass_num_2: 121
percent_cases_well_formed: 95.1
error_outputs: 28
num_malformed_responses: 28
num_with_malformed_responses: 11
user_asks: 17
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
total_tests: 225
command: aider --model o3-mini
date: 2025-01-31
versions: 0.72.4.dev
seconds_per_case: 47.2
total_cost: 8.8599
- dirname: 2025-01-31-20-42-47--o3-mini-diff-high
test_cases: 224
model: o3-mini (high)
edit_format: diff
commit_hash: b0d58d1-dirty
pass_rate_1: 21.0
pass_rate_2: 60.4
pass_num_1: 47
pass_num_2: 136
percent_cases_well_formed: 93.3
error_outputs: 26
num_malformed_responses: 24
num_with_malformed_responses: 15
user_asks: 19
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 7
total_tests: 225
command: aider --model o3-mini --reasoning-effort high
date: 2025-01-31
versions: 0.72.4.dev
seconds_per_case: 124.6
total_cost: 18.1584
- dirname: 2025-01-21-22-51-49--gemini-2.0-flash-thinking-exp-01-21-polyglot-diff
test_cases: 225
model: gemini-2.0-flash-thinking-exp-01-21
edit_format: diff
commit_hash: 843720a
pass_rate_1: 5.8
pass_rate_2: 18.2
pass_num_1: 13
pass_num_2: 41
percent_cases_well_formed: 77.8
error_outputs: 182
num_malformed_responses: 180
num_with_malformed_responses: 50
user_asks: 26
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 2
test_timeouts: 7
total_tests: 225
command: aider --model gemini/gemini-2.0-flash-thinking-exp-01-21
date: 2025-01-21
versions: 0.72.2.dev
seconds_per_case: 24.2
total_cost: 0.0000
- dirname: 2025-02-15-19-51-22--chatgpt4o-feb15-diff
test_cases: 223
model: chatgpt-4o-latest (2025-02-15)
edit_format: diff
commit_hash: 108ce18-dirty
pass_rate_1: 9.0
pass_rate_2: 27.1
pass_num_1: 20
pass_num_2: 61
percent_cases_well_formed: 93.3
error_outputs: 66
num_malformed_responses: 21
num_with_malformed_responses: 15
user_asks: 57
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
total_tests: 225
command: aider --model chatgpt-4o-latest
date: 2025-02-15
versions: 0.74.3.dev
seconds_per_case: 12.4
total_cost: 14.3703
- dirname: 2025-02-24-19-54-07--sonnet37-diff
test_cases: 225
model: claude-3-7-sonnet-20250219 (no thinking)
edit_format: diff
commit_hash: 75e9ee6
pass_rate_1: 24.4
pass_rate_2: 60.4
pass_num_1: 55
pass_num_2: 136
percent_cases_well_formed: 93.3
error_outputs: 16
num_malformed_responses: 16
num_with_malformed_responses: 15
user_asks: 12
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
total_tests: 225
command: aider --model sonnet
date: 2025-02-24
versions: 0.74.4.dev
seconds_per_case: 28.3
total_cost: 17.7191
- dirname: 2025-02-24-21-47-23--sonnet37-diff-think-32k-64k
test_cases: 225
model: claude-3-7-sonnet-20250219 (32k thinking tokens)
edit_format: diff
commit_hash: 60d11a6, 93edbda
pass_rate_1: 29.3
pass_rate_2: 64.9
pass_num_1: 66
pass_num_2: 146
percent_cases_well_formed: 97.8
error_outputs: 66
num_malformed_responses: 5
num_with_malformed_responses: 5
user_asks: 5
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
total_tests: 225
command: "aider --model anthropic/claude-3-7-sonnet-20250219 # plus yml config"
date: 2025-02-24
versions: 0.75.1.dev
seconds_per_case: 105.2
total_cost: 36.8343
- dirname: 2025-02-27-20-26-15--gpt45-diff3
test_cases: 224
model: gpt-4.5-preview
edit_format: diff
commit_hash: b462e55-dirty
pass_rate_1: 22.3
pass_rate_2: 44.9
pass_num_1: 50
pass_num_2: 101
percent_cases_well_formed: 97.3
error_outputs: 10
num_malformed_responses: 8
num_with_malformed_responses: 6
user_asks: 15
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 2
total_tests: 225
command: aider --model openai/gpt-4.5-preview
date: 2025-02-27
versions: 0.75.2.dev
seconds_per_case: 113.5
total_cost: 183.1802
- dirname: 2025-03-06-17-40-24--qwq32b-diff-temp-topp-ex-sys-remind-user-for-real
test_cases: 225
model: QwQ-32B
edit_format: diff
commit_hash: 51d118f-dirty
pass_rate_1: 8.0
pass_rate_2: 20.9
pass_num_1: 18
pass_num_2: 47
percent_cases_well_formed: 67.6
error_outputs: 145
num_malformed_responses: 143
num_with_malformed_responses: 73
user_asks: 17
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 4
total_tests: 225
command: aider --model fireworks_ai/accounts/fireworks/models/qwq-32b
date: 2025-03-06
versions: 0.75.3.dev
seconds_per_case: 228.6
total_cost: 0.0000
- dirname: 2025-03-07-15-11-27--qwq32b-arch-temp-topp-again
test_cases: 225
model: QwQ-32B + Qwen 2.5 Coder Instruct
edit_format: architect
commit_hash: 52162a5
editor_model: fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct
editor_edit_format: editor-diff
pass_rate_1: 9.8
pass_rate_2: 26.2
pass_num_1: 22
pass_num_2: 59
percent_cases_well_formed: 100.0
error_outputs: 122
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 489
lazy_comments: 8
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 2
total_tests: 225
command: aider --model fireworks_ai/accounts/fireworks/models/qwq-32b --architect
date: 2025-03-07
versions: 0.75.3.dev
seconds_per_case: 137.4
total_cost: 0

View File

@@ -296,4 +296,27 @@
date: 2024-11-24
versions: 0.64.2.dev
seconds_per_case: 28.5
total_cost: 0.1390
total_cost: 0.1390
- dirname: 2024-11-26-03-15-06--ollama-qwen2.5-coder:32b-instruct-fp16-2kctx
test_cases: 132
model: "Ollama: fp16, 2k ctx"
edit_format: diff
commit_hash: 68be6c5-dirty, 554d274, 2ff3a23, 2ff3a23-dirty, 61759f9, dd48b74, 3ebd47d-dirty
pass_rate_1: 43.2
pass_rate_2: 51.9
percent_cases_well_formed: 46.2
error_outputs: 171
num_malformed_responses: 165
num_with_malformed_responses: 71
user_asks: 97
lazy_comments: 2
syntax_errors: 4
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: "aider --model ollama/qwen2.5-coder:32b-instruct-fp16 # num_ctx: 2048"
date: 2024-11-26
versions: 0.64.2.dev,0.65.1.dev
seconds_per_case: 188.6
total_cost: 0.0000

170
aider/website/_data/qwq.yml Normal file
View File

@@ -0,0 +1,170 @@
- dirname: 2024-11-28-21-38-50--architect-qwq-haiku-whole
test_cases: 133
model: QwQ + Haiku
edit_format: architect
commit_hash: e4a1d6f
editor_model: claude-3-5-haiku-20241022
editor_edit_format: editor-whole
pass_rate_1: 54.1
pass_rate_2: 71.4
percent_cases_well_formed: 100.0
error_outputs: 4
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 196
lazy_comments: 4
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model openrouter/qwen/qwq-32b-preview --editor-model claude-3-5-haiku-20241022 --edit-format editor-whole
date: 2024-11-28
versions: 0.65.2.dev
seconds_per_case: 154.7
total_cost: 1.4196
- dirname: 2024-11-28-19-24-35--architect-qwq-deepseek-whole
test_cases: 133
model: QwQ + DeepSeek V2.5
edit_format: architect
commit_hash: e4a1d6f
editor_model: deepseek/deepseek-chat
editor_edit_format: editor-whole
pass_rate_1: 55.6
pass_rate_2: 67.7
percent_cases_well_formed: 100.0
error_outputs: 3
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 193
lazy_comments: 2
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model openrouter/qwen/qwq-32b-preview --editor-model deepseek/deepseek-chat --edit-format editor-whole
date: 2024-11-28
versions: 0.65.2.dev
seconds_per_case: 170.3
total_cost: 0.1558
- dirname: 2024-11-09-11-09-15--Qwen2.5-Coder-32B-Instruct
test_cases: 133
model: Qwen2.5 Coder 32B-I
released: 2024-11-12
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/hf:Qwen/Qwen2.5-Coder-32B-Instruct --openai-api-base https://glhf.chat/api/openai/v1 (via GLHF)
date: 2024-11-09
versions: 0.59.2.dev
seconds_per_case: 22.5
total_cost: 0.0000
- dirname: 2024-12-04-00-10-39--architect-qwq-qwen
test_cases: 132
model: QwQ + Qwen2.5 Coder 32B-I
edit_format: architect
commit_hash: 51c02da
editor_model: openrouter/qwen/qwen-2.5-coder-32b-instruct
editor_edit_format: editor-whole
pass_rate_1: 58.3
pass_rate_2: 73.6
percent_cases_well_formed: 100.0
error_outputs: 3
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 186
lazy_comments: 5
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model openrouter/qwen/qwq-32b-preview --editor-model openrouter/qwen/qwen-2.5-coder-32b-instruct --editor-edit-format editor-whole
date: 2024-12-04
versions: 0.66.1.dev
seconds_per_case: 144.1
total_cost: 0.1444
- dirname: 2024-12-04-00-42-05--qwq-alone-whole
test_cases: 133
model: QwQ
edit_format: whole
commit_hash: 19004c0
pass_rate_1: 33.1
pass_rate_2: 42.1
percent_cases_well_formed: 91.0
error_outputs: 28
num_malformed_responses: 12
num_with_malformed_responses: 12
user_asks: 119
lazy_comments: 2
syntax_errors: 22
indentation_errors: 9
exhausted_context_windows: 2
test_timeouts: 1
command: aider --model openrouter/qwen/qwq-32b-preview
date: 2024-12-04
versions: 0.66.1.dev
seconds_per_case: 414.3
total_cost: 0.0000
- dirname: 2024-09-12-19-57-35--o1-mini-whole
test_cases: 133
model: o1-mini
edit_format: whole
commit_hash: 36fa773-dirty, 291b456
pass_rate_1: 49.6
pass_rate_2: 70.7
percent_cases_well_formed: 90.0
error_outputs: 0
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 17
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model o1-mini
date: 2024-09-12
versions: 0.56.1.dev
seconds_per_case: 103.0
total_cost: 5.3725
- dirname: 2024-09-21-16-45-11--o1-preview-flex-sr-markers
test_cases: 133
model: o1-preview
_released: 2024-09-12
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

View File

@@ -0,0 +1,138 @@
- dirname: 2025-01-23-19-14-48--r1-architect-sonnet
test_cases: 225
model: R1+Sonnet
edit_format: architect
commit_hash: 05a77c7
editor_model: claude-3-5-sonnet-20241022
editor_edit_format: editor-diff
pass_rate_1: 27.1
pass_rate_2: 64.0
pass_num_1: 61
pass_num_2: 144
percent_cases_well_formed: 100.0
error_outputs: 2
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 392
lazy_comments: 6
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 5
total_tests: 225
command: aider --architect --model r1 --editor-model sonnet
date: 2025-01-23
versions: 0.72.3.dev
seconds_per_case: 251.6
total_cost: 13.2933
- dirname: 2025-01-20-19-11-38--ds-turns-upd-cur-msgs-fix-with-summarizer
test_cases: 225
model: R1
edit_format: diff
commit_hash: 5650697-dirty
pass_rate_1: 26.7
pass_rate_2: 56.9
pass_num_1: 60
pass_num_2: 128
percent_cases_well_formed: 96.9
error_outputs: 8
num_malformed_responses: 7
num_with_malformed_responses: 7
user_asks: 15
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 5
total_tests: 225
command: aider --model r1
date: 2025-01-20
versions: 0.71.2.dev
seconds_per_case: 113.7
total_cost: 5.4193
- dirname: 2024-12-21-19-23-03--polyglot-o1-hard-diff
test_cases: 224
model: o1
edit_format: diff
commit_hash: a755079-dirty
pass_rate_1: 23.7
pass_rate_2: 61.7
pass_num_1: 53
pass_num_2: 139
percent_cases_well_formed: 91.5
error_outputs: 25
num_malformed_responses: 24
num_with_malformed_responses: 19
user_asks: 16
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
total_tests: 225
command: aider --model o1
date: 2024-12-21
versions: 0.69.2.dev
seconds_per_case: 133.2
total_cost: 186.4958
- dirname: 2024-12-25-13-31-51--deepseekv3preview-diff2
test_cases: 225
model: DeepSeek V3
edit_format: diff
commit_hash: 0a23c4a-dirty
pass_rate_1: 22.7
pass_rate_2: 48.4
pass_num_1: 51
pass_num_2: 109
percent_cases_well_formed: 98.7
error_outputs: 7
num_malformed_responses: 7
num_with_malformed_responses: 3
user_asks: 19
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 8
total_tests: 225
command: aider --model deepseek
date: 2024-12-25
versions: 0.69.2.dev
seconds_per_case: 34.8
total_cost: 0.3369
- dirname: 2025-01-17-19-44-33--sonnet-baseline-jan-17
test_cases: 225
model: Sonnet
edit_format: diff
commit_hash: 6451d59
pass_rate_1: 22.2
pass_rate_2: 51.6
pass_num_1: 50
pass_num_2: 116
percent_cases_well_formed: 99.6
error_outputs: 2
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 11
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 8
total_tests: 225
command: aider --model sonnet
date: 2025-01-17
versions: 0.71.2.dev
seconds_per_case: 21.4
total_cost: 14.4063

View File

@@ -1,5 +1,18 @@
<canvas id="blameChart" width="800" height="360" style="margin-top: 20px"></canvas>
<canvas id="linesChart" width="800" height="360" style="margin-top: 20px"></canvas>
<div class="chart-container">
<canvas id="blameChart" style="margin-top: 20px"></canvas>
</div>
<div class="chart-container">
<canvas id="linesChart" style="margin-top: 20px"></canvas>
</div>
<style>
.chart-container {
position: relative;
width: 100%;
height: 300px;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment"></script>
@@ -24,10 +37,17 @@ document.addEventListener('DOMContentLoaded', function () {
var linesData = {
labels: labels,
datasets: [{
label: 'Aider\'s lines of new code',
label: 'Aider',
data: [{% for row in site.data.blame %}{ x: '{{ row.end_tag }}', y: {{ row.aider_total }} },{% endfor %}],
backgroundColor: 'rgba(255, 99, 132, 0.8)',
borderColor: 'rgba(255, 99, 132, 1)',
backgroundColor: 'rgba(54, 162, 235, 0.8)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1
},
{
label: 'Human',
data: [{% for row in site.data.blame %}{ x: '{{ row.end_tag }}', y: {{ row.total_lines | minus: row.aider_total }} },{% endfor %}],
backgroundColor: 'rgba(200, 200, 200, 0.8)',
borderColor: 'rgba(200, 200, 200, 1)',
borderWidth: 1
}]
};
@@ -36,6 +56,7 @@ document.addEventListener('DOMContentLoaded', function () {
type: 'bar',
data: blameData,
options: {
maintainAspectRatio: false,
scales: {
x: {
type: 'category',
@@ -85,9 +106,11 @@ document.addEventListener('DOMContentLoaded', function () {
type: 'bar',
data: linesData,
options: {
maintainAspectRatio: false,
scales: {
x: {
type: 'category',
stacked: true,
title: {
display: true,
text: 'Version'
@@ -98,6 +121,7 @@ document.addEventListener('DOMContentLoaded', function () {
}
},
y: {
stacked: true,
title: {
display: true,
text: 'Lines of new code'
@@ -107,12 +131,14 @@ document.addEventListener('DOMContentLoaded', function () {
},
plugins: {
legend: {
display: false
display: true,
position: 'chartArea',
reverse: true
},
tooltip: {
callbacks: {
label: function(context) {
var label = 'New lines of code by aider';
var label = context.dataset.label;
var value = context.parsed.y || 0;
return `${label}: ${value}`;
}
@@ -120,7 +146,7 @@ document.addEventListener('DOMContentLoaded', function () {
},
title: {
display: true,
text: 'Lines of new code written by aider, by release',
text: 'Lines of new code, by release',
font: {
size: 16
}

View File

@@ -1,97 +0,0 @@
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
}]
};
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();
// Add search functionality for edit table
document.getElementById('editSearchInput').addEventListener('keyup', function() {
var searchWords = this.value.toLowerCase().split(' ').filter(word => word.length > 0);
var tableBody = document.querySelector('table:first-of-type tbody');
var rows = tableBody.getElementsByTagName('tr');
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
for (var i = 0; i < rows.length; i++) {
var rowText = rows[i].textContent;
if (searchWords.every(word => rowText.toLowerCase().includes(word))) {
rows[i].style.display = '';
leaderboardData.labels.push(allData[i].model);
leaderboardData.datasets[0].data.push(allData[i].pass_rate_2);
} else {
rows[i].style.display = 'none';
}
}
leaderboardChart.update();
});
});

View File

@@ -1,6 +0,0 @@
{: .tip }
All API keys can be stored in a
[.env file](/docs/config/dotenv.html).
Only OpenAI and Anthropic keys can be stored in the
[YAML config file](/docs/config/aider_conf.html).

View File

@@ -1,17 +1,25 @@
You can get started quickly like this:
If you already have python 3.8-3.13 installed, you can get started quickly like this:
```
python -m pip install -U aider-chat
# Change directory into a git repo
cd /to/your/git/repo
# Work with Claude 3.5 Sonnet on your repo
export ANTHROPIC_API_KEY=your-key-goes-here
aider
# Work with GPT-4o on your repo
export OPENAI_API_KEY=your-key-goes-here
aider
```bash
python -m pip install aider-install
aider-install
# Change directory into your code base
cd /to/your/project
# Work with DeepSeek via DeepSeek's API
aider --model deepseek --api-key deepseek=your-key-goes-here
# Work with Claude 3.7 Sonnet via Anthropic's API
aider --model sonnet --api-key anthropic=your-key-goes-here
# Work with GPT-4o via OpenAI's API
aider --model gpt-4o --api-key openai=your-key-goes-here
# Work with Sonnet via OpenRouter's API
aider --model openrouter/anthropic/claude-3.7-sonnet --api-key openrouter=your-key-goes-here
# Work with DeepSeek via OpenRouter's API
aider --model openrouter/deepseek/deepseek-chat --api-key openrouter=your-key-goes-here
```

View File

@@ -18,3 +18,65 @@
<link rel="mask-icon" href="{{ '/assets/icons/safari-pinned-tab.svg' | relative_url }}" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
{% if site.analytics.enabled %}
<!-- Cookie Consent -->
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.css" />
<script src="https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.js" data-cfasync="false"></script>
<script>
window.addEventListener('load', function(){
window.cookieconsent.initialise({
palette: {
popup: {
background: "#333333",
text: "#ffffff"
},
button: {
background: "#ffffff",
text: "#333333"
}
},
type: "opt-in",
position: "bottom-left",
showLink: false,
dismissOnScroll: true,
cookie: {
name: 'cookieconsent_status',
path: '/',
domain: 'aider.chat',
expiryDays: 365
},
content: {
message: "This website uses analytics cookies to help us understand how you use the site.",
dismiss: "Decline",
allow: "Accept",
link: "Learn more",
href: "https://aider.chat/docs/legal/privacy.html"
},
onInitialise: function(status) {
var type = this.options.type;
var didConsent = this.hasConsented();
if (didConsent) {
initPostHog();
}
},
onStatusChange: function(status, chosenBefore) {
var type = this.options.type;
var didConsent = this.hasConsented();
if (didConsent) {
initPostHog();
}
}
})
});
// PostHog initialization function
function initPostHog() {
!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
posthog.init('{{ site.analytics.posthog_key }}', {
api_host: '{{ site.analytics.posthog_host }}',
person_profiles: 'identified_only'
})
}
</script>
{% endif %}

View File

@@ -0,0 +1,4 @@
{: .tip :}
See the
[API key configuration docs](/docs/config/api-keys.html)
for information on how to configure and store your API keys.

View File

@@ -0,0 +1,237 @@
document.addEventListener('DOMContentLoaded', function () {
var ctx = document.getElementById('editChart').getContext('2d');
const blueDiagonalPattern = pattern.draw('diagonal', 'rgba(54, 162, 235, 0.2)');
const redDiagonalPattern = pattern.draw('diagonal', 'rgba(255, 99, 132, 0.2)');
let displayedData = [];
const HIGHLIGHT_MODEL = '{{ highlight_model | default: "no no no" }}';
var leaderboardData = {
labels: [],
datasets: [{
label: 'Percent completed correctly',
data: [],
backgroundColor: function(context) {
const row = allData[context.dataIndex];
if (row && row.edit_format === 'whole') {
return diagonalPattern;
}
const label = leaderboardData.labels[context.dataIndex] || '';
return (label && label.includes(HIGHLIGHT_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(HIGHLIGHT_MODEL)) ? 'rgba(255, 99, 132, 1)' : 'rgba(54, 162, 235, 1)';
},
borderWidth: 1
}, {
label: 'Total Cost ($)',
data: [],
type: 'scatter',
yAxisID: 'y1',
backgroundColor: 'rgba(153, 102, 255, 1)',
borderColor: '#fff',
borderWidth: 1,
pointRadius: 5,
pointHoverRadius: 7
}]
};
var allData = [];
{% for row in data_source %}
allData.push({
model: '{{ row.model }}',
pass_rate: {{ row[pass_rate_field] }},
percent_cases_well_formed: {{ row.percent_cases_well_formed }},
edit_format: '{{ row.edit_format | default: "diff" }}',
total_cost: {{ row.total_cost | default: 0 }}
});
{% endfor %}
function updateChart() {
var selectedRows = document.querySelectorAll('tr.selected');
var showAll = selectedRows.length === 0;
displayedData = [];
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
leaderboardData.datasets[1].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')) {
displayedData.push(row);
leaderboardData.labels.push(row.model);
leaderboardData.datasets[0].data.push(row.pass_rate);
// Only include cost if it's not zero (placeholder for unknown)
leaderboardData.datasets[1].data.push(row.total_cost > 0 ? row.total_cost : null);
}
});
leaderboardChart.update();
leaderboardChart.render();
}
// Use displayedData in the backgroundColor callback instead of allData
leaderboardData.datasets[0].backgroundColor = function(context) {
const row = displayedData[context.dataIndex];
const label = leaderboardData.labels[context.dataIndex] || '';
if (label && label.includes(HIGHLIGHT_MODEL)) {
if (row && row.edit_format === 'whole') return redDiagonalPattern;
else return 'rgba(255, 99, 132, 0.2)';
} else if (row && row.edit_format === 'whole') {
return blueDiagonalPattern;
} else {
return 'rgba(54, 162, 235, 0.2)';
}
};
var tableBody = document.querySelector('table tbody');
allData.forEach(function(row, index) {
var tr = tableBody.children[index];
if (!tr) {
// If the row doesn't exist, create it
tr = document.createElement('tr');
tableBody.appendChild(tr);
}
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: {
plugins: {
legend: {
display: {% if show_legend == false %}false{% else %}true{% endif %},
labels: {
generateLabels: function(chart) {
return [
{
text: 'Diff-like format',
fillStyle: 'rgba(54, 162, 235, 0.2)',
strokeStyle: 'rgba(54, 162, 235, 1)',
lineWidth: 1
},
{
text: 'Whole format',
fillStyle: blueDiagonalPattern,
strokeStyle: 'rgba(54, 162, 235, 1)',
lineWidth: 1
},
{
text: 'Total Cost ($)',
fillStyle: 'rgba(153, 102, 255, 1)',
strokeStyle: '#fff',
lineWidth: 1,
pointStyle: 'circle'
}
];
}
}
},
tooltip: {
callbacks: {
label: function(context) {
const datasetLabel = context.dataset.label || '';
const value = context.parsed.y;
if (datasetLabel === 'Total Cost ($)') {
return datasetLabel + ': $' + value.toFixed(2);
}
return datasetLabel + ': ' + value.toFixed(1) + '%';
}
}
}
},
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Percent completed correctly'
}
},
y1: {
beginAtZero: true,
position: 'right',
grid: {
drawOnChartArea: false
},
title: {
display: true,
text: 'Total Cost ($)'
}
},
x: {
ticks: {
callback: function(value, index) {
const label = this.getLabelForValue(value);
if (label.length <= "claude-3-5-sonnet".length) {
return label;
}
// Find all possible split positions
const splitPositions = [];
for (let i = 0; i < label.length; i++) {
if (label[i] === '-' || label[i] === ' ') {
splitPositions.push(i);
}
}
if (splitPositions.length === 0) {
return label;
}
// Find split position closest to middle
const middle = label.length / 2;
const splitIndex = splitPositions.reduce((closest, current) => {
return Math.abs(current - middle) < Math.abs(closest - middle) ? current : closest;
});
return [
label.slice(0, splitIndex),
label.slice(splitIndex + 1)
];
}
}
}
}
}
});
updateChart();
// Add search functionality for edit table
document.getElementById('editSearchInput').addEventListener('keyup', function() {
var searchWords = this.value.toLowerCase().split(' ').filter(word => word.length > 0);
var tableBody = document.querySelector('table:first-of-type tbody');
var rows = tableBody.getElementsByTagName('tr');
displayedData = [];
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
leaderboardData.datasets[1].data = [];
for (var i = 0; i < rows.length; i++) {
var rowText = rows[i].textContent;
if (searchWords.every(word => rowText.toLowerCase().includes(word))) {
rows[i].style.display = '';
displayedData.push(allData[i]);
leaderboardData.labels.push(allData[i].model);
leaderboardData.datasets[0].data.push(allData[i].pass_rate);
// Only include cost if it's not zero (placeholder for unknown)
leaderboardData.datasets[1].data.push(allData[i].total_cost > 0 ? allData[i].total_cost : null);
} else {
rows[i].style.display = 'none';
}
}
leaderboardChart.update();
});
});

View File

@@ -5,7 +5,10 @@ You can send long, multi-line messages in the chat in a few ways:
- Use Meta-ENTER to start a new line without sending the message (Esc+ENTER in some environments).
- Use `/paste` to paste text from the clipboard into the chat.
- Use the `/editor` command to open your editor to create the next chat message. See [editor configuration docs](/docs/config/editor.html) for more info.
- Use multiline-mode, which swaps the function of Meta-Enter and Enter, so that Enter inserts a newline, and Meta-Enter submits your command. To enable multiline mode:
- Use the `/multiline-mode` command to toggle it during a session.
- Use the `--multiline` switch.
Example with a tag:
```
{python
@@ -13,3 +16,7 @@ def hello():
print("Hello}") # Note: contains a brace
python}
```
{: .note }
People often ask for SHIFT-ENTER to be a soft-newline.
Unfortunately there is no portable way to detect that keystroke in terminals.

View File

@@ -0,0 +1,120 @@
document.addEventListener('DOMContentLoaded', function () {
var ctx = document.getElementById('qwqChart').getContext('2d');
var allData = [];
{% for row in site.data.qwq %}
allData.push({
model: '{{ row.model }}',
pass_rate_2: {{ row.pass_rate_2 }}
});
{% endfor %}
// Sort data by pass_rate_2 in descending order
allData.sort((a, b) => b.pass_rate_2 - a.pass_rate_2);
var chart;
function updateChart(filterText) {
var filteredData = allData.filter(row =>
row.model.toLowerCase().includes(filterText.toLowerCase())
);
var chartData = {
labels: filteredData.map(row => row.model),
datasets: [{
data: filteredData.map(row => row.pass_rate_2),
backgroundColor: filteredData.map(row =>
(row.model === 'Qwen2.5 Coder 32B-I' || row.model === 'Sonnet (SOTA)' || row.model === 'o1-mini' || row.model === 'o1-preview' || row.model === 'QwQ')
? 'rgba(75, 192, 192, 0.2)' // Green for solo models
: 'rgba(54, 162, 235, 0.2)' // Blue for architect+editor
),
borderColor: filteredData.map(row =>
(row.model === 'Qwen2.5 Coder 32B-I' || row.model === 'Sonnet (SOTA)' || row.model === 'o1-mini' || row.model === 'o1-preview' || row.model === 'QwQ')
? 'rgba(75, 192, 192, 1)' // Green border for solo models
: 'rgba(54, 162, 235, 1)' // Blue border for architect+editor
),
borderWidth: 1
}]
};
if (chart) {
chart.data = chartData;
chart.update();
} else {
chart = new Chart(ctx, {
type: 'bar',
data: chartData,
options: {
plugins: {
legend: {
display: true,
position: 'top',
labels: {
font: {
size: 14
},
generateLabels: function(chart) {
return [
{
text: 'Solo model',
fillStyle: 'rgba(75, 192, 192, 0.2)',
strokeStyle: 'rgba(75, 192, 192, 1)',
lineWidth: 1,
fontColor: '#666'
},
{
text: 'Architect + Editor',
fillStyle: 'rgba(54, 162, 235, 0.2)',
strokeStyle: 'rgba(54, 162, 235, 1)',
lineWidth: 1,
fontColor: '#666'
}
];
}
}
}
},
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Aider code editing benchmark (%)',
font: {
size: 18
}
},
ticks: {
font: {
size: 16
}
}
},
x: {
ticks: {
font: {
size: 16
},
callback: function(value, index) {
const label = this.getLabelForValue(value);
if (label.includes(" + ")) {
const parts = label.split(" + ");
return [parts[0] + " +", parts[1]];
}
return label;
}
}
}
}
}
});
}
}
// Initial chart render
updateChart('');
// Connect search input to chart filtering
document.getElementById('qwqSearchInput').addEventListener('keyup', function() {
updateChart(this.value);
});
});

View File

@@ -1,90 +0,0 @@
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();
// Add search functionality for refactoring table
document.getElementById('refacSearchInput').addEventListener('keyup', function() {
var searchWords = this.value.toLowerCase().split(' ').filter(word => word.length > 0);
var tableBody = document.querySelectorAll('table tbody')[1];
var rows = tableBody.getElementsByTagName('tr');
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
for (var i = 0; i < rows.length; i++) {
var rowText = rows[i].textContent;
if (searchWords.every(word => rowText.toLowerCase().includes(word))) {
rows[i].style.display = '';
leaderboardData.labels.push(allData[i].model);
leaderboardData.datasets[0].data.push(allData[i].pass_rate_1);
} else {
rows[i].style.display = 'none';
}
}
leaderboardChart.update();
});
});

View File

@@ -1,6 +1,6 @@
To use aider with pipx on replit, you can run these commands in the replit shell:
```
```bash
pip install pipx
pipx run aider-chat ...normal aider args...
```

View File

@@ -1,12 +0,0 @@
Aider has special support for providing
OpenAI and Anthropic API keys
via
[command line switches](/docs/config/options.html)
and
[yaml config file](/docs/config/aider_conf.html).
*All other LLM providers* must
have their keys and settings
specified in environment variables.
This can be done in your shell,
or by using a
[.env file](/docs/config/dotenv.html).

View File

@@ -1,7 +0,0 @@
{: .tip }
Using a Python
[virtual environment](https://docs.python.org/3/library/venv.html){:target="_blank"}
is recommended.
Or, you could
[use pipx to install aider](/docs/install/pipx.html)
once for your whole system.

View File

@@ -1,2 +1 @@
Aider works best with GPT-4o & Claude 3.5 Sonnet and can
[connect to almost any LLM](https://aider.chat/docs/llms.html).
Aider works best with Claude 3.5 Sonnet, DeepSeek R1 & Chat V3, OpenAI o1, o3-mini & GPT-4o. Aider can [connect to almost any LLM, including local models](https://aider.chat/docs/llms.html).

View File

@@ -39,9 +39,7 @@ Aider will directly edit the code in your local source files,
and [git commit the changes](https://aider.chat/docs/git.html)
with sensible commit messages.
You can start a new project or work with an existing git repo.
Aider works well with GPT 3.5, GPT-4, GPT-4 Turbo with Vision,
and Claude 3 Opus.
It also supports [connecting to almost any LLM](https://aider.chat/docs/llms.html).
{% include works-best.md %}
Use the `--browser` switch to launch the browser version of aider:

View File

@@ -1,6 +1,6 @@
---
title: Aider has written 7% of its own code
excerpt: Aider has written 7% of its own code, via 600+ commits that inserted 4.8K and deleted 1.5K lines of code.
title: Aider has written 7% of its own code (outdated, now 70%)
excerpt: This article is quite out dated. Aider is currently writing about 70% of the new code in each release.
highlight_image: /assets/self-assembly.jpg
nav_exclude: true
---
@@ -8,13 +8,16 @@ nav_exclude: true
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
{% endif %}
# Aider has written 7% of its own code
# Aider has written 7% of its own code (outdated, now 70%)
[![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).
This article is quite old and outdated.
Aider is currently writing about 70% of the new code
in each release.
See
[aider's release history](/HISTORY.html) for the latest statistics.
The
[aider git repo](https://github.com/Aider-AI/aider)

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