Compare commits

...

659 Commits

Author SHA1 Message Date
Paul Gauthier
97a3bfca4e set version to 0.77.2.dev 2025-03-17 18:07:22 -07:00
Paul Gauthier
cf58133e06 version bump to 0.77.1 2025-03-17 18:07:19 -07:00
Paul Gauthier
0d1811a4ae chore: Update exclude patterns in help_pats.py 2025-03-17 18:03:59 -07:00
Paul Gauthier
2a8bb715f0 copy 2025-03-17 17:29:54 -07:00
Paul Gauthier
cf93869d3f gemma3b 2025-03-17 16:39:45 -07:00
Paul Gauthier
77976a5253 copy 2025-03-17 10:24:07 -07:00
Paul Gauthier
5af46aaa2e bump deps 2025-03-17 10:23:21 -07:00
Paul Gauthier (aider)
4f4b10fd86 feat: Hide keyboard shortcuts on devices without physical keyboards 2025-03-14 19:43:16 -07:00
Paul Gauthier (aider)
26789115b6 fix: improve iOS audio playback with global audio element and better fallback 2025-03-14 19:40:27 -07:00
Paul Gauthier
87a28dcb9f copy 2025-03-14 19:17:51 -07:00
Paul Gauthier
1ad99f39e2 formatting 2025-03-14 19:14:22 -07:00
Paul Gauthier (aider)
dfbeec199e style: Properly indent HTML divs in recording.md 2025-03-14 19:13:32 -07:00
Paul Gauthier
41a99ec29d use better TTS 2025-03-14 19:10:35 -07:00
Paul Gauthier (aider)
7cee3aa1f1 fix: prevent duplicate speech synthesis fallback in recording.js 2025-03-14 19:07:53 -07:00
Paul Gauthier (aider)
b86d8099f1 fix: Remove unused import and convert f-strings without placeholders 2025-03-14 18:55:58 -07:00
Paul Gauthier (aider)
9c4a0043dd style: Format code to comply with linter rules 2025-03-14 18:55:36 -07:00
Paul Gauthier (aider)
5cde755976 feat: compress MP3 files using FFmpeg with configurable bitrate 2025-03-14 18:55:31 -07:00
Paul Gauthier (aider)
51aab7b656 feat: Print audio directory path on script launch 2025-03-14 18:53:31 -07:00
Paul Gauthier (aider)
791dc213fa style: Format code with linter 2025-03-14 18:52:47 -07:00
Paul Gauthier (aider)
8404165db3 feat: Add metadata tracking and TTS fallback improvements 2025-03-14 18:52:41 -07:00
Paul Gauthier (aider)
aee52c01a3 style: Remove trailing whitespace in recording_audio.py 2025-03-14 18:49:16 -07:00
Paul Gauthier (aider)
58e16b0c48 fix: Remove global VOICE usage and pass voice parameter directly 2025-03-14 18:49:12 -07:00
Paul Gauthier
3225ac88c0 chore: Make recording_audio.py executable 2025-03-14 18:49:10 -07:00
Paul Gauthier (aider)
38b8b85ec2 style: Format code with linter 2025-03-14 18:47:12 -07:00
Paul Gauthier (aider)
278f748c1c feat: Add OpenAI TTS audio generation and playback for recordings 2025-03-14 18:47:06 -07:00
Paul Gauthier
874df40303 feat: Add audio recording script 2025-03-14 18:47:04 -07:00
Paul Gauthier
0465d8ce80 chore: Simplify recording markdown files and update model settings 2025-03-14 18:37:13 -07:00
Paul Gauthier (aider)
e9b3f5fd43 refactor: Move recording code to shared include file 2025-03-14 18:34:19 -07:00
Paul Gauthier
c49bc2418b chore: Refactor recording script and comments into separate file 2025-03-14 18:34:17 -07:00
Paul Gauthier
fd21f5195d chore: Update polyglot leaderboard entry with new test results 2025-03-14 18:19:20 -07:00
Paul Gauthier
a1aa63fa06 copy 2025-03-14 15:15:34 -07:00
Paul Gauthier
b0a619c714 copy 2025-03-14 14:19:51 -07:00
Paul Gauthier
ec648f2c6f copy 2025-03-14 14:14:54 -07:00
Paul Gauthier
7ac7c72e03 refactor: Simplify terminal event processing in redact-cast.py 2025-03-14 13:34:21 -07:00
Paul Gauthier
f1d00dbd7f better 2025-03-14 11:59:25 -07:00
Paul Gauthier (aider)
f644aba7a8 docs: Suppress Jekyll TOC in recordings index 2025-03-14 11:53:40 -07:00
Paul Gauthier (aider)
ed75287c8c docs: Add detailed descriptions to screen recordings index 2025-03-14 11:53:06 -07:00
Paul Gauthier
a035c73c41 docs: Add screen recordings index page 2025-03-14 11:53:03 -07:00
Paul Gauthier
781a619262 moved 2025-03-14 11:43:52 -07:00
Paul Gauthier
e08b63cc9f initial 2025-03-14 11:42:05 -07:00
Paul Gauthier
97ed57a252 initial 2025-03-14 11:25:24 -07:00
Paul Gauthier
71f1779c8c refac 2025-03-14 11:18:19 -07:00
Paul Gauthier (aider)
116f44cade feat: Focus player on page load for immediate keyboard control 2025-03-14 10:05:14 -07:00
Paul Gauthier (aider)
2ebdd689ab chore: Replace double dashes with em dashes in keyboard shortcuts 2025-03-14 10:03:08 -07:00
Paul Gauthier
beecc1a718 docs: Update keyboard shortcuts formatting in tree-sitter-language-pack.md 2025-03-14 10:03:07 -07:00
Paul Gauthier
557ba2adc1 copy 2025-03-14 10:01:31 -07:00
Paul Gauthier (aider)
89780c1283 feat: Add keyboard shortcuts info below terminal with styling 2025-03-14 10:00:21 -07:00
Paul Gauthier
411e7f86c1 copy 2025-03-14 09:56:32 -07:00
Paul Gauthier
610fce67e1 copy 2025-03-14 09:49:26 -07:00
Paul Gauthier
d9350cd3ed Merge branch 'main' of github.com:Aider-AI/aider 2025-03-14 09:41:54 -07:00
Paul Gauthier
54d6643a1f copy 2025-03-14 09:41:37 -07:00
Paul Gauthier (aider)
f664420628 refactor: Update JavaScript to use "Commentary" instead of "Transcript" 2025-03-14 09:40:11 -07:00
Paul Gauthier (aider)
d4d4c6de68 style: Add margin-top to terminal-container class 2025-03-14 09:38:10 -07:00
Paul Gauthier
b4313599f8 rename 2025-03-14 09:37:27 -07:00
Paul Gauthier (aider)
6866f8f0a9 style: Add whitespace above terminal-container in HTML 2025-03-14 09:37:23 -07:00
Paul Gauthier
3cb478214b docs: Add tree-sitter-language-pack example transcript 2025-03-14 09:37:21 -07:00
Paul Gauthier
8d7b4d6446 copy 2025-03-14 09:35:29 -07:00
Paul Gauthier
cc6b0bcd72 copy 2025-03-14 09:33:05 -07:00
Paul Gauthier (aider)
831564cf48 fix: prevent auto-scroll when highlighting playback timestamps 2025-03-14 09:23:10 -07:00
Paul Gauthier
4e59b62026 docs: Update recording transcript with language pack integration details 2025-03-14 08:58:33 -07:00
Paul Gauthier (aider)
f345b9b0ff feat: Make entire transcript list items clickable 2025-03-14 08:56:30 -07:00
Paul Gauthier (aider)
d4fb88a8c4 feat: Highlight last-played marker in transcript 2025-03-14 08:55:15 -07:00
Paul Gauthier (aider)
2cb1b6be46 feat: Add toast and speech triggers on timestamp click 2025-03-14 08:54:08 -07:00
Paul Gauthier (aider)
feda315c2b feat: make transcript timestamps clickable to seek player 2025-03-14 08:53:07 -07:00
Paul Gauthier (aider)
41219a7d85 feat: Automatically parse transcript section to generate markers 2025-03-14 08:27:21 -07:00
Paul Gauthier
813a201b6a refactor: Move markers definition to recording.md and simplify recording.js 2025-03-14 08:27:20 -07:00
Paul Gauthier (aider)
1bc40d48fe refactor: Move CSS and JS to separate files and include them using Jekyll 2025-03-14 08:22:32 -07:00
Paul Gauthier
ddb4e51938 feat: Add recording.js and recording.css for website 2025-03-14 08:22:30 -07:00
Paul Gauthier (aider)
9ee67c343d fix: Show toast notifications in fullscreen mode 2025-03-14 08:13:11 -07:00
Paul Gauthier
bb816eae83 style: Adjust button min-width and update video markers in recording.md 2025-03-14 08:10:26 -07:00
Paul Gauthier (aider)
92bd446d09 style: Adjust toast notification size to fit marker text 2025-03-14 08:06:06 -07:00
Paul Gauthier
a7526fa9c4 docs: Update example recording marker text 2025-03-14 08:06:05 -07:00
Paul Gauthier (aider)
9b6ff487da fix: Prevent line breaks in toast notifications with CSS adjustments 2025-03-14 08:03:35 -07:00
Paul Gauthier (aider)
9d61490743 style: Make toast width adapt to text content 2025-03-14 07:52:24 -07:00
paul-gauthier
9cce6e41fa Merge pull request #3528 from bexelbie/patch-1 2025-03-14 06:49:10 -07:00
Brian Exelbierd
a56dbdf502 Update Benchmark README.md
Use a consistent clone url to help those who don't use ssh with GitHub.  This should not break for those who do.
2025-03-14 09:05:04 +01:00
Paul Gauthier (aider)
7d5f27fa34 style: Adjust toast notification width, padding, and font size 2025-03-13 19:42:51 -07:00
Paul Gauthier (aider)
a61ba0db22 feat: Replace transcript box with toast notifications for marker text 2025-03-13 19:42:19 -07:00
Paul Gauthier
7f02a889e2 style: Remove flexbox styling from recording.md layout 2025-03-13 19:42:17 -07:00
Paul Gauthier (aider)
88d388a574 refactor: Move page-container inline styles to CSS section 2025-03-13 19:39:59 -07:00
Paul Gauthier
4d5a659e1e style: Adjust container styles in recording.md 2025-03-13 19:39:55 -07:00
Paul Gauthier
ecfcf1071d style: Simplify page-container styling in recording.md 2025-03-13 19:30:14 -07:00
Paul Gauthier (aider)
ec385d45e9 style: Replace fixed max-width with aspect-ratio in page container 2025-03-13 19:29:08 -07:00
Paul Gauthier (aider)
985107bb4b style: Limit page-container width to 1200px and center it 2025-03-13 19:28:12 -07:00
Paul Gauthier
eb340c74ac style: Adjust max-height styling in recording example page 2025-03-13 19:28:09 -07:00
Paul Gauthier (aider)
9a16b33f00 feat: Add speech synthesis for marker labels in transcript 2025-03-13 19:14:54 -07:00
Paul Gauthier (aider)
0acebc5916 fix: resolve null reference in AsciinemaPlayer initialization 2025-03-13 18:05:14 -07:00
Paul Gauthier (aider)
8442d9fe5f feat: Add marker labels to transcript on separate lines 2025-03-13 18:04:16 -07:00
Paul Gauthier
5318dd1a80 feat: Add markers and event listener to recording example 2025-03-13 18:04:16 -07:00
Paul Gauthier
d916180ec8 refactor: Simplify transcript content in recording.md 2025-03-13 17:54:42 -07:00
Paul Gauthier (aider)
6e5aa08ee0 feat: Add transcript section below demo div in recording.md 2025-03-13 17:50:21 -07:00
Paul Gauthier
83e115cde5 docs: Add poster time to recording example 2025-03-13 17:50:19 -07:00
Paul Gauthier (aider)
a3a92cd5dd style: Reduce terminal header height and button sizes 2025-03-13 17:46:29 -07:00
Paul Gauthier
16fc10fb0f docs: Update terminal title in recording example 2025-03-13 17:46:27 -07:00
Paul Gauthier (aider)
6bba8b57d4 feat: Add macOS-style terminal header to demo div 2025-03-13 17:44:13 -07:00
Paul Gauthier (aider)
f45c75a137 style: Update demo div styling and background color 2025-03-13 17:42:39 -07:00
Paul Gauthier
3348df0652 style: Update terminal background color and theme in recording example 2025-03-13 17:42:37 -07:00
Paul Gauthier (aider)
3b6a01b63d fix: bind Jekyll to all interfaces in docker container 2025-03-13 17:39:51 -07:00
Paul Gauthier (aider)
a3554a95c5 perf: optimize Jekyll build with incremental and livereload options 2025-03-13 17:38:25 -07:00
Paul Gauthier (aider)
6fa9af20c0 style: Wrap CSS in <style> tags in recording.md 2025-03-13 17:37:31 -07:00
Paul Gauthier (aider)
e23437dfa4 style: Update terminal colors to match tmux window style 2025-03-13 17:37:06 -07:00
Paul Gauthier
dcf9eaad77 style: Add custom Asciinema player theme and set default theme 2025-03-13 17:37:05 -07:00
Paul Gauthier (aider)
768df05692 style: Limit asciinema player height to 80% of viewport 2025-03-13 17:30:07 -07:00
Paul Gauthier
e0d5d35e32 docs: Update recording example with new asciinema player config 2025-03-13 17:30:05 -07:00
Paul Gauthier
a718a05414 initial 2025-03-13 17:20:47 -07:00
Paul Gauthier
953391d9d0 refactor: Optimize terminal emulator initialization in redact-cast.py 2025-03-13 16:30:41 -07:00
Paul Gauthier (aider)
4ca229fd42 refactor: Use regex to check for ordered "Atuin" characters in line 2025-03-13 16:19:31 -07:00
Paul Gauthier
693a43efc8 refactor: Simplify JSON parsing logic in redact-cast.py 2025-03-13 16:19:29 -07:00
Paul Gauthier (aider)
f3d4c931f5 style: Remove trailing whitespace in redact-cast.py 2025-03-13 16:14:00 -07:00
Paul Gauthier (aider)
ece21315b1 perf: Skip JSON parsing when terminal checking isn't needed 2025-03-13 16:13:56 -07:00
Paul Gauthier
318cc57ffe refactor: Simplify terminal feed logic in redact-cast.py 2025-03-13 16:13:55 -07:00
Paul Gauthier (aider)
ba17924174 style: Remove trailing whitespace in redact-cast.py 2025-03-13 16:11:44 -07:00
Paul Gauthier (aider)
6bc9daa6ee perf: Optimize terminal emulation by checking for "Atuin" first 2025-03-13 16:11:41 -07:00
Paul Gauthier (aider)
2d8bc95bae style: Format code with consistent quotes and spacing 2025-03-13 16:08:57 -07:00
Paul Gauthier (aider)
520eb4a932 perf: Optimize asciinema cast processing with line-by-line streaming and early exit 2025-03-13 16:08:53 -07:00
Paul Gauthier
03733516cc refactor: Simplify "Atuin" visibility check in redact-cast.py 2025-03-13 16:08:52 -07:00
Paul Gauthier (aider)
e561130336 style: Remove trailing whitespace in redact-cast.py 2025-03-13 16:04:16 -07:00
Paul Gauthier (aider)
169fa2e7b7 feat: Print terminal dimensions after parsing header 2025-03-13 16:04:12 -07:00
Paul Gauthier (aider)
6d6db996fb style: Remove trailing whitespace in redact-cast.py 2025-03-13 16:03:30 -07:00
Paul Gauthier (aider)
f8642bfd94 perf: Stream filtered events directly to output file for memory efficiency 2025-03-13 16:03:27 -07:00
Paul Gauthier (aider)
dfdd6bf533 style: Remove trailing whitespace in redact-cast.py 2025-03-13 16:02:52 -07:00
Paul Gauthier (aider)
91cef71048 feat: set screen size from asciinema cast header 2025-03-13 16:02:48 -07:00
Paul Gauthier (aider)
3daf632384 feat: Add tqdm progress bar for event processing 2025-03-13 16:01:47 -07:00
Paul Gauthier (aider)
dba5fb9dfa style: Format code with consistent quotes and spacing 2025-03-13 16:00:40 -07:00
Paul Gauthier (aider)
70d10a0bb2 feat: Add script to filter asciinema cast files for "Atuin" visibility 2025-03-13 16:00:35 -07:00
Paul Gauthier
97291b806a refactor: Simplify redact-cast.py by removing custom logic and importing pyte 2025-03-13 16:00:34 -07:00
Paul Gauthier (aider)
c583f008e9 style: Make demo div full width in recording.md 2025-03-13 15:31:48 -07:00
Paul Gauthier
b182eba56f docs: Add recording example to website 2025-03-13 15:31:47 -07:00
Paul Gauthier
de5da0e7ce copy 2025-03-13 15:06:00 -07:00
Paul Gauthier
f2a893c0d4 set version to 0.77.1.dev 2025-03-13 14:44:50 -07:00
Paul Gauthier
371a03c794 version bump to 0.77.0 2025-03-13 14:44:47 -07:00
Paul Gauthier
88e3d48be5 copy 2025-03-13 14:24:19 -07:00
Paul Gauthier
e8a8681a75 chore: Update polyglot leaderboard YAML files with new test case data 2025-03-13 14:16:20 -07:00
Paul Gauthier
b541eec3b8 chore: Add new model settings to model-settings.yml 2025-03-13 14:08:36 -07:00
Paul Gauthier (aider)
ce3f732645 style: Format Model class constructor for readability 2025-03-13 14:00:27 -07:00
Paul Gauthier (aider)
1b3cae1ed5 feat: Add verbose flag to conditionally dump kwargs in Model.send 2025-03-13 14:00:20 -07:00
Paul Gauthier
024b9130a0 copy 2025-03-12 16:22:26 -07:00
Paul Gauthier
61a8b6020f copy 2025-03-12 16:07:38 -07:00
Paul Gauthier
d25877aace Merge branch 'tsl-pack-add' 2025-03-12 15:58:28 -07:00
Paul Gauthier
c3c2d4dc22 bump deps 2025-03-12 15:57:21 -07:00
Paul Gauthier
7454154599 copy 2025-03-12 15:56:33 -07:00
Paul Gauthier (aider)
04ecea614b refactor: Simplify _test_language_repo_map signature and use self.fixtures_dir 2025-03-12 15:38:07 -07:00
Paul Gauthier (aider)
084a14b640 style: Remove unnecessary blank lines in test_repomap.py 2025-03-12 15:36:18 -07:00
Paul Gauthier (aider)
a477759a49 refactor: Update fixtures_dir references to use self.fixtures_dir 2025-03-12 15:36:13 -07:00
Paul Gauthier
d4df207612 refactor: Move fixtures_dir initialization to setUp in TestRepoMapAllLanguages 2025-03-12 15:36:12 -07:00
Paul Gauthier (aider)
57d492d4b8 style: Remove trailing whitespace in test_repomap.py 2025-03-12 15:34:28 -07:00
Paul Gauthier (aider)
fb7413436c refactor: Split language tests into individual test methods 2025-03-12 15:34:24 -07:00
Paul Gauthier
2cc8105e68 refactor: Split language tests into individual cases in test_repomap.py 2025-03-12 15:34:22 -07:00
Paul Gauthier (aider)
a83d5ff123 style: Format test_repomap.py with linter 2025-03-12 15:32:20 -07:00
Paul Gauthier (aider)
a709d650df refactor: Extract language test loop into helper method 2025-03-12 15:32:16 -07:00
Paul Gauthier
570e8eae31 refactor: Extract loop logic into helper method in test_repomap.py 2025-03-12 15:32:15 -07:00
Paul Gauthier (aider)
22f1703bee test: Update udev fixture to match query patterns 2025-03-12 15:30:23 -07:00
Paul Gauthier (aider)
14037eaeb8 test: add udev test case to TestRepoMapAllLanguages 2025-03-12 15:22:56 -07:00
Paul Gauthier (aider)
189d64dc3d test: Add Swift test case to TestRepoMapAllLanguages 2025-03-12 15:22:16 -07:00
Paul Gauthier (aider)
315f8093c6 test: Add Solidity test case and fixture to TestRepoMapAllLanguages 2025-03-12 15:21:45 -07:00
Paul Gauthier (aider)
a776d70e0d test: add Racket test case and fixture 2025-03-12 15:18:47 -07:00
Paul Gauthier (aider)
1ab6c70ac7 feat: Add R language test case and fixture for repository mapping 2025-03-12 15:16:02 -07:00
Paul Gauthier (aider)
73eb8701dd feat: Add properties language test case and fixture file 2025-03-12 15:13:56 -07:00
Paul Gauthier (aider)
a503f291e7 feat: Add Pony language test case and fixture 2025-03-12 15:12:56 -07:00
Paul Gauthier (aider)
b54d800024 feat: Add Lua language support to TestRepoMapAllLanguages 2025-03-12 15:11:31 -07:00
Paul Gauthier (aider)
d74068464d feat: Add Gleam language support to TestRepoMapAllLanguages 2025-03-12 15:09:43 -07:00
Paul Gauthier (aider)
86a5e8dbe1 feat: Add Elm fixture with Person type and main function 2025-03-12 15:08:36 -07:00
Paul Gauthier (aider)
24d2b683c8 feat: Add Dart language support to TestRepoMapAllLanguages 2025-03-12 15:06:27 -07:00
Paul Gauthier (aider)
9451f0abe4 feat: Add D language test fixture and update test mapping 2025-03-12 15:05:05 -07:00
Paul Gauthier (aider)
544d58ddbd feat: Add CommonLisp language support to TestRepoMapAllLanguages 2025-03-12 15:02:55 -07:00
Paul Gauthier (aider)
7c1d2d75e0 feat: Add chatito language support with test fixture 2025-03-12 14:40:43 -07:00
Paul Gauthier (aider)
0b949f47d9 feat: Add C language test fixture for repository mapping 2025-03-12 14:39:59 -07:00
Paul Gauthier (aider)
393b45dd21 feat: Add Arduino fixture file for language recognition test 2025-03-12 14:38:43 -07:00
Paul Gauthier (aider)
6bb43555dc feat: Add Arduino language support to TestRepoMapAllLanguages 2025-03-12 14:37:55 -07:00
Paul Gauthier (aider)
ba03b07602 refactor: Update udev-tags.scm with more specific @name tags 2025-03-12 14:27:50 -07:00
Paul Gauthier (aider)
0ac4c0b97d refactor: Update swift-tags.scm to use more specific @name.definition tags 2025-03-12 14:27:29 -07:00
Paul Gauthier
41e93a4d94 initial 2025-03-12 14:27:11 -07:00
Paul Gauthier (aider)
a0b5b19d38 refactor: Update solidity-tags.scm with more specific @name tags 2025-03-12 14:27:04 -07:00
Paul Gauthier (aider)
65fad5ae30 refactor: Update Rust tags to use more specific @name.definition and @name.reference tags 2025-03-12 14:26:32 -07:00
Paul Gauthier (aider)
a689f2116c refactor: Update ruby-tags.scm to use more specific tag names 2025-03-12 14:25:57 -07:00
Paul Gauthier (aider)
68b5c90d95 refactor: Update Racket tags to use @name.definition and @name.reference formats 2025-03-12 14:25:30 -07:00
Paul Gauthier (aider)
44eb9af7bc refactor: Update r-tags.scm to use more specific name tags 2025-03-12 14:25:12 -07:00
Paul Gauthier (aider)
9e824e6070 refactor: Update python-tags.scm with more specific name tags 2025-03-12 14:24:53 -07:00
Paul Gauthier (aider)
ba6bb527a7 refactor: Update properties-tags.scm to use more specific name tags 2025-03-12 14:24:32 -07:00
Paul Gauthier (aider)
3525eeae54 refactor: Update Pony tags to use .reference and .definition prefixes 2025-03-12 14:24:14 -07:00
Paul Gauthier (aider)
e535e01e83 refactor: Update Lua tags to use more specific reference and definition tags 2025-03-12 14:23:45 -07:00
Paul Gauthier (aider)
3b1c81e50e refactor: Enhance Java tags with specific definition and reference annotations 2025-03-12 14:23:12 -07:00
Paul Gauthier (aider)
89406e5b7d refactor: Update go-tags.scm to use more specific @name tags 2025-03-12 14:22:49 -07:00
Paul Gauthier (aider)
d5cc855c0f refactor: Update gleam-tags.scm to use more specific @name tags 2025-03-12 14:22:16 -07:00
Paul Gauthier (aider)
2ed61eaf92 refactor: Update Elm tags to use .reference and .definition namespaces 2025-03-12 14:21:35 -07:00
Paul Gauthier (aider)
865f71e2cc refactor: Update elixir-tags.scm to use more specific @name.reference and @name.definition tags 2025-03-12 14:21:05 -07:00
Paul Gauthier (aider)
08a75808df refactor: Update elisp-tags.scm to use more specific name tags 2025-03-12 14:20:39 -07:00
Paul Gauthier (aider)
c9dd37db8e refactor: Update dart-tags.scm to use @name.reference and @name.definition tags 2025-03-12 14:20:23 -07:00
Paul Gauthier (aider)
7e86c8a90c refactor: Update d-tags.scm to use more specific @name.reference and @name.definition tags 2025-03-12 14:19:38 -07:00
Paul Gauthier (aider)
b87a5496e9 refactor: Update cpp-tags.scm to use more specific name tags 2025-03-12 14:19:06 -07:00
Paul Gauthier (aider)
9a88363437 refactor: Update CommonLisp tags to use more specific @name.* tags 2025-03-12 14:18:40 -07:00
Paul Gauthier (aider)
c0b9665cfc refactor: Update chatito-tags.scm with explicit definition and reference tags 2025-03-12 14:18:12 -07:00
Paul Gauthier (aider)
70284ce1c2 refactor: Update c-tags.scm to use more specific @name.definition tags 2025-03-12 14:17:54 -07:00
Paul Gauthier (aider)
48621dadaa refactor: Update Arduino tags to use more specific @name.reference and @name.definition tags 2025-03-12 14:17:35 -07:00
Paul Gauthier
e69bad57e4 initial 2025-03-12 14:14:13 -07:00
Paul Gauthier (aider)
f55099e969 feat: Update script to download Tree-Sitter language tags to specific directory 2025-03-12 14:10:14 -07:00
Paul Gauthier (aider)
76994facec style: Apply linter formatting to tsl_pack_langs.py script 2025-03-12 13:55:52 -07:00
Paul Gauthier (aider)
2d843f6e79 feat: Add skip mechanism for existing tags.scm files in language download script 2025-03-12 13:55:47 -07:00
Paul Gauthier (aider)
e15518dd29 style: Fix linter formatting in tsl_pack_langs.py 2025-03-12 13:55:23 -07:00
Paul Gauthier (aider)
011e0fd109 feat: Print GitHub URL when processing each language 2025-03-12 13:55:17 -07:00
Paul Gauthier (aider)
5f125c1812 style: Format Python script with linter 2025-03-12 13:54:36 -07:00
Paul Gauthier (aider)
a6ebed8d16 feat: Improve language tag download script with multi-branch support 2025-03-12 13:54:31 -07:00
Paul Gauthier
849e02cbfb chore: Make tsl_pack_langs.py script executable 2025-03-12 13:54:27 -07:00
Paul Gauthier (aider)
1ab5238405 refactor: Simplify tags URL construction and remove unused import 2025-03-12 13:52:55 -07:00
Paul Gauthier (aider)
ae6192111d style: Format Python script with linter 2025-03-12 13:52:44 -07:00
Paul Gauthier (aider)
59af4114dd feat: Add script to fetch tags.scm files from GitHub repositories 2025-03-12 13:52:39 -07:00
Paul Gauthier
4491b88763 feat: Add script for packing translation languages 2025-03-12 13:52:35 -07:00
Paul Gauthier
92377fc390 fix: Add missing MagicMock import in test_coder.py 2025-03-12 13:45:10 -07:00
Paul Gauthier (aider)
79b8e50412 fix: Mock InputOutput object correctly in test_architect_coder_auto_accept_true 2025-03-12 13:42:27 -07:00
Paul Gauthier (aider)
b5cd39cc50 fix: Add mock for confirm_ask method in test_architect_coder_auto_accept_true 2025-03-12 13:41:39 -07:00
Paul Gauthier (aider)
63c2a98f3c fix: Add missing summarizer mock to ArchitectCoder tests 2025-03-12 13:41:10 -07:00
Paul Gauthier (aider)
c168f78a13 fix: Initialize cur_messages and done_messages in ArchitectCoder test cases 2025-03-12 13:40:15 -07:00
Paul Gauthier (aider)
42d45b4037 fix: Remove unused import of ANY from unittest.mock 2025-03-12 13:39:42 -07:00
Paul Gauthier (aider)
c41df63629 style: Reorder imports and fix whitespace in test_coder.py 2025-03-12 13:38:48 -07:00
Paul Gauthier (aider)
330bb81206 test: Add tests for auto_accept_architect feature in ArchitectCoder 2025-03-12 13:38:41 -07:00
Paul Gauthier (aider)
d84c755ee8 style: Apply linter formatting to redact-cast.py script 2025-03-12 13:28:06 -07:00
Paul Gauthier (aider)
a24ff28031 refactor: Remove 'env' key from .cast file header 2025-03-12 13:28:01 -07:00
Paul Gauthier (aider)
3a837c472e style: Apply linter formatting to redact-cast.py script 2025-03-12 13:25:08 -07:00
Paul Gauthier (aider)
f4880e2ef3 feat: Add ANSI escape sequence stripping for Atuin version detection 2025-03-12 13:25:03 -07:00
Paul Gauthier
a2e4022e31 copy 2025-03-12 13:12:18 -07:00
Paul Gauthier (aider)
5668b41daa feat: Add auto-accept option for architect coder edits 2025-03-12 13:09:41 -07:00
Paul Gauthier (aider)
c052270048 feat: Add --auto-accept-architect option with default true 2025-03-12 13:08:59 -07:00
Paul Gauthier (aider)
70547171ca style: Fix linter formatting in io.py 2025-03-12 12:50:04 -07:00
Paul Gauthier (aider)
881868bf17 refactor: Require 3 characters for autocomplete, except for commands 2025-03-12 12:49:57 -07:00
Paul Gauthier (aider)
e90eb39a9b style: Add whitespace around arithmetic operator in redact-cast.py 2025-03-11 19:30:57 -07:00
Paul Gauthier
9513d307a1 refactor: Reorganize redact script and improve code formatting 2025-03-11 19:30:46 -07:00
Paul Gauthier
533e5ec03f Merge remote-tracking branch 'source-repo/main' into redact 2025-03-11 19:29:57 -07:00
Paul Gauthier (aider)
55f63395c7 fix: Remove unused mock variables and split long comment lines in test_commands.py 2025-03-11 19:25:46 -07:00
Paul Gauthier (aider)
4253d98a73 style: Remove trailing whitespaces in test_commands.py 2025-03-11 19:25:24 -07:00
Paul Gauthier (aider)
0c4af58866 test: Add tests for /reset preserving original read-only files 2025-03-11 19:25:17 -07:00
Paul Gauthier
a5919bd27d copy 2025-03-11 19:12:35 -07:00
Paul Gauthier
5e40974fdd fix: Ensure default model is set only if not already specified 2025-03-11 19:07:53 -07:00
Paul Gauthier (aider)
a27f4d0e04 feat: Add speed-up factor to recording timestamps in redact.py 2025-03-11 17:54:12 -07:00
Paul Gauthier (aider)
1bb3041298 feat: Compress long timestamp gaps to 0.5 seconds in asciinema cast processing 2025-03-11 17:44:20 -07:00
Paul Gauthier
dc6040adda copy 2025-03-11 17:39:08 -07:00
Paul Gauthier
864725ff3d feat: Add command aliases and preserve read-only files in /drop 2025-03-11 17:38:13 -07:00
Paul Gauthier (aider)
0fcbea03e5 style: Format code and remove trailing whitespaces 2025-03-11 17:35:28 -07:00
Paul Gauthier (aider)
2ce63e6ad3 test: Add tests for preserving original read-only files during drop command 2025-03-11 17:35:21 -07:00
Paul Gauthier (aider)
d45af94cee refactor: Simplify original read-only files check in _drop_all_files method 2025-03-11 17:33:57 -07:00
Paul Gauthier (aider)
1f874b654d style: Format code with linter and improve readability 2025-03-11 17:31:22 -07:00
Paul Gauthier (aider)
a7a21757bc feat: Preserve original read-only files when using bare /drop command 2025-03-11 17:31:14 -07:00
Paul Gauthier (aider)
1bed4e8972 feat: Add 0.5 second pause after skipped sections in redaction script 2025-03-11 17:05:54 -07:00
Paul Gauthier (aider)
efcda12dda refactor: Maintain consistent timestamps during section skipping 2025-03-11 17:04:47 -07:00
Paul Gauthier (aider)
d7b4079ab5 refactor: Update redact.py to handle asciinema cast v2 JSON format 2025-03-11 17:03:19 -07:00
Paul Gauthier
2eb1513612 initial 2025-03-11 17:01:26 -07:00
Paul Gauthier
87bcbe0420 copy 2025-03-11 13:00:33 -07:00
Paul Gauthier (aider)
26b0c6e6da style: Add mobile-friendly CSS to hide command and edit columns 2025-03-11 12:51:38 -07:00
Paul Gauthier
8cfbc9b827 Revert "refactor: Improve chart responsiveness with dynamic mobile height"
This reverts commit 46eee9e642.
2025-03-11 12:37:56 -07:00
Paul Gauthier (aider)
46eee9e642 refactor: Improve chart responsiveness with dynamic mobile height 2025-03-11 12:33:45 -07:00
Paul Gauthier
7d902d2f3e test: Update token budget parsing test cases 2025-03-11 12:24:42 -07:00
Paul Gauthier
3d05007024 fix: Correct token budget message formatting in test case 2025-03-11 12:20:47 -07:00
Paul Gauthier (aider)
a2bf2e2910 style: Format long line in test_commands.py for better readability 2025-03-11 12:18:18 -07:00
Paul Gauthier (aider)
9cf4286cee fix: Update test to handle lowercase token budget input 2025-03-11 12:18:10 -07:00
Paul Gauthier (aider)
c9ddca3a16 feat: Update tests for /think and /reason to handle no-argument case 2025-03-11 12:16:54 -07:00
Paul Gauthier
06370cb096 copy 2025-03-11 12:14:47 -07:00
Paul Gauthier (aider)
342586519d fix: Update method calls to use main_model for get_thinking_tokens and get_reasoning_effort 2025-03-11 12:13:52 -07:00
Paul Gauthier (aider)
89174bb524 style: Format code with linter and improve whitespace 2025-03-11 12:12:20 -07:00
Paul Gauthier (aider)
1fa3bc4018 feat: Add display of current values for /think and /reason commands when called without arguments 2025-03-11 12:12:12 -07:00
Paul Gauthier (aider)
d68e2b33fb style: Remove trailing whitespaces in commands.py 2025-03-11 12:11:15 -07:00
Paul Gauthier (aider)
1313cd8216 refactor: Update thinking tokens and reasoning effort display with helper methods 2025-03-11 12:11:08 -07:00
Paul Gauthier (aider)
7afc8c760c feat: Add /think and /reason command aliases for think-tokens and reasoning-effort 2025-03-11 12:10:19 -07:00
Paul Gauthier (aider)
79f714ab16 refactor: Extract thinking tokens and reasoning effort methods into separate functions 2025-03-11 12:09:41 -07:00
Paul Gauthier
e21bab2d17 copy 2025-03-11 11:52:02 -07:00
Paul Gauthier (aider)
4288cf2a39 style: Apply linter formatting to test_commands.py 2025-03-11 11:49:46 -07:00
Paul Gauthier (aider)
9d570a9cb1 feat: Update test values to use 1024 base for k and M suffixes 2025-03-11 11:49:39 -07:00
Paul Gauthier (aider)
333ddfb37a style: Format Python code with linter 2025-03-11 11:48:21 -07:00
Paul Gauthier (aider)
10a5250527 test: Add tests for /think-tokens and /reasoning-effort commands 2025-03-11 11:48:13 -07:00
Paul Gauthier (aider)
fd57eccdca style: Remove trailing whitespaces in commands.py 2025-03-11 11:45:30 -07:00
Paul Gauthier (aider)
1432be9be6 feat: Add announcements output for /think and /reason commands 2025-03-11 11:45:23 -07:00
Paul Gauthier (aider)
1773bbf759 style: Shorten docstring to fix line length flake8 error 2025-03-11 11:43:59 -07:00
Paul Gauthier (aider)
5c94624186 style: Format code with linter 2025-03-11 11:43:47 -07:00
Paul Gauthier (aider)
dc06c2fab3 refactor: Update reasoning effort command to accept string values 2025-03-11 11:43:40 -07:00
Paul Gauthier (aider)
f37799b39c style: Fix linter formatting in base_coder.py 2025-03-11 11:42:46 -07:00
Paul Gauthier (aider)
cc84f590fe feat: Add reasoning effort display in get_announcements output 2025-03-11 11:42:38 -07:00
Paul Gauthier
afcf3e77b5 refactor: Reorder model info output for better readability 2025-03-11 11:42:36 -07:00
Paul Gauthier (aider)
0406dda2a6 feat: Add /reasoning-effort command to set model reasoning effort level 2025-03-11 11:41:46 -07:00
Paul Gauthier (aider)
935227f7e7 refactor: Use 1024 instead of 1000 for token budget formatting 2025-03-11 11:38:11 -07:00
Paul Gauthier (aider)
67ebb2566d style: Use lowercase 'k' for token budget display 2025-03-11 11:37:30 -07:00
Paul Gauthier (aider)
1c736161c5 feat: Omit decimal point for whole number token budget values 2025-03-11 11:37:01 -07:00
Paul Gauthier (aider)
a348c2d013 feat: Change --thinking-tokens argument type to string 2025-03-11 11:36:17 -07:00
Paul Gauthier (aider)
444a95bc6c style: Add whitespace around arithmetic operators in budget formatting 2025-03-11 11:35:49 -07:00
Paul Gauthier (aider)
c38cdef220 style: Format code with linter and improve readability 2025-03-11 11:35:31 -07:00
Paul Gauthier (aider)
5608db0892 feat: Add thinking token budget display in model details 2025-03-11 11:35:23 -07:00
Paul Gauthier
98b3722a02 refactor: Simplify thinking token budget display logic 2025-03-11 11:33:45 -07:00
Paul Gauthier (aider)
2d623ff196 style: Apply linter formatting to commands.py 2025-03-11 11:32:39 -07:00
Paul Gauthier (aider)
703e124277 feat: Add /think-tokens command to set thinking token budget 2025-03-11 11:32:32 -07:00
Paul Gauthier (aider)
68c27f885f style: Fix linting issues in test_models.py 2025-03-11 11:30:28 -07:00
Paul Gauthier (aider)
58cd190ca9 test: Add comprehensive tests for token parsing and thinking tokens methods 2025-03-11 11:30:23 -07:00
Paul Gauthier (aider)
2c5c2b2f67 style: Format code with linter and fix whitespace 2025-03-11 11:29:44 -07:00
Paul Gauthier (aider)
e10fe50c6f feat: Add flexible token parsing for set_thinking_tokens method 2025-03-11 11:29:38 -07:00
Paul Gauthier
b8ad0b15e8 copy 2025-03-11 09:38:28 -07:00
Paul Gauthier (aider)
1b81fb0fdf refactor: Modify git push to stream output directly to terminal 2025-03-11 09:25:44 -07:00
Paul Gauthier
703cb8849d set version to 0.76.3.dev 2025-03-11 09:25:11 -07:00
Paul Gauthier
55f856b23c version bump to 0.76.2 2025-03-11 09:25:07 -07:00
Paul Gauthier (aider)
93c284a67d fix: Handle JSONDecodeError when loading model cache file 2025-03-11 08:33:18 -07:00
Paul Gauthier (aider)
38fd715247 style: Fix linter warnings in main.py 2025-03-11 08:27:23 -07:00
Paul Gauthier (aider)
987d024847 fix: Handle GitCommandError when retrieving git user config 2025-03-11 08:27:17 -07:00
Paul Gauthier
a3c0d628a1 fix: Remove unnecessary default flag in git config retrieval 2025-03-11 08:27:15 -07:00
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
214 changed files with 11719 additions and 2381 deletions

View File

@@ -1,5 +1,85 @@
# Release history
### main branch
- Bumped dependencies to pickup litellm fix for Ollama.
- Added support for `openrouter/google/gemma-3-27b-it` model.
- Aider wrote 96% of the code in this release.
### Aider v0.77.0
- Big upgrade in [programming languages supported](https://aider.chat/docs/languages.html) by adopting [tree-sitter-language-pack](https://github.com/Goldziher/tree-sitter-language-pack/).
- 130 new languages with linter support.
- 20 new languages with repo-map support.
- Added `/think-tokens` command to set thinking token budget with support for human-readable formats (8k, 10.5k, 0.5M).
- Added `/reasoning-effort` command to control model reasoning level.
- The `/think-tokens` and `/reasoning-effort` commands display current settings when called without arguments.
- Display of thinking token budget and reasoning effort in model information.
- Changed `--thinking-tokens` argument to accept string values with human-readable formats.
- Added `--auto-accept-architect` flag (default: true) to automatically accept changes from architect coder format without confirmation.
- Added support for `cohere_chat/command-a-03-2025` and `gemini/gemma-3-27b-it`
- The bare `/drop` command now preserves original read-only files provided via args.read.
- Fixed a bug where default model would be set by deprecated `--shortcut` switches even when already specified in the command line.
- Improved AutoCompleter to require 3 characters for autocompletion to reduce noise.
- Aider wrote 72% of the code in this release.
### Aider v0.76.2
- Fixed handling of JSONDecodeError when loading model cache file.
- Fixed handling of GitCommandError when retrieving git user configuration.
- Aider wrote 75% of the code in this release.
### 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.

View File

@@ -6,7 +6,7 @@
Aider lets you pair program with LLMs,
to edit code in your local git repository.
Start a new project or work with an existing code base.
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).
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">
@@ -54,14 +54,14 @@ 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.5 Sonnet via Anthropic's API
# 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.5-sonnet --api-key openrouter=your-key-goes-here
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
@@ -95,7 +95,7 @@ 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.5 Sonnet, DeepSeek V3, o1 & GPT-4o and can [connect to almost any LLM](https://aider.chat/docs/llms.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,6 @@
from packaging import version
__version__ = "0.74.4.dev"
__version__ = "0.77.2.dev"
safe_version = __version__
try:

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
@@ -38,98 +39,6 @@ def get_parser(default_config_files, git_root):
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"
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-chat"
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("API Keys and settings")
@@ -208,6 +117,11 @@ def get_parser(default_config_files, git_root):
type=str,
help="Set the reasoning_effort API parameter (default: not set)",
)
group.add_argument(
"--thinking-tokens",
type=str,
help="Set the thinking token budget for models that support it (default: not set)",
)
group.add_argument(
"--verify-ssl",
action=argparse.BooleanOptionalAction,
@@ -234,6 +148,12 @@ def get_parser(default_config_files, git_root):
const="architect",
help="Use architect edit format for the main chat",
)
group.add_argument(
"--auto-accept-architect",
action=argparse.BooleanOptionalAction,
default=True,
help="Enable/disable automatic acceptance of architect changes (default: True)",
)
group.add_argument(
"--weak-model",
metavar="WEAK_MODEL",
@@ -813,6 +733,24 @@ def get_parser(default_config_files, git_root):
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,
@@ -823,12 +761,11 @@ def get_parser(default_config_files, git_root):
"--editor",
help="Specify which editor to use for the /editor command",
)
group.add_argument(
"--install-tree-sitter-language-pack",
action="store_true",
help="Install the tree_sitter_language_pack (experimental)",
default=False,
)
##########
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

@@ -6,6 +6,7 @@ from .base_coder import Coder
class ArchitectCoder(AskCoder):
edit_format = "architect"
gpt_prompts = ArchitectPrompts()
auto_accept_architect = False
def reply_completed(self):
content = self.partial_response_content
@@ -13,7 +14,7 @@ class ArchitectCoder(AskCoder):
if not content or not content.strip():
return
if not self.io.confirm_ask("Edit the files?"):
if not self.auto_accept_architect and not self.io.confirm_ask("Edit the files?"):
return
kwargs = dict()

View File

@@ -28,6 +28,12 @@ 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
@@ -201,10 +207,22 @@ class Coder:
prefix = "Model"
output = f"{prefix}: {main_model.name} with {self.edit_format} edit format"
# Check for thinking token budget
thinking_tokens = main_model.get_thinking_tokens(main_model)
if thinking_tokens:
output += f", {thinking_tokens} think tokens"
# Check for reasoning effort
reasoning_effort = main_model.get_reasoning_effort(main_model)
if reasoning_effort:
output += f", reasoning {reasoning_effort}"
if self.add_cache_headers or main_model.caches_by_default:
output += ", prompt cache"
if main_model.info.get("supports_assistant_prefill"):
output += ", infinite output"
lines.append(output)
if self.edit_format == "architect":
@@ -304,6 +322,7 @@ class Coder:
ignore_mentions=None,
file_watcher=None,
auto_copy_context=False,
auto_accept_architect=True,
):
# Fill in a dummy Analytics if needed, but it is never .enable()'d
self.analytics = analytics if analytics is not None else Analytics()
@@ -316,6 +335,7 @@ class Coder:
self.abs_root_path_cache = {}
self.auto_copy_context = auto_copy_context
self.auto_accept_architect = auto_accept_architect
self.ignore_mentions = ignore_mentions
if not self.ignore_mentions:
@@ -375,6 +395,10 @@ 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
@@ -1280,6 +1304,9 @@ class Coder:
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),
]
@@ -1369,11 +1396,14 @@ class Coder:
self.mdstream = None
self.partial_response_content = self.get_multi_response_content_in_progress(True)
self.partial_response_content = self.main_model.remove_reasoning_content(
self.partial_response_content
)
self.remove_reasoning_content()
self.multi_response_content = ""
###
# print()
# print("=" * 20)
# dump(self.partial_response_content)
self.io.tool_output()
self.show_usage_report()
@@ -1623,6 +1653,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
@@ -1690,6 +1723,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:
@@ -1708,6 +1749,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 (
@@ -1717,6 +1767,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
@@ -1735,19 +1787,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:
@@ -1759,13 +1838,26 @@ 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_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
completion_tokens = 0

View File

@@ -59,6 +59,7 @@ class Commands:
parser=None,
verbose=False,
editor=None,
original_read_only_fnames=None,
):
self.io = io
self.coder = coder
@@ -77,6 +78,9 @@ class Commands:
self.help = None
self.editor = editor
# Store the original read-only filenames provided via args.read
self.original_read_only_fnames = set(original_read_only_fnames or [])
def cmd_model(self, args):
"Switch to a new LLM"
@@ -355,7 +359,21 @@ class Commands:
def _drop_all_files(self):
self.coder.abs_fnames = set()
self.coder.abs_read_only_fnames = set()
# When dropping all files, keep those that were originally provided via args.read
if self.original_read_only_fnames:
# Keep only the original read-only files
to_keep = set()
for abs_fname in self.coder.abs_read_only_fnames:
rel_fname = self.coder.get_rel_fname(abs_fname)
if (
abs_fname in self.original_read_only_fnames
or rel_fname in self.original_read_only_fnames
):
to_keep.add(abs_fname)
self.coder.abs_read_only_fnames = to_keep
else:
self.coder.abs_read_only_fnames = set()
def _clear_chat_history(self):
self.coder.done_messages = []
@@ -822,7 +840,12 @@ class Commands:
"Remove files from the chat session to free up context space"
if not args.strip():
self.io.tool_output("Dropping all files from the chat session.")
if self.original_read_only_fnames:
self.io.tool_output(
"Dropping all files from the chat session except originally read-only files."
)
else:
self.io.tool_output("Dropping all files from the chat session.")
self._drop_all_files()
return
@@ -1411,6 +1434,58 @@ class Commands:
if user_input.strip():
self.io.set_placeholder(user_input.rstrip())
def cmd_think_tokens(self, args):
"Set the thinking token budget (supports formats like 8096, 8k, 10.5k, 0.5M)"
model = self.coder.main_model
if not args.strip():
# Display current value if no args are provided
formatted_budget = model.get_thinking_tokens(model)
if formatted_budget is None:
self.io.tool_output("Thinking tokens are not currently set.")
else:
budget = model.extra_params["thinking"].get("budget_tokens")
self.io.tool_output(
f"Current thinking token budget: {budget:,} tokens ({formatted_budget})."
)
return
value = args.strip()
model.set_thinking_tokens(value)
formatted_budget = model.get_thinking_tokens(model)
budget = model.extra_params["thinking"].get("budget_tokens")
self.io.tool_output(f"Set thinking token budget to {budget:,} tokens ({formatted_budget}).")
self.io.tool_output()
# Output announcements
announcements = "\n".join(self.coder.get_announcements())
self.io.tool_output(announcements)
def cmd_reasoning_effort(self, args):
"Set the reasoning effort level (values: number or low/medium/high depending on model)"
model = self.coder.main_model
if not args.strip():
# Display current value if no args are provided
reasoning_value = model.get_reasoning_effort(model)
if reasoning_value is None:
self.io.tool_output("Reasoning effort is not currently set.")
else:
self.io.tool_output(f"Current reasoning effort: {reasoning_value}")
return
value = args.strip()
model.set_reasoning_effort(value)
reasoning_value = model.get_reasoning_effort(model)
self.io.tool_output(f"Set reasoning effort to {reasoning_value}")
self.io.tool_output()
# Output announcements
announcements = "\n".join(self.coder.get_announcements())
self.io.tool_output(announcements)
def cmd_copy_context(self, args=None):
"""Copy the current chat context as markdown, suitable to paste into a web UI"""

126
aider/deprecated.py Normal file
View File

@@ -0,0 +1,126 @@
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
if not args.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, shell=True)
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

@@ -10,4 +10,10 @@ exclude_website_pats = [
"docs/unified-diffs.md",
"docs/leaderboards/index.md",
"assets/**",
".jekyll-metadata",
"Gemfile.lock",
"Gemfile",
"_config.yml",
"**/OLD/**",
"OLD/**",
]

View File

@@ -1,7 +1,9 @@
import base64
import functools
import os
import shutil
import signal
import subprocess
import time
import webbrowser
from collections import defaultdict
@@ -34,6 +36,20 @@ 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"""
@@ -178,6 +194,11 @@ class AutoCompleter(Completer):
candidates = [word if type(word) is tuple else (word, word) for word in candidates]
last_word = words[-1]
# Only provide completions if the user has typed at least 3 characters
if len(last_word) < 3:
return
completions = []
for word_match, word_insert in candidates:
if word_match.lower().startswith(last_word.lower()):
@@ -196,6 +217,8 @@ class InputOutput:
num_error_outputs = 0
num_user_asks = 0
clipboard_watcher = None
bell_on_next_input = False
notifications_command = None
def __init__(
self,
@@ -224,25 +247,40 @@ class InputOutput:
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
@@ -444,6 +482,9 @@ class InputOutput:
):
self.rule()
# Ring the bell if needed
self.ring_bell()
rel_fnames = list(rel_fnames)
show = ""
if rel_fnames:
@@ -696,6 +737,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:
@@ -750,14 +794,19 @@ 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,
complete_while_typing=False,
)
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 = default
@@ -801,6 +850,9 @@ class InputOutput:
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)
@@ -812,15 +864,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,
complete_while_typing=True,
)
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)
@@ -882,6 +938,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
@@ -893,7 +953,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)
@@ -904,6 +964,61 @@ 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

View File

@@ -1,4 +1,3 @@
import configparser
import json
import os
import re
@@ -25,6 +24,7 @@ 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
@@ -126,17 +126,15 @@ 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
try:
user_name = repo.git.config("--get", "user.name") or None
except git.exc.GitCommandError:
user_name = None
try:
user_email = repo.git.config("--get", "user.email") or None
except git.exc.GitCommandError:
user_email = None
if user_name and user_email:
return repo.working_tree_dir
@@ -214,18 +212,6 @@ def check_streamlit_install(io):
)
def install_tree_sitter_language_pack(io):
return utils.check_pip_install_extra(
io,
"tree_sitter_language_pack",
"Install tree_sitter_language_pack?",
[
"tree-sitter-language-pack==0.4.0",
"tree-sitter==0.24.0",
],
)
def write_streamlit_credentials():
from streamlit.file_util import get_streamlit_file_path
@@ -519,6 +505,8 @@ 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
@@ -567,6 +555,8 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
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)
@@ -606,6 +596,9 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
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:
@@ -718,11 +711,6 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
analytics.event("exit", reason="Upgrade completed")
return 0 if success else 1
if args.install_tree_sitter_language_pack:
success = install_tree_sitter_language_pack(io)
analytics.event("exit", reason="Install TSLP completed")
return 0 if success else 1
if args.check_update:
check_version(io, verbose=args.verbose)
@@ -768,7 +756,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
model_key_pairs = [
("ANTHROPIC_API_KEY", "sonnet"),
("DEEPSEEK_API_KEY", "deepseek"),
("OPENROUTER_API_KEY", "openrouter/anthropic/claude-3.5-sonnet"),
("OPENROUTER_API_KEY", "openrouter/anthropic/claude-3.7-sonnet"),
("OPENAI_API_KEY", "gpt-4o"),
("GEMINI_API_KEY", "flash"),
]
@@ -790,15 +778,22 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
weak_model=args.weak_model,
editor_model=args.editor_model,
editor_edit_format=args.editor_edit_format,
verbose=args.verbose,
)
# add --reasoning-effort cli param
# 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:
if not getattr(main_model, "extra_params", None):
main_model.extra_params = {}
if "extra_body" not in main_model.extra_params:
main_model.extra_params["extra_body"] = {}
main_model.extra_params["extra_body"]["reasoning_effort"] = args.reasoning_effort
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"):
@@ -872,6 +867,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
parser=parser,
verbose=args.verbose,
editor=args.editor,
original_read_only_fnames=read_only_fnames,
)
summarizer = ChatSummary(
@@ -926,6 +922,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
chat_language=args.chat_language,
detect_urls=args.detect_urls,
auto_copy_context=args.copy_paste,
auto_accept_architect=args.auto_accept_architect,
)
except UnknownEditFormat as err:
io.tool_error(str(err))

View File

@@ -5,7 +5,6 @@ import json
import math
import os
import platform
import re
import sys
import time
from dataclasses import dataclass, fields
@@ -19,6 +18,7 @@ from PIL import Image
from aider.dump import dump # noqa: F401
from aider.llm import litellm
from aider.sendchat import ensure_alternating_roles, sanity_check_messages
from aider.utils import check_pip_install_extra
RETRY_TIMEOUT = 60
@@ -76,7 +76,7 @@ ANTHROPIC_MODELS = [ln.strip() for ln in ANTHROPIC_MODELS.splitlines() if ln.str
# Mapping of model aliases to their canonical names
MODEL_ALIASES = {
# Claude models
"sonnet": "claude-3-5-sonnet-20241022",
"sonnet": "anthropic/claude-3-7-sonnet-20250219",
"haiku": "claude-3-5-haiku-20241022",
"opus": "claude-3-opus-20240229",
# GPT models
@@ -113,7 +113,8 @@ class ModelSettings:
streaming: bool = True
editor_model_name: Optional[str] = None
editor_edit_format: Optional[str] = None
remove_reasoning: Optional[str] = None
reasoning_tag: Optional[str] = None
remove_reasoning: Optional[str] = None # Deprecated alias for reasoning_tag
system_prompt_prefix: Optional[str] = None
@@ -137,23 +138,37 @@ class ModelInfoManager:
self.cache_file = self.cache_dir / "model_prices_and_context_window.json"
self.content = None
self.local_model_metadata = {}
self._load_cache()
self.verify_ssl = True
self._cache_loaded = False
def set_verify_ssl(self, verify_ssl):
self.verify_ssl = verify_ssl
def _load_cache(self):
if self._cache_loaded:
return
try:
self.cache_dir.mkdir(parents=True, exist_ok=True)
if self.cache_file.exists():
cache_age = time.time() - self.cache_file.stat().st_mtime
if cache_age < self.CACHE_TTL:
self.content = json.loads(self.cache_file.read_text())
try:
self.content = json.loads(self.cache_file.read_text())
except json.JSONDecodeError:
# If the cache file is corrupted, treat it as missing
self.content = None
except OSError:
pass
self._cache_loaded = True
def _update_cache(self):
try:
import requests
response = requests.get(self.MODEL_INFO_URL, timeout=5)
# Respect the --no-verify-ssl switch
response = requests.get(self.MODEL_INFO_URL, timeout=5, verify=self.verify_ssl)
if response.status_code == 200:
self.content = response.json()
try:
@@ -173,6 +188,9 @@ class ModelInfoManager:
if data:
return data
# Ensure cache is loaded before checking content
self._load_cache()
if not self.content:
self._update_cache()
@@ -212,11 +230,14 @@ model_info_manager = ModelInfoManager()
class Model(ModelSettings):
def __init__(self, model, weak_model=None, editor_model=None, editor_edit_format=None):
def __init__(
self, model, weak_model=None, editor_model=None, editor_edit_format=None, verbose=False
):
# Map any alias to its canonical name
model = MODEL_ALIASES.get(model, model)
self.name = model
self.verbose = verbose
self.max_chat_history_tokens = 1024
self.weak_model = None
@@ -259,6 +280,11 @@ class Model(ModelSettings):
val = getattr(source, field.name)
setattr(self, field.name, val)
# Handle backward compatibility: if remove_reasoning is set but reasoning_tag isn't,
# use remove_reasoning's value for reasoning_tag
if self.reasoning_tag is None and self.remove_reasoning is not None:
self.reasoning_tag = self.remove_reasoning
def configure_model_settings(self, model):
# Look for exact model match
exact_match = False
@@ -331,7 +357,8 @@ class Model(ModelSettings):
self.use_repo_map = True
self.examples_as_sys_msg = True
self.use_temperature = False
self.remove_reasoning = "think"
self.reasoning_tag = "think"
self.reasoning_tag = "think"
return # <--
if ("llama3" in model or "llama-3" in model) and "70b" in model:
@@ -380,6 +407,16 @@ class Model(ModelSettings):
self.use_repo_map = True
return # <--
if "qwq" in model and "32b" in model and "preview" not in model:
self.edit_format = "diff"
self.editor_edit_format = "editor-diff"
self.use_repo_map = True
self.reasoning_tag = "think"
self.examples_as_sys_msg = True
self.use_temperature = 0.6
self.extra_params = dict(top_p=0.95)
return # <--
# use the defaults
if self.edit_format == "diff":
self.use_repo_map = True
@@ -559,6 +596,91 @@ class Model(ModelSettings):
map_tokens = max(map_tokens, 1024)
return map_tokens
def set_reasoning_effort(self, effort):
"""Set the reasoning effort parameter for models that support it"""
if effort is not None:
if not self.extra_params:
self.extra_params = {}
if "extra_body" not in self.extra_params:
self.extra_params["extra_body"] = {}
self.extra_params["extra_body"]["reasoning_effort"] = effort
def parse_token_value(self, value):
"""
Parse a token value string into an integer.
Accepts formats: 8096, "8k", "10.5k", "0.5M", "10K", etc.
Args:
value: String or int token value
Returns:
Integer token value
"""
if isinstance(value, int):
return value
if not isinstance(value, str):
return int(value) # Try to convert to int
value = value.strip().upper()
if value.endswith("K"):
multiplier = 1024
value = value[:-1]
elif value.endswith("M"):
multiplier = 1024 * 1024
value = value[:-1]
else:
multiplier = 1
# Convert to float first to handle decimal values like "10.5k"
return int(float(value) * multiplier)
def set_thinking_tokens(self, value):
"""
Set the thinking token budget for models that support it.
Accepts formats: 8096, "8k", "10.5k", "0.5M", "10K", etc.
"""
if value is not None:
num_tokens = self.parse_token_value(value)
self.use_temperature = False
if not self.extra_params:
self.extra_params = {}
self.extra_params["thinking"] = {"type": "enabled", "budget_tokens": num_tokens}
def get_thinking_tokens(self, model):
"""Get formatted thinking token budget if available"""
if (
model.extra_params
and "thinking" in model.extra_params
and "budget_tokens" in model.extra_params["thinking"]
):
budget = model.extra_params["thinking"]["budget_tokens"]
# Format as xx.yK for thousands, xx.yM for millions
if budget >= 1024 * 1024:
value = budget / (1024 * 1024)
if value == int(value):
return f"{int(value)}M"
else:
return f"{value:.1f}M"
else:
value = budget / 1024
if value == int(value):
return f"{int(value)}k"
else:
return f"{value:.1f}k"
return None
def get_reasoning_effort(self, model):
"""Get reasoning effort value if available"""
if (
model.extra_params
and "extra_body" in model.extra_params
and "reasoning_effort" in model.extra_params["extra_body"]
):
return model.extra_params["extra_body"]["reasoning_effort"]
return None
def is_deepseek_r1(self):
name = self.name.lower()
if "deepseek" not in name:
@@ -606,17 +728,11 @@ class Model(ModelSettings):
hash_object = hashlib.sha1(key)
if "timeout" not in kwargs:
kwargs["timeout"] = request_timeout
if self.verbose:
dump(kwargs)
res = litellm.completion(**kwargs)
return hash_object, res
def remove_reasoning_content(self, res):
if not self.remove_reasoning:
return res
pattern = f"<{self.remove_reasoning}>.*?</{self.remove_reasoning}>"
res = re.sub(pattern, "", res, flags=re.DOTALL).strip()
return res
def simple_send_with_retries(self, messages):
from aider.exceptions import LiteLLMExceptions
@@ -637,7 +753,9 @@ class Model(ModelSettings):
if not response or not hasattr(response, "choices") or not response.choices:
return None
res = response.choices[0].message.content
return self.remove_reasoning_content(res)
from aider.reasoning_tags import remove_reasoning_content
return remove_reasoning_content(res, self.reasoning_tag)
except litellm_ex.exceptions_tuple() as err:
ex_info = litellm_ex.get_ex_info(err)
@@ -760,6 +878,9 @@ def sanity_check_model(io, model):
show = True
io.tool_warning(f"Warning for {model}: Unknown which environment variables are required.")
# Check for model-specific dependencies
check_for_dependencies(io, model.name)
if not model.info:
show = True
io.tool_warning(
@@ -775,6 +896,30 @@ def sanity_check_model(io, model):
return show
def check_for_dependencies(io, model_name):
"""
Check for model-specific dependencies and install them if needed.
Args:
io: The IO object for user interaction
model_name: The name of the model to check dependencies for
"""
# Check if this is a Bedrock model and ensure boto3 is installed
if model_name.startswith("bedrock/"):
check_pip_install_extra(
io, "boto3", "AWS Bedrock models require the boto3 package.", ["boto3"]
)
# Check if this is a Vertex AI model and ensure google-cloud-aiplatform is installed
elif model_name.startswith("vertex_ai/"):
check_pip_install_extra(
io,
"google.cloud.aiplatform",
"Google Vertex AI models require the google-cloud-aiplatform package.",
["google-cloud-aiplatform"],
)
def fuzzy_match_models(name):
name = name.lower()

View File

@@ -0,0 +1,7 @@
These scm files are all adapted from the github repositories listed here:
https://github.com/Goldziher/tree-sitter-language-pack/blob/main/sources/language_definitions.json
See this URL for information on the licenses of each repo:
https://github.com/Goldziher/tree-sitter-language-pack/

View File

@@ -0,0 +1,5 @@
(function_declarator
declarator: (identifier) @name.definition.function) @definition.function
(call_expression
function: (identifier) @name.reference.call) @reference.call

View File

@@ -0,0 +1,9 @@
(struct_specifier name: (type_identifier) @name.definition.class body:(_)) @definition.class
(declaration type: (union_specifier name: (type_identifier) @name.definition.class)) @definition.class
(function_declarator declarator: (identifier) @name.definition.function) @definition.function
(type_definition declarator: (type_identifier) @name.definition.type) @definition.type
(enum_specifier name: (type_identifier) @name.definition.type) @definition.type

View File

@@ -0,0 +1,16 @@
; Definitions
(intent_def
(intent) @name.definition.intent) @definition.intent
(slot_def
(slot) @name.definition.slot) @definition.slot
(alias_def
(alias) @name.definition.alias) @definition.alias
; References
(slot_ref
(slot) @name.reference.slot) @reference.slot
(alias_ref
(alias) @name.reference.alias) @reference.alias

View File

@@ -0,0 +1,122 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function Definitions ;;;;;;;;;;;;;;;;;;;;;;;
(defun_header
function_name: (sym_lit) @name.definition.function) @definition.function
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function Calls ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Basically, we consider every list literal with symbol as the
;;; first element to be a call to a function named by that element.
;;; But we must exclude some cases. Note, tree-sitter @ignore
;;; cases only work if they are declared before the cases
;;; we want to include.
;; Exclude lambda lists for function definitions
;; For example:
;;
;; (defun my-func (arg1 arg2) ...)
;;
;; do not treat (arg1 arg2) as a call of function arg1
;;
(defun_header
lambda_list: (list_lit . [(sym_lit) (package_lit)] @ignore))
;; Similar to the above, but for
;;
;; (defmethod m ((type1 param1) (type2 param2)) ...)
;;
;; where list literals having symbol as their first element
;; are nested inside the lambda list.
(defun_header
lambda_list: (list_lit (list_lit . [(sym_lit) (package_lit)] @ignore)))
;;
;; (let ((var ...) (var2 ...)) ...)
;;
;; - exclude var, var2
;; - the same for let*, flet, labels, macrolet, symbol-macrolet
(list_lit . [(sym_lit) (package_lit)] @name.reference.call
. (list_lit (list_lit . [(sym_lit) (package_lit)] @ignore))
(#match? @name.reference.call
"(?i)^(cl:)?(let|let\\*|flet|labels|macrolet|symbol-macrolet)$")
)
;; TODO:
;; - exclude also:
;; - (defclass name (parent parent2)
;; ((slot1 ...)
;; (slot2 ...))
;; exclude the parent, slot1, slot2
;; - (flet ((func-1 (param1 param2))) ...)
;; - we already exclude func-1, but param1 is still recognized
;; as a function call - exclude it too
;; - the same for labels
;; - the same macrolet
;; - what else?
;; (that's a non-goal to completely support all macros
;; and special operators, but every one we support
;; makes the solution a little bit better)
;; - (flet ((func-1 (param1 param2))) ...)
;; - instead of simply excluding it, as we do today,
;; tag func-1 as @local.definition.function (I suppose)
;; - the same for labels, macrolet
;; - @local.scope for let, let*, flet, labels, macrolet
;; - I guess the whole span of the scope text,
;; till the closing paren, should be tagged as @local.scope;
;; Hopefully, combined with @local.definition.function
;; within the scope, the usual @reference.call within
;; that scope will refer to the local definition,
;; and there will be no need to use @local.reference.call
;; (which is more difficult to implement).
;; - When implementing, remember the scope rules differences
;; of let vs let*, flet vs labels.
;; Include all other cases - list literal with symbol as the
;; first element
(list_lit . [(sym_lit) (package_lit)] @name.reference.call) @reference.call
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; classes
(list_lit . [(sym_lit) (package_lit)] @ignore
. [(sym_lit) (package_lit)] @name.definition.class
(#match? @ignore "(?i)^(cl:)?defclass$")
) @definition.class
(list_lit . [(sym_lit) (package_lit)] @ignore
. (quoting_lit [(sym_lit) (package_lit)] @name.reference.class)
(#match? @ignore "(?i)^(cl:)?make-instance$")
) @reference.class
;;; TODO:
;; - @reference.class for base classes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; TODO:
;; - Symbols referenced in defpackage
;;
;; (defpackage ...
;; (:export (symbol-a :symbol-b #:symbol-c "SYMBOL-D")))
;;
;; The goal is to allow quick navigation from the API
;; overview in the form of defpackage, to the definition
;; where user can read parameters, docstring, etc.
;; - The @name must not include the colon, or sharpsign colon, quotes,
;; just symbol-a, symbol-b, symbol-c, sybmol-d
;; - Downcase the names specified as string literals?
;; ("SYMBOL-D" -> symbol-d)
;; - We don't know if the exported symbol is a function, variable,
;; class or something else. The official doc
;; (https://tree-sitter.github.io/tree-sitter/code-navigation-systems)
;; does not even suggest a tag for variable reference.
;; (Although in practice, the `tree-sitter tags` command
;; allows any @reference.* and @definition.* tags)
;; Probably it's better to just use @reference.call for all
;; the symbols in the :export clause.
;;
;; - The same for the export function call:
;;
;; (export '(symbol-a :symbol-b #:symbol-c "SYMBOL-D"))

View File

@@ -0,0 +1,15 @@
(struct_specifier name: (type_identifier) @name.definition.class body:(_)) @definition.class
(declaration type: (union_specifier name: (type_identifier) @name.definition.class)) @definition.class
(function_declarator declarator: (identifier) @name.definition.function) @definition.function
(function_declarator declarator: (field_identifier) @name.definition.function) @definition.function
(function_declarator declarator: (qualified_identifier scope: (namespace_identifier) @local.scope name: (identifier) @name.definition.method)) @definition.method
(type_definition declarator: (type_identifier) @name.definition.type) @definition.type
(enum_specifier name: (type_identifier) @name.definition.type) @definition.type
(class_specifier name: (type_identifier) @name.definition.class) @definition.class

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,26 @@
(module_def (module_declaration (module_fqn) @name.definition.module)) @definition.module
(struct_declaration (struct) . (identifier) @name.definition.class) @definition.class
(interface_declaration (interface) . (identifier) @name.definition.interface) @definition.interface
(enum_declaration (enum) . (identifier) @name.definition.type) @definition.type
(class_declaration (class) . (identifier) @name.definition.class) @definition.class
(constructor (this) @name.definition.method) @definition.method
(destructor (this) @name.definition.method) @definition.method
(postblit (this) @name.definition.method) @definition.method
(manifest_declarator . (identifier) @name.definition.type) @definition.type
(function_declaration (identifier) @name.definition.function) @definition.function
(union_declaration (union) . (identifier) @name.definition.type) @definition.type
(anonymous_enum_declaration (enum_member . (identifier) @name.definition.constant)) @definition.constant
(enum_declaration (enum_member . (identifier) @name.definition.constant)) @definition.constant
(call_expression (identifier) @name.reference.call) @reference.call
(call_expression (type (template_instance (identifier) @name.reference.call))) @reference.call
(parameter (type (identifier) @name.reference.class) @reference.class (identifier))
(variable_declaration (type (identifier) @name.reference.class) @reference.class (declarator))

View File

@@ -0,0 +1,92 @@
(class_definition
name: (identifier) @name.definition.class) @definition.class
(method_signature
(function_signature)) @definition.method
(type_alias
(type_identifier) @name.definition.type) @definition.type
(method_signature
(getter_signature
name: (identifier) @name.definition.method)) @definition.method
(method_signature
(setter_signature
name: (identifier) @name.definition.method)) @definition.method
(method_signature
(function_signature
name: (identifier) @name.definition.method)) @definition.method
(method_signature
(factory_constructor_signature
(identifier) @name.definition.method)) @definition.method
(method_signature
(constructor_signature
name: (identifier) @name.definition.method)) @definition.method
(method_signature
(operator_signature)) @definition.method
(method_signature) @definition.method
(mixin_declaration
(mixin)
(identifier) @name.definition.mixin) @definition.mixin
(extension_declaration
name: (identifier) @name.definition.extension) @definition.extension
(new_expression
(type_identifier) @name.reference.class) @reference.class
(enum_declaration
name: (identifier) @name.definition.enum) @definition.enum
(function_signature
name: (identifier) @name.definition.function) @definition.function
(initialized_variable_definition
name: (identifier)
value: (identifier) @name.reference.class
value: (selector
"!"?
(argument_part
(arguments
(argument)*))?)?) @reference.class
(assignment_expression
left: (assignable_expression
(identifier)
(unconditional_assignable_selector
"."
(identifier) @name.reference.send))) @reference.call
(assignment_expression
left: (assignable_expression
(identifier)
(conditional_assignable_selector
"?."
(identifier) @name.reference.send))) @reference.call
((identifier) @name.reference.send
(selector
"!"?
(conditional_assignable_selector
"?." (identifier) @name.reference.send)?
(unconditional_assignable_selector
"."? (identifier) @name.reference.send)?
(argument_part
(arguments
(argument)*))?)*
(cascade_section
(cascade_selector
(identifier)) @name.reference.send
(argument_part
(arguments
(argument)*))?)?) @reference.call

View File

@@ -0,0 +1,5 @@
;; defun/defsubst
(function_definition name: (symbol) @name.definition.function) @definition.function
;; Treat macros as function definitions for the sake of TAGS.
(macro_definition name: (symbol) @name.definition.function) @definition.function

View File

@@ -0,0 +1,54 @@
; Definitions
; * modules and protocols
(call
target: (identifier) @ignore
(arguments (alias) @name.definition.module)
(#any-of? @ignore "defmodule" "defprotocol")) @definition.module
; * functions/macros
(call
target: (identifier) @ignore
(arguments
[
; zero-arity functions with no parentheses
(identifier) @name.definition.function
; regular function clause
(call target: (identifier) @name.definition.function)
; function clause with a guard clause
(binary_operator
left: (call target: (identifier) @name.definition.function)
operator: "when")
])
(#any-of? @ignore "def" "defp" "defdelegate" "defguard" "defguardp" "defmacro" "defmacrop" "defn" "defnp")) @definition.function
; References
; ignore calls to kernel/special-forms keywords
(call
target: (identifier) @ignore
(#any-of? @ignore "def" "defp" "defdelegate" "defguard" "defguardp" "defmacro" "defmacrop" "defn" "defnp" "defmodule" "defprotocol" "defimpl" "defstruct" "defexception" "defoverridable" "alias" "case" "cond" "else" "for" "if" "import" "quote" "raise" "receive" "require" "reraise" "super" "throw" "try" "unless" "unquote" "unquote_splicing" "use" "with"))
; ignore module attributes
(unary_operator
operator: "@"
operand: (call
target: (identifier) @ignore))
; * function call
(call
target: [
; local
(identifier) @name.reference.call
; remote
(dot
right: (identifier) @name.reference.call)
]) @reference.call
; * pipe into function call
(binary_operator
operator: "|>"
right: (identifier) @name.reference.call) @reference.call
; * modules
(alias) @name.reference.module @reference.module

View File

@@ -0,0 +1,19 @@
(value_declaration (function_declaration_left (lower_case_identifier) @name.definition.function)) @definition.function
(function_call_expr (value_expr (value_qid) @name.reference.function)) @reference.function
(exposed_value (lower_case_identifier) @name.reference.function) @reference.function
(type_annotation ((lower_case_identifier) @name.reference.function) (colon)) @reference.function
(type_declaration ((upper_case_identifier) @name.definition.type) ) @definition.type
(type_ref (upper_case_qid (upper_case_identifier) @name.reference.type)) @reference.type
(exposed_type (upper_case_identifier) @name.reference.type) @reference.type
(type_declaration (union_variant (upper_case_identifier) @name.definition.union)) @definition.union
(value_expr (upper_case_qid (upper_case_identifier) @name.reference.union)) @reference.union
(module_declaration
(upper_case_qid (upper_case_identifier)) @name.definition.module
) @definition.module

View File

@@ -0,0 +1,41 @@
; Modules
(module) @name.reference.module @reference.module
(import alias: (identifier) @name.reference.module) @reference.module
(remote_type_identifier
module: (identifier) @name.reference.module) @reference.module
((field_access
record: (identifier) @name.reference.module)
(#is-not? local)) @reference.module
; Functions
(function
name: (identifier) @name.definition.function) @definition.function
(external_function
name: (identifier) @name.definition.function) @definition.function
(unqualified_import (identifier) @name.reference.function) @reference.function
((function_call
function: (identifier) @name.reference.function) @reference.function
(#is-not? local))
((field_access
record: (identifier) @ignore
field: (label) @name.reference.function)
(#is-not? local)) @reference.function
((binary_expression
operator: "|>"
right: (identifier) @name.reference.function)
(#is-not? local)) @reference.function
; Types
(type_definition
(type_name
name: (type_identifier) @name.definition.type)) @definition.type
(type_definition
(data_constructors
(data_constructor
name: (constructor_name) @name.definition.constructor))) @definition.constructor
(external_type
(type_name
name: (type_identifier) @name.definition.type)) @definition.type
(type_identifier) @name.reference.type @reference.type
(constructor_name) @name.reference.constructor @reference.constructor

View File

@@ -0,0 +1,42 @@
(
(comment)* @doc
.
(function_declaration
name: (identifier) @name.definition.function) @definition.function
(#strip! @doc "^//\\s*")
(#set-adjacent! @doc @definition.function)
)
(
(comment)* @doc
.
(method_declaration
name: (field_identifier) @name.definition.method) @definition.method
(#strip! @doc "^//\\s*")
(#set-adjacent! @doc @definition.method)
)
(call_expression
function: [
(identifier) @name.reference.call
(parenthesized_expression (identifier) @name.reference.call)
(selector_expression field: (field_identifier) @name.reference.call)
(parenthesized_expression (selector_expression field: (field_identifier) @name.reference.call))
]) @reference.call
(type_spec
name: (type_identifier) @name.definition.type) @definition.type
(type_identifier) @name.reference.type @reference.type
(package_clause "package" (package_identifier) @name.definition.module)
(type_declaration (type_spec name: (type_identifier) @name.definition.interface type: (interface_type)))
(type_declaration (type_spec name: (type_identifier) @name.definition.class type: (struct_type)))
(import_declaration (import_spec) @name.reference.module)
(var_declaration (var_spec name: (identifier) @name.definition.variable))
(const_declaration (const_spec name: (identifier) @name.definition.constant))

View File

@@ -0,0 +1,20 @@
(class_declaration
name: (identifier) @name.definition.class) @definition.class
(method_declaration
name: (identifier) @name.definition.method) @definition.method
(method_invocation
name: (identifier) @name.reference.method
arguments: (argument_list) @reference.call)
(interface_declaration
name: (identifier) @name.definition.interface) @definition.interface
(type_list
(type_identifier) @name.reference.interface) @reference.implementation
(object_creation_expression
type: (type_identifier) @name.reference.class) @reference.class
(superclass (type_identifier) @name.reference.class) @reference.class

View File

@@ -0,0 +1,34 @@
(function_declaration
name: [
(identifier) @name.definition.function
(dot_index_expression
field: (identifier) @name.definition.function)
]) @definition.function
(function_declaration
name: (method_index_expression
method: (identifier) @name.definition.method)) @definition.method
(assignment_statement
(variable_list .
name: [
(identifier) @name.definition.function
(dot_index_expression
field: (identifier) @name.definition.function)
])
(expression_list .
value: (function_definition))) @definition.function
(table_constructor
(field
name: (identifier) @name.definition.function
value: (function_definition))) @definition.function
(function_call
name: [
(identifier) @name.reference.call
(dot_index_expression
field: (identifier) @name.reference.call)
(method_index_expression
method: (identifier) @name.reference.method)
]) @reference.call

View File

@@ -0,0 +1,39 @@
;Class definitions @definition.class
;Function definitions @definition.function
;Interface definitions @definition.interface
;Method definitions @definition.method
;Module definitions @definition.module
;Function/method calls @reference.call
;Class reference @reference.class
;Interface implementation @reference.implementation
(
(identifier) @reference.class
(#match? @reference.class "^_*[A-Z][a-zA-Z0-9_]*$")
)
(class_definition (identifier) @name.definition.class) @definition.class
(actor_definition (identifier) @name.definition.class) @definition.class
(primitive_definition (identifier) @name.definition.class) @definition.class
(struct_definition (identifier) @name.definition.class) @definition.class
(type_alias (identifier) @name.definition.class) @definition.class
(trait_definition (identifier) @name.definition.interface) @definition.interface
(interface_definition (identifier) @name.definition.interface) @definition.interface
(constructor (identifier) @name.definition.method) @definition.method
(method (identifier) @name.definition.method) @definition.method
(behavior (identifier) @name.definition.method) @definition.method
(class_definition (type) @name.reference.implementation) @reference.implementation
(actor_definition (type) @name.reference.implementation) @reference.implementation
(primitive_definition (type) @name.reference.implementation) @reference.implementation
(struct_definition (type) @name.reference.implementation) @reference.implementation
(type_alias (type) @name.reference.implementation) @reference.implementation
; calls - not catching all possible call cases of callees for capturing the method name
(call_expression callee: [(identifier) (ffi_identifier)] @name.reference.call) @reference.call
(call_expression callee: (generic_expression [(identifier) (ffi_identifier)] @name.reference.call)) @reference.call
(call_expression callee: (member_expression (identifier) @name.reference.call .)) @reference.call
(call_expression callee: (member_expression (generic_expression [(identifier) (ffi_identifier)] @name.reference.call) .)) @reference.call
; TODO: add more possible callee expressions
(call_expression) @reference.call

View File

@@ -0,0 +1,5 @@
(property
(key) @name.definition.property) @definition.property
(substitution
(key) @name.reference.property) @reference.property

View File

@@ -0,0 +1,14 @@
(module (expression_statement (assignment left: (identifier) @name.definition.constant) @definition.constant))
(class_definition
name: (identifier) @name.definition.class) @definition.class
(function_definition
name: (identifier) @name.definition.function) @definition.function
(call
function: [
(identifier) @name.reference.call
(attribute
attribute: (identifier) @name.reference.call)
]) @reference.call

View File

@@ -0,0 +1,21 @@
(binary_operator
lhs: (identifier) @name.definition.function
operator: "<-"
rhs: (function_definition)
) @definition.function
(binary_operator
lhs: (identifier) @name.definition.function
operator: "="
rhs: (function_definition)
) @definition.function
(call
function: (identifier) @name.reference.call
) @reference.call
(call
function: (namespace_operator
rhs: (identifier) @name.reference.call
)
) @reference.call

View File

@@ -0,0 +1,12 @@
(list
.
(symbol) @reference._define
(#match? @reference._define "^(define|define/contract)$")
.
(list
.
(symbol) @name.definition.function) @definition.function)
(list
.
(symbol) @name.reference.call)

View File

@@ -0,0 +1,64 @@
; Method definitions
(
(comment)* @doc
.
[
(method
name: (_) @name.definition.method) @definition.method
(singleton_method
name: (_) @name.definition.method) @definition.method
]
(#strip! @doc "^#\\s*")
(#select-adjacent! @doc @definition.method)
)
(alias
name: (_) @name.definition.method) @definition.method
(setter
(identifier) @ignore)
; Class definitions
(
(comment)* @doc
.
[
(class
name: [
(constant) @name.definition.class
(scope_resolution
name: (_) @name.definition.class)
]) @definition.class
(singleton_class
value: [
(constant) @name.definition.class
(scope_resolution
name: (_) @name.definition.class)
]) @definition.class
]
(#strip! @doc "^#\\s*")
(#select-adjacent! @doc @definition.class)
)
; Module definitions
(
(module
name: [
(constant) @name.definition.module
(scope_resolution
name: (_) @name.definition.module)
]) @definition.module
)
; Calls
(call method: (identifier) @name.reference.call) @reference.call
(
[(identifier) (constant)] @name.reference.call @reference.call
(#is-not? local)
(#not-match? @name.reference.call "^(lambda|load|require|require_relative|__FILE__|__LINE__)$")
)

View File

@@ -0,0 +1,60 @@
; ADT definitions
(struct_item
name: (type_identifier) @name.definition.class) @definition.class
(enum_item
name: (type_identifier) @name.definition.class) @definition.class
(union_item
name: (type_identifier) @name.definition.class) @definition.class
; type aliases
(type_item
name: (type_identifier) @name.definition.class) @definition.class
; method definitions
(declaration_list
(function_item
name: (identifier) @name.definition.method) @definition.method)
; function definitions
(function_item
name: (identifier) @name.definition.function) @definition.function
; trait definitions
(trait_item
name: (type_identifier) @name.definition.interface) @definition.interface
; module definitions
(mod_item
name: (identifier) @name.definition.module) @definition.module
; macro definitions
(macro_definition
name: (identifier) @name.definition.macro) @definition.macro
; references
(call_expression
function: (identifier) @name.reference.call) @reference.call
(call_expression
function: (field_expression
field: (field_identifier) @name.reference.call)) @reference.call
(macro_invocation
macro: (identifier) @name.reference.call) @reference.call
; implementations
(impl_item
trait: (type_identifier) @name.reference.implementation) @reference.implementation
(impl_item
type: (type_identifier) @name.reference.implementation
!trait) @reference.implementation

View File

@@ -0,0 +1,43 @@
;; Method and Function declarations
(contract_declaration (_
(function_definition
name: (identifier) @name.definition.function) @definition.method))
(source_file
(function_definition
name: (identifier) @name.definition.function) @definition.function)
;; Contract, struct, enum and interface declarations
(contract_declaration
name: (identifier) @name.definition.class) @definition.class
(interface_declaration
name: (identifier) @name.definition.interface) @definition.interface
(library_declaration
name: (identifier) @name.definition.class) @definition.interface
(struct_declaration name: (identifier) @name.definition.class) @definition.class
(enum_declaration name: (identifier) @name.definition.class) @definition.class
(event_definition name: (identifier) @name.definition.class) @definition.class
;; Function calls
(call_expression (expression (identifier)) @name.reference.call ) @reference.call
(call_expression
(expression (member_expression
property: (_) @name.reference.method ))) @reference.call
;; Log emit
(emit_statement name: (_) @name.reference.class) @reference.class
;; Inheritance
(inheritance_specifier
ancestor: (user_defined_type (_) @name.reference.class . )) @reference.class
;; Imports ( note that unknown is not standardised )
(import_directive
import_name: (_) @name.reference.module ) @reference.unknown

View File

@@ -0,0 +1,51 @@
(class_declaration
name: (type_identifier) @name.definition.class) @definition.class
(protocol_declaration
name: (type_identifier) @name.definition.interface) @definition.interface
(class_declaration
(class_body
[
(function_declaration
name: (simple_identifier) @name.definition.method
)
(subscript_declaration
(parameter (simple_identifier) @name.definition.method)
)
(init_declaration "init" @name.definition.method)
(deinit_declaration "deinit" @name.definition.method)
]
)
) @definition.method
(protocol_declaration
(protocol_body
[
(protocol_function_declaration
name: (simple_identifier) @name.definition.method
)
(subscript_declaration
(parameter (simple_identifier) @name.definition.method)
)
(init_declaration "init" @name.definition.method)
]
)
) @definition.method
(class_declaration
(class_body
[
(property_declaration
(pattern (simple_identifier) @name.definition.property)
)
]
)
) @definition.property
(property_declaration
(pattern (simple_identifier) @name.definition.property)
) @definition.property
(function_declaration
name: (simple_identifier) @name.definition.function) @definition.function

View File

@@ -0,0 +1,20 @@
(assignment
key: "LABEL"
(value
(content) @name.definition.label)) @definition.label
(assignment
key: "GOTO"
(value
(content) @name.reference.label)) @reference.label
(assignment
key: "ENV"
(env_var) @name.definition.variable) @definition.variable
(match
key: "ENV"
(env_var) @name.reference.variable) @reference.variable
(var_sub
(env_var) @name.reference.variable) @reference.variable

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

@@ -145,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)"
@@ -309,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)]

View File

@@ -431,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()

View File

@@ -47,6 +47,22 @@
//"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,
@@ -131,4 +147,98 @@
"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

@@ -184,6 +184,156 @@
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
@@ -397,8 +547,8 @@
examples_as_sys_msg: true
extra_params:
max_tokens: 8192
include_reasoning: true
caches_by_default: true
use_temperature: false
editor_model_name: openrouter/deepseek/deepseek-chat
editor_edit_format: editor-diff
@@ -435,6 +585,18 @@
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
@@ -618,7 +780,7 @@
streaming: true
editor_model_name: fireworks_ai/accounts/fireworks/models/deepseek-v3
editor_edit_format: editor-diff
remove_reasoning: think
reasoning_tag: think
extra_params:
max_tokens: 160000
@@ -675,4 +837,64 @@
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
- name: cohere_chat/command-a-03-2025
examples_as_sys_msg: true
- name: openrouter/cohere/command-a-03-2025
examples_as_sys_msg: true
- name: gemini/gemma-3-27b-it
use_system_prompt: false
- name: openrouter/google/gemma-3-27b-it:free
use_system_prompt: false
- name: openrouter/google/gemma-3-27b-it
use_system_prompt: false

View File

@@ -140,7 +140,10 @@ class FileWatcher:
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
*roots_to_watch,
watch_filter=self.filter_func,
stop_event=self.stop_event,
ignore_permission_denied=True,
):
if self.handle_changes(changes):
return

View File

@@ -23,6 +23,86 @@ cog.out(text)
]]]-->
### main branch
- Bumped dependencies to pickup litellm fix for Ollama.
- Added support for `openrouter/google/gemma-3-27b-it` model.
- Aider wrote 96% of the code in this release.
### Aider v0.77.0
- Big upgrade in [programming languages supported](https://aider.chat/docs/languages.html) by adopting [tree-sitter-language-pack](https://github.com/Goldziher/tree-sitter-language-pack/).
- 130 new languages with linter support.
- 20 new languages with repo-map support.
- Added `/think-tokens` command to set thinking token budget with support for human-readable formats (8k, 10.5k, 0.5M).
- Added `/reasoning-effort` command to control model reasoning level.
- The `/think-tokens` and `/reasoning-effort` commands display current settings when called without arguments.
- Display of thinking token budget and reasoning effort in model information.
- Changed `--thinking-tokens` argument to accept string values with human-readable formats.
- Added `--auto-accept-architect` flag (default: true) to automatically accept changes from architect coder format without confirmation.
- Added support for `cohere_chat/command-a-03-2025` and `gemini/gemma-3-27b-it`
- The bare `/drop` command now preserves original read-only files provided via args.read.
- Fixed a bug where default model would be set by deprecated `--shortcut` switches even when already specified in the command line.
- Improved AutoCompleter to require 3 characters for autocompletion to reduce noise.
- Aider wrote 72% of the code in this release.
### Aider v0.76.2
- Fixed handling of JSONDecodeError when loading model cache file.
- Fixed handling of GitCommandError when retrieving git user configuration.
- Aider wrote 75% of the code in this release.
### 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.

View File

@@ -3723,7 +3723,7 @@
Titusz Pan: 9
start_tag: v0.71.0
total_lines: 283
- aider_percentage: 69.44
- aider_percentage: 37.47
aider_total: 284
end_date: '2025-01-31'
end_tag: v0.73.0
@@ -3746,6 +3746,10 @@
aider/models.py:
Paul Gauthier: 8
Paul Gauthier (aider): 33
aider/resources/model-settings.yml:
Paul Gauthier: 334
kennyfrc: 11
xqyz: 4
aider/sendchat.py:
Mir Adnan ALI: 28
Paul Gauthier: 11
@@ -3770,12 +3774,13 @@
Paul Gauthier (aider): 77
grand_total:
Mir Adnan ALI: 28
Paul Gauthier: 96
Paul Gauthier: 430
Paul Gauthier (aider): 284
xqyz: 1
kennyfrc: 11
xqyz: 5
start_tag: v0.72.0
total_lines: 409
- aider_percentage: 77.14
total_lines: 758
- aider_percentage: 76.07
aider_total: 604
end_date: '2025-02-06'
end_tag: v0.74.0
@@ -3813,6 +3818,8 @@
Paul Gauthier: 1
Paul Gauthier (aider): 2
"Viktor Sz\xE9pe": 3
aider/resources/model-settings.yml:
Paul Gauthier: 11
aider/watch.py:
Paul Gauthier (aider): 45
benchmark/docker.sh:
@@ -3839,8 +3846,332 @@
Paul Gauthier: 4
Paul Gauthier (aider): 42
grand_total:
Paul Gauthier: 176
Paul Gauthier: 187
Paul Gauthier (aider): 604
"Viktor Sz\xE9pe": 3
start_tag: v0.73.0
total_lines: 783
total_lines: 794
- aider_percentage: 44.78
aider_total: 163
end_date: '2025-02-24'
end_tag: v0.75.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Paul Gauthier: 7
aider/coders/base_coder.py:
Paul Gauthier: 12
Paul Gauthier (aider): 4
aider/commands.py:
FeepingCreature (aider): 6
aider/editor.py:
Paul Gauthier: 7
Paul Gauthier (aider): 5
aider/io.py:
Paul Gauthier: 3
Paul Gauthier (aider): 4
aider/linter.py:
Paul Gauthier: 1
aider/main.py:
Paul Gauthier: 16
aider/models.py:
Paul Gauthier: 4
aider/queries/tree-sitter-language-pack/javascript-tags.scm:
Paul Gauthier: 5
aider/queries/tree-sitter-languages/hcl-tags.scm:
Paul Gauthier: 3
Warren Krewenki: 74
aider/queries/tree-sitter-languages/javascript-tags.scm:
Paul Gauthier: 5
aider/repomap.py:
Paul Gauthier: 43
Paul Gauthier (aider): 11
aider/resources/model-settings.yml:
Paul Gauthier: 12
aider/special.py:
Lucas Shadler: 1
aider/website/docs/leaderboards/index.md:
Paul Gauthier: 1
benchmark/Dockerfile:
Paul Gauthier (aider): 1
benchmark/benchmark.py:
Paul Gauthier: 4
benchmark/cpp-test.sh:
Paul Gauthier: 1
scripts/blame.py:
Paul Gauthier (aider): 2
scripts/issues.py:
Paul Gauthier (aider): 17
tests/basic/test_coder.py:
Paul Gauthier (aider): 18
tests/basic/test_editor.py:
Antti Kaihola: 1
Paul Gauthier (aider): 41
tests/basic/test_models.py:
Paul Gauthier (aider): 1
tests/basic/test_repomap.py:
Paul Gauthier (aider): 1
tests/fixtures/languages/hcl/test.tf:
Paul Gauthier (aider): 52
grand_total:
Antti Kaihola: 1
FeepingCreature (aider): 6
Lucas Shadler: 1
Paul Gauthier: 125
Paul Gauthier (aider): 157
Warren Krewenki: 74
start_tag: v0.74.0
total_lines: 364
- aider_percentage: 84.75
aider_total: 1589
end_date: '2025-03-10'
end_tag: v0.76.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Paul Gauthier: 2
Paul Gauthier (aider): 25
aider/args_formatter.py:
Paul Gauthier: 4
Paul Gauthier (aider): 3
aider/coders/base_coder.py:
Paul Gauthier: 54
Paul Gauthier (aider): 29
aider/deprecated.py:
Paul Gauthier (aider): 107
aider/io.py:
Paul Gauthier: 7
Paul Gauthier (aider): 127
aider/main.py:
Akira Komamura: 2
Mattias: 1
Paul Gauthier: 4
Paul Gauthier (aider): 16
aider/models.py:
Paul Gauthier: 6
Paul Gauthier (aider): 68
aider/queries/tree-sitter-language-pack/csharp-tags.scm:
Paul Gauthier: 14
Paul Gauthier (aider): 12
aider/reasoning_tags.py:
Paul Gauthier: 14
Paul Gauthier (aider): 68
aider/repo.py:
Akira Komamura: 1
Paul Gauthier (aider): 4
aider/repomap.py:
Paul Gauthier: 9
aider/resources/model-settings.yml:
Paul Gauthier: 61
Paul Gauthier (aider): 32
gmoz22: 4
aider/website/_includes/leaderboard.js:
Paul Gauthier (aider): 48
aider/website/docs/leaderboards/index.md:
Paul Gauthier: 2
benchmark/benchmark.py:
Paul Gauthier: 1
benchmark/problem_stats.py:
Paul Gauthier (aider): 2
docker/Dockerfile:
Paul Gauthier: 1
scripts/blame.py:
Paul Gauthier: 1
scripts/pip-compile.sh:
Claudia Pellegrino: 10
Paul Gauthier: 6
Paul Gauthier (aider): 11
scripts/update-history.py:
Paul Gauthier: 1
scripts/versionbump.py:
Paul Gauthier: 4
Paul Gauthier (aider): 64
tests/basic/test_deprecated.py:
Paul Gauthier: 10
Paul Gauthier (aider): 130
tests/basic/test_io.py:
Paul Gauthier (aider): 54
tests/basic/test_main.py:
Paul Gauthier: 1
Paul Gauthier (aider): 93
tests/basic/test_model_info_manager.py:
Paul Gauthier (aider): 72
tests/basic/test_models.py:
Paul Gauthier: 27
Paul Gauthier (aider): 34
tests/basic/test_reasoning.py:
Paul Gauthier: 36
Paul Gauthier (aider): 525
tests/basic/test_repomap.py:
Paul Gauthier: 2
tests/basic/test_ssl_verification.py:
Paul Gauthier (aider): 65
grand_total:
Akira Komamura: 3
Claudia Pellegrino: 10
Mattias: 1
Paul Gauthier: 268
Paul Gauthier (aider): 1589
gmoz22: 4
start_tag: v0.75.0
total_lines: 1875
- aider_percentage: 71.93
aider_total: 1399
end_date: '2025-03-13'
end_tag: v0.77.0
file_counts:
aider/__init__.py:
Paul Gauthier: 1
aider/args.py:
Paul Gauthier (aider): 5
aider/coders/architect_coder.py:
Paul Gauthier (aider): 2
aider/coders/base_coder.py:
Paul Gauthier (aider): 14
aider/commands.py:
Paul Gauthier: 4
Paul Gauthier (aider): 71
aider/deprecated.py:
Paul Gauthier: 2
aider/io.py:
Paul Gauthier (aider): 5
aider/main.py:
Paul Gauthier (aider): 12
aider/models.py:
Paul Gauthier (aider): 83
aider/queries/tree-sitter-language-pack/arduino-tags.scm:
Paul Gauthier: 3
Paul Gauthier (aider): 2
aider/queries/tree-sitter-language-pack/c-tags.scm:
Paul Gauthier: 4
Paul Gauthier (aider): 5
aider/queries/tree-sitter-language-pack/chatito-tags.scm:
Paul Gauthier: 11
Paul Gauthier (aider): 5
aider/queries/tree-sitter-language-pack/commonlisp-tags.scm:
Paul Gauthier: 116
Paul Gauthier (aider): 6
aider/queries/tree-sitter-language-pack/cpp-tags.scm:
Paul Gauthier: 7
Paul Gauthier (aider): 8
aider/queries/tree-sitter-language-pack/d-tags.scm:
Paul Gauthier: 9
Paul Gauthier (aider): 17
aider/queries/tree-sitter-language-pack/dart-tags.scm:
Paul Gauthier: 42
Paul Gauthier (aider): 19
aider/queries/tree-sitter-language-pack/elisp-tags.scm:
Paul Gauthier: 1
Paul Gauthier (aider): 2
aider/queries/tree-sitter-language-pack/elixir-tags.scm:
Paul Gauthier: 10
Paul Gauthier (aider): 8
aider/queries/tree-sitter-language-pack/elm-tags.scm:
Paul Gauthier: 8
Paul Gauthier (aider): 11
aider/queries/tree-sitter-language-pack/gleam-tags.scm:
Paul Gauthier: 26
Paul Gauthier (aider): 15
aider/queries/tree-sitter-language-pack/go-tags.scm:
Paul Gauthier: 14
Paul Gauthier (aider): 14
aider/queries/tree-sitter-language-pack/java-tags.scm:
Paul Gauthier: 10
Paul Gauthier (aider): 7
aider/queries/tree-sitter-language-pack/lua-tags.scm:
Paul Gauthier: 25
Paul Gauthier (aider): 9
aider/queries/tree-sitter-language-pack/pony-tags.scm:
Paul Gauthier: 20
Paul Gauthier (aider): 19
aider/queries/tree-sitter-language-pack/properties-tags.scm:
Paul Gauthier: 3
Paul Gauthier (aider): 2
aider/queries/tree-sitter-language-pack/python-tags.scm:
Paul Gauthier: 9
Paul Gauthier (aider): 5
aider/queries/tree-sitter-language-pack/r-tags.scm:
Paul Gauthier: 17
Paul Gauthier (aider): 4
aider/queries/tree-sitter-language-pack/racket-tags.scm:
Paul Gauthier: 10
Paul Gauthier (aider): 2
aider/queries/tree-sitter-language-pack/ruby-tags.scm:
Paul Gauthier: 23
Paul Gauthier (aider): 12
aider/queries/tree-sitter-language-pack/rust-tags.scm:
Paul Gauthier: 41
Paul Gauthier (aider): 14
aider/queries/tree-sitter-language-pack/solidity-tags.scm:
Paul Gauthier: 30
Paul Gauthier (aider): 13
aider/queries/tree-sitter-language-pack/swift-tags.scm:
Paul Gauthier: 39
Paul Gauthier (aider): 12
aider/queries/tree-sitter-language-pack/udev-tags.scm:
Paul Gauthier: 15
Paul Gauthier (aider): 5
aider/resources/model-settings.yml:
Paul Gauthier: 9
aider/watch.py:
Yutaka Matsubara: 4
aider/website/docs/leaderboards/index.md:
Paul Gauthier: 3
Paul Gauthier (aider): 8
scripts/redact-cast.py:
Paul Gauthier: 27
Paul Gauthier (aider): 98
scripts/tsl_pack_langs.py:
Paul Gauthier (aider): 145
scripts/versionbump.py:
Paul Gauthier (aider): 1
tests/basic/test_coder.py:
Paul Gauthier (aider): 104
tests/basic/test_commands.py:
Paul Gauthier: 2
Paul Gauthier (aider): 190
tests/basic/test_models.py:
Paul Gauthier (aider): 44
tests/basic/test_repomap.py:
Paul Gauthier: 1
Paul Gauthier (aider): 125
tests/fixtures/languages/arduino/test.ino:
Paul Gauthier (aider): 21
tests/fixtures/languages/c/test.c:
Paul Gauthier (aider): 12
tests/fixtures/languages/chatito/test.chatito:
Paul Gauthier (aider): 20
tests/fixtures/languages/commonlisp/test.lisp:
Paul Gauthier (aider): 17
tests/fixtures/languages/d/test.d:
Paul Gauthier (aider): 26
tests/fixtures/languages/dart/test.dart:
Paul Gauthier (aider): 21
tests/fixtures/languages/elm/test.elm:
Paul Gauthier (aider): 16
tests/fixtures/languages/gleam/test.gleam:
Paul Gauthier (aider): 10
tests/fixtures/languages/lua/test.lua:
Paul Gauthier (aider): 25
tests/fixtures/languages/pony/test.pony:
Paul Gauthier (aider): 8
tests/fixtures/languages/properties/test.properties:
Paul Gauthier (aider): 14
tests/fixtures/languages/r/test.r:
Paul Gauthier (aider): 17
tests/fixtures/languages/racket/test.rkt:
Paul Gauthier (aider): 8
tests/fixtures/languages/solidity/test.sol:
Paul Gauthier (aider): 21
tests/fixtures/languages/swift/test.swift:
Paul Gauthier (aider): 18
tests/fixtures/languages/udev/test.rules:
Paul Gauthier (aider): 22
grand_total:
Paul Gauthier: 542
Paul Gauthier (aider): 1399
Yutaka Matsubara: 4
start_tag: v0.76.0
total_lines: 1945

View File

@@ -256,4 +256,4 @@
date: 2024-12-22
versions: 0.69.2.dev
seconds_per_case: 12.2
total_cost: 0.0000
total_cost: 0.0000

View File

@@ -1,3 +1,29 @@
- 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
@@ -569,4 +595,188 @@
date: 2025-02-15
versions: 0.74.3.dev
seconds_per_case: 12.4
total_cost: 14.3703
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
- dirname: 2025-03-14-23-40-00--cmda-quality-whole2
test_cases: 225
model: command-a-03-2025-quality
edit_format: whole
commit_hash: a1aa63f
pass_rate_1: 2.2
pass_rate_2: 12.0
pass_num_1: 5
pass_num_2: 27
percent_cases_well_formed: 99.6
error_outputs: 2
num_malformed_responses: 1
num_with_malformed_responses: 1
user_asks: 215
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 4
total_tests: 225
command: OPENAI_API_BASE=https://api.cohere.ai/compatibility/v1 aider --model openai/command-a-03-2025-quality
date: 2025-03-14
versions: 0.77.1.dev
seconds_per_case: 85.1
total_cost: 0.0000
- dirname: 2025-03-15-01-21-24--gemma3-27b-or
test_cases: 225
model: gemma-3-27b-it
edit_format: whole
commit_hash: fd21f51-dirty
pass_rate_1: 1.8
pass_rate_2: 4.9
pass_num_1: 4
pass_num_2: 11
percent_cases_well_formed: 100.0
error_outputs: 3
num_malformed_responses: 0
num_with_malformed_responses: 0
user_asks: 181
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 3
total_tests: 225
command: aider --model openrouter/google/gemma-3-27b-it
date: 2025-03-15
versions: 0.77.1.dev
seconds_per_case: 79.7
total_cost: 0.0000

View File

@@ -11,14 +11,14 @@ 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.5 Sonnet via Anthropic's API
# 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.5-sonnet --api-key openrouter=your-key-goes-here
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

@@ -23,6 +23,16 @@ document.addEventListener('DOMContentLoaded', function () {
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
}]
};
@@ -32,7 +42,8 @@ document.addEventListener('DOMContentLoaded', function () {
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" }}'
edit_format: '{{ row.edit_format | default: "diff" }}',
total_cost: {{ row.total_cost | default: 0 }}
});
{% endfor %}
@@ -43,6 +54,7 @@ document.addEventListener('DOMContentLoaded', function () {
displayedData = [];
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
leaderboardData.datasets[1].data = [];
allData.forEach(function(row, index) {
var rowElement = document.getElementById('edit-row-' + index);
@@ -53,6 +65,8 @@ document.addEventListener('DOMContentLoaded', function () {
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);
}
});
@@ -111,10 +125,29 @@ document.addEventListener('DOMContentLoaded', function () {
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: {
@@ -125,6 +158,17 @@ document.addEventListener('DOMContentLoaded', function () {
text: 'Percent completed correctly'
}
},
y1: {
beginAtZero: true,
position: 'right',
grid: {
drawOnChartArea: false
},
title: {
display: true,
text: 'Total Cost ($)'
}
},
x: {
ticks: {
callback: function(value, index) {
@@ -173,6 +217,7 @@ document.addEventListener('DOMContentLoaded', function () {
displayedData = [];
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
leaderboardData.datasets[1].data = [];
for (var i = 0; i < rows.length; i++) {
var rowText = rows[i].textContent;
@@ -181,6 +226,8 @@ document.addEventListener('DOMContentLoaded', function () {
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';
}

View File

@@ -0,0 +1,183 @@
/* Terminal header styling */
.terminal-header {
background-color: #e0e0e0;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
padding: 4px 10px;
display: flex;
align-items: center;
border-bottom: 1px solid #c0c0c0;
}
.terminal-buttons {
display: flex;
gap: 4px;
margin-right: 10px;
}
.terminal-button {
width: 10px;
height: 10px;
border-radius: 50%;
}
.terminal-close {
background-color: #ff5f56;
border: 1px solid #e0443e;
}
.terminal-minimize {
background-color: #ffbd2e;
border: 1px solid #dea123;
}
.terminal-expand {
background-color: #27c93f;
border: 1px solid #1aab29;
}
.terminal-title {
flex-grow: 1;
text-align: center;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
font-size: 11px;
color: #666;
}
/* Toast notification styling */
.toast-container {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 9999;
pointer-events: none;
}
.toast-notification {
background-color: rgba(0, 0, 0, 0.7);
color: white;
padding: 12px 25px;
border-radius: 8px;
margin-bottom: 10px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
opacity: 0;
transition: opacity 0.3s ease-in-out;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
font-size: 18px;
text-align: center;
display: inline-block;
min-width: 200px;
max-width: 90%;
}
/* Page container styling */
.page-container {
max-width: 900px;
margin-left: auto;
margin-right: auto;
position: relative;
}
.terminal-container {
border-radius: 6px;
overflow: hidden;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
margin-top: 20px;
margin-bottom: 20px;
position: relative;
}
/* Timestamp link styling */
.timestamp-link {
color: #0366d6;
text-decoration: none;
font-weight: bold;
cursor: pointer;
}
.timestamp-link:hover {
text-decoration: underline;
}
/* Active timestamp styling */
.timestamp-active {
background-color: #f0f8ff; /* Light blue background */
border-radius: 3px;
padding: 2px 4px;
margin: -2px -4px;
}
/* Highlight the list item containing the active timestamp */
li.active-marker {
background-color: #f6f8fa;
border-radius: 4px;
padding: 4px 8px;
margin-left: -8px;
}
/* Make list items clickable */
.transcript-item {
cursor: pointer;
transition: background-color 0.2s ease;
padding: 4px 8px;
margin-left: -8px;
border-radius: 4px;
}
.transcript-item:hover {
background-color: #f0f0f0;
}
/* Keyboard shortcuts styling */
.keyboard-shortcuts {
text-align: center;
font-size: 14px;
color: #666;
margin-top: 10px;
margin-bottom: 20px;
}
/* Hide keyboard shortcuts on devices likely without physical keyboards */
.no-physical-keyboard .keyboard-shortcuts {
display: none;
}
.keyboard-shortcuts kbd {
background-color: #f7f7f7;
border: 1px solid #ccc;
border-radius: 3px;
box-shadow: 0 1px 0 rgba(0,0,0,0.2);
color: #333;
display: inline-block;
font-family: monospace;
line-height: 1;
margin: 0 2px;
padding: 3px 5px;
white-space: nowrap;
}
.asciinema-player-theme-aider {
/* Foreground (default text) color */
--term-color-foreground: #444444; /* colour238 */
/* Background color */
--term-color-background: #dadada; /* colour253 */
/* Palette of 16 standard ANSI colors */
--term-color-0: #21222c;
--term-color-1: #ff5555;
--term-color-2: #50fa7b;
--term-color-3: #f1fa8c;
--term-color-4: #bd93f9;
--term-color-5: #ff79c6;
--term-color-6: #8be9fd;
--term-color-7: #f8f8f2;
--term-color-8: #6272a4;
--term-color-9: #ff6e6e;
--term-color-10: #69ff94;
--term-color-11: #ffffa5;
--term-color-12: #d6acff;
--term-color-13: #ff92df;
--term-color-14: #a4ffff;
--term-color-15: #ffffff;
}

View File

@@ -0,0 +1,349 @@
document.addEventListener('DOMContentLoaded', function() {
let player; // Store player reference to make it accessible to click handlers
let globalAudio; // Global audio element to be reused
// Detect if device likely has no physical keyboard
function detectNoKeyboard() {
// Check if it's a touch device (most mobile devices)
const isTouchDevice = ('ontouchstart' in window) ||
(navigator.maxTouchPoints > 0) ||
(navigator.msMaxTouchPoints > 0);
// Check common mobile user agents as additional signal
const isMobileUA = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
// If it's a touch device and has a mobile user agent, likely has no physical keyboard
if (isTouchDevice && isMobileUA) {
document.body.classList.add('no-physical-keyboard');
}
}
// Run detection
detectNoKeyboard();
// Parse the transcript section to create markers and convert timestamps to links
function parseTranscript() {
const markers = [];
// Find the Commentary heading
const transcriptHeading = Array.from(document.querySelectorAll('h2')).find(el => el.textContent.trim() === 'Commentary');
if (transcriptHeading) {
// Get all list items after the transcript heading
let currentElement = transcriptHeading.nextElementSibling;
while (currentElement && currentElement.tagName === 'UL') {
const listItems = currentElement.querySelectorAll('li');
listItems.forEach(item => {
const text = item.textContent.trim();
const match = text.match(/(\d+):(\d+)\s+(.*)/);
if (match) {
const minutes = parseInt(match[1], 10);
const seconds = parseInt(match[2], 10);
const timeInSeconds = minutes * 60 + seconds;
const formattedTime = `${minutes}:${seconds.toString().padStart(2, '0')}`;
const message = match[3].trim();
// Create link for the timestamp
const timeLink = document.createElement('a');
timeLink.href = '#';
timeLink.textContent = formattedTime;
timeLink.className = 'timestamp-link';
timeLink.dataset.time = timeInSeconds;
timeLink.dataset.message = message;
// Add click event to seek the player
timeLink.addEventListener('click', function(e) {
e.preventDefault();
if (player && typeof player.seek === 'function') {
player.seek(timeInSeconds);
player.play();
// Also trigger toast and speech
showToast(message);
speakText(message, timeInSeconds);
// Highlight this timestamp
highlightTimestamp(timeInSeconds);
}
});
// Replace text with the link + message
item.textContent = '';
item.appendChild(timeLink);
item.appendChild(document.createTextNode(' ' + message));
// Add class and click handler to the entire list item
item.classList.add('transcript-item');
item.dataset.time = timeInSeconds;
item.dataset.message = message;
item.addEventListener('click', function(e) {
// Prevent click event if the user clicked directly on the timestamp link
// This prevents double-firing of the event
if (e.target !== timeLink) {
e.preventDefault();
if (player && typeof player.seek === 'function') {
player.seek(timeInSeconds);
player.play();
// Also trigger toast and speech
showToast(message);
speakText(message, timeInSeconds);
// Highlight this timestamp
highlightTimestamp(timeInSeconds);
}
}
});
markers.push([timeInSeconds, message]);
}
});
currentElement = currentElement.nextElementSibling;
}
}
return markers;
}
// Parse transcript and create markers
const markers = parseTranscript();
// Create player with a single call
player = AsciinemaPlayer.create(
recording_url,
document.getElementById('demo'),
{
speed: 1.25,
idleTimeLimit: 1,
theme: "aider",
poster: "npt:0:01",
markers: markers
}
);
// Focus on the player element so keyboard shortcuts work immediately
setTimeout(() => {
// Use setTimeout to ensure the player is fully initialized
if (player && typeof player.focus === 'function') {
player.focus();
} else {
// If player doesn't have a focus method, try to find and focus the terminal element
const playerElement = document.querySelector('.asciinema-terminal');
if (playerElement) {
playerElement.focus();
} else {
// Last resort - try to find element with tabindex
const tabbableElement = document.querySelector('[tabindex]');
if (tabbableElement) {
tabbableElement.focus();
}
}
}
}, 100);
// Function to display toast notification
function showToast(text) {
// Get the appropriate container based on fullscreen state
let container = document.getElementById('toast-container');
const isFullscreen = document.fullscreenElement ||
document.webkitFullscreenElement ||
document.mozFullScreenElement ||
document.msFullscreenElement;
// If in fullscreen, check if we need to create a fullscreen toast container
if (isFullscreen) {
// Target the fullscreen element as the container parent
const fullscreenElement = document.fullscreenElement ||
document.webkitFullscreenElement ||
document.mozFullScreenElement ||
document.msFullscreenElement;
// Look for an existing fullscreen toast container
let fsContainer = fullscreenElement.querySelector('.fs-toast-container');
if (!fsContainer) {
// Create a new container for fullscreen mode
fsContainer = document.createElement('div');
fsContainer.className = 'toast-container fs-toast-container';
fsContainer.id = 'fs-toast-container';
fullscreenElement.appendChild(fsContainer);
}
container = fsContainer;
}
// Create toast element
const toast = document.createElement('div');
toast.className = 'toast-notification';
toast.textContent = text;
// Add to container
container.appendChild(toast);
// Trigger animation
setTimeout(() => {
toast.style.opacity = '1';
}, 10);
// Remove after 3 seconds
setTimeout(() => {
toast.style.opacity = '0';
setTimeout(() => {
if (container && container.contains(toast)) {
container.removeChild(toast);
}
}, 300); // Wait for fade out animation
}, 3000);
}
// Improved browser TTS function
function useBrowserTTS(text) {
if ('speechSynthesis' in window) {
console.log('Using browser TTS fallback');
// Cancel any ongoing speech
window.speechSynthesis.cancel();
const utterance = new SpeechSynthesisUtterance(text);
utterance.rate = 1.0;
utterance.pitch = 1.0;
utterance.volume = 1.0;
// For iOS, use a shorter utterance if possible
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
utterance.text = text.length > 100 ? text.substring(0, 100) + '...' : text;
}
utterance.onstart = () => console.log('Speech started');
utterance.onend = () => console.log('Speech ended');
utterance.onerror = (e) => console.warn('Speech error:', e);
window.speechSynthesis.speak(utterance);
return true;
}
console.warn('SpeechSynthesis not supported');
return false;
}
// Function to play pre-generated TTS audio files
function speakText(text, timeInSeconds) {
// Format time for filename (MM-SS)
const minutes = Math.floor(timeInSeconds / 60);
const seconds = timeInSeconds % 60;
const formattedTime = `${minutes.toString().padStart(2, '0')}-${seconds.toString().padStart(2, '0')}`;
// Get recording_id from the page or use default from the URL
const recordingId = typeof recording_id !== 'undefined' ? recording_id :
window.location.pathname.split('/').pop().replace('.html', '');
// Construct audio file path
const audioPath = `/assets/audio/${recordingId}/${formattedTime}.mp3`;
// Log for debugging
console.log(`Attempting to play audio: ${audioPath}`);
// Detect iOS
const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
console.log(`Device is iOS: ${isIOS}`);
try {
// Create or reuse audio element
if (!globalAudio) {
globalAudio = new Audio();
console.log("Created new global Audio element");
}
// Set up event handlers
globalAudio.onerror = (e) => {
console.warn(`Audio error: ${e.type}`, e);
useBrowserTTS(text);
};
// For iOS, preload might help with subsequent plays
if (isIOS) {
globalAudio.preload = "auto";
}
// Set the new source
globalAudio.src = audioPath;
// Play with proper error handling
const playPromise = globalAudio.play();
if (playPromise !== undefined) {
playPromise.catch(error => {
console.warn(`Play error: ${error.message}`);
// On iOS, a user gesture might be required
if (isIOS) {
console.log("iOS playback failed, trying SpeechSynthesis");
}
useBrowserTTS(text);
});
}
} catch (e) {
console.error(`Exception in audio playback: ${e.message}`);
useBrowserTTS(text);
}
}
// Function to highlight the active timestamp in the transcript
function highlightTimestamp(timeInSeconds) {
// Remove previous highlights
document.querySelectorAll('.timestamp-active').forEach(el => {
el.classList.remove('timestamp-active');
});
document.querySelectorAll('.active-marker').forEach(el => {
el.classList.remove('active-marker');
});
// Find the timestamp link with matching time
const timestampLinks = document.querySelectorAll('.timestamp-link');
let activeLink = null;
for (const link of timestampLinks) {
if (parseInt(link.dataset.time) === timeInSeconds) {
activeLink = link;
break;
}
}
if (activeLink) {
// Add highlight class to the link
activeLink.classList.add('timestamp-active');
// Also highlight the parent list item
const listItem = activeLink.closest('li');
if (listItem) {
listItem.classList.add('active-marker');
// No longer scrolling into view to avoid shifting focus
}
}
}
// Add event listener with safety checks
if (player && typeof player.addEventListener === 'function') {
player.addEventListener('marker', function(event) {
try {
const { index, time, label } = event;
console.log(`marker! ${index} - ${time} - ${label}`);
// Speak the marker label and show toast
speakText(label, time);
showToast(label);
// Highlight the corresponding timestamp in the transcript
highlightTimestamp(time);
} catch (error) {
console.error('Error in marker event handler:', error);
}
});
}
});

View File

@@ -0,0 +1,32 @@
<link rel="stylesheet" type="text/css" href="/assets/asciinema/asciinema-player.css" />
<style>
{% include recording.css %}
</style>
<script src="/assets/asciinema/asciinema-player.min.js"></script>
<script>
{% include recording.js %}
</script>
<div class="page-container">
<div class="toast-container" id="toast-container"></div>
<div class="terminal-container">
<div class="terminal-header">
<div class="terminal-buttons">
<div class="terminal-button terminal-close"></div>
<div class="terminal-button terminal-minimize"></div>
<div class="terminal-button terminal-expand"></div>
</div>
<div class="terminal-title">aider</div>
</div>
<div id="demo"></div>
</div>
</div>
<div class="keyboard-shortcuts">
<kbd>Space</kbd> Play/pause —
<kbd>f</kbd> Fullscreen —
<kbd>←</kbd><kbd>→</kbd> ±5s
</div>

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:

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"00-01": "We're going to add a new feature to automatically accept edits proposed by the architect model.",
"00-11": "First, let's add the new switch.",
"00-40": "Aider figured out that it should be passed to the Coder class.",
"00-48": "Now we need to implement the functionality.",
"01-00": "Let's do some manual testing.",
"01-28": "That worked. Let's make sure we can turn it off too.",
"02-00": "Let's quickly tidy up the changes to HISTORY.",
"02-05": "All done!",
"01-42": "That worked too. Let's have aider update the HISTORY file to document the new feature."
}

View File

@@ -0,0 +1,11 @@
{
"00-10": "We've added files that handle the main CLI and in-chat slash commands like /drop.",
"00-20": "Let's explain the needed change to aider.",
"01-20": "Ok, let's look at the code.",
"01-30": "I'd prefer not to use \"hasattr()\", let's ask for improvements.",
"01-45": "Let's try some manual testing.",
"02-10": "Looks good. Let's check the existing test suite to ensure we didn't break anything.",
"02-19": "Let's ask aider to add tests for this.",
"02-50": "Tests look reasonable, we're done!",
"00-01": "We're going to update the /drop command to keep any read only files that were originally specified at launch."
}

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