Compare commits

...

2731 Commits

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

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

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

    language = "in the same language they are using"

Which resulted in the prompt:

    "Always reply to the user IN IN the same language they are using."
2024-11-21 14:19:39 -03:00
paul-gauthier
e94961a14f Merge pull request #2414 from thehunmonkgroup/editor-doc 2024-11-21 07:37:22 -08:00
Chad Phillips
d4e77b3be4 add documentation for /editor configuration 2024-11-21 09:46:25 -05:00
Paul Gauthier
b96b36d5ea refactor: Remove unnecessary assert_newlines check for updated lines 2024-11-21 06:42:04 -08:00
Paul Gauthier
72d559a92c fix: Remove duplicate assert_newlines call on original lines 2024-11-21 06:39:39 -08:00
Paul Gauthier (aider)
9a7bdcb6db style: Fix linter warnings in test_commands.py 2024-11-21 06:36:11 -08:00
Paul Gauthier (aider)
2e4cf48e7e test: Update cmd_run test to check cur_messages instead of return value 2024-11-21 06:36:05 -08:00
Paul Gauthier
b78f8abeb4 copy 2024-11-21 06:34:08 -08:00
Paul Gauthier (aider)
7aa4e44317 fix: Correct line/lines pluralization in command output messages 2024-11-21 06:30:52 -08:00
Paul Gauthier
2619b92131 fix: Add period to output message for consistency 2024-11-21 06:30:50 -08:00
Paul Gauthier (aider)
28be59582f refactor: Simplify cmd_run to use confirm_ask and add output to cur_messages 2024-11-21 06:28:41 -08:00
Paul Gauthier
f96cc03587 feat: Add opt-in analytics and improve output logging method 2024-11-21 06:25:10 -08:00
Paul Gauthier (aider)
cbd35b0e87 feat: Implement line count for command output in chat 2024-11-21 06:23:34 -08:00
Paul Gauthier
443acbe4b5 fix: Correct command output confirmation logic in base coder 2024-11-21 06:23:32 -08:00
Paul Gauthier
1f0d26e8c7 better over time plot 2024-11-20 20:19:44 -08:00
Paul Gauthier
8302e9d0dd improved over time plot 2024-11-20 20:16:35 -08:00
Paul Gauthier (aider)
c797af020a refactor: Update fontsize to use LABEL_FONT_SIZE constant in over_time.py 2024-11-20 20:13:46 -08:00
Paul Gauthier (aider)
1c85afa320 feat: Add LABEL_FONT_SIZE constant for dot label font size 2024-11-20 20:13:33 -08:00
Paul Gauthier
eb5317f8e5 fix: Adjust annotation vertical offset for brown color in over_time plot 2024-11-20 20:13:30 -08:00
Paul Gauthier (aider)
8b860615b8 style: Increase font size for scatter plot dot labels 2024-11-20 20:10:40 -08:00
Paul Gauthier (aider)
c15ac341e2 refactor: Remove Opus and Llama model variants from legend labels 2024-11-20 20:07:52 -08:00
Paul Gauthier (aider)
c2c7ee1047 feat: Change Opus label to "Opus" in legend 2024-11-20 20:06:48 -08:00
Paul Gauthier (aider)
72c46ccec6 feat: Add labels for Claude 3 Opus, Sonnet, and O1 Preview models 2024-11-20 20:06:04 -08:00
Paul Gauthier (aider)
dd3bfaee01 style: Format code with consistent indentation and line breaks 2024-11-20 20:05:24 -08:00
Paul Gauthier (aider)
03206ad90e feat: Add line labels directly on first points instead of using legend 2024-11-20 20:05:18 -08:00
Paul Gauthier (aider)
2e00307190 feat: Add color and legend label for o1-preview models 2024-11-20 20:03:49 -08:00
Paul Gauthier (aider)
b3e29ab20e style: Apply linter formatting to benchmark code 2024-11-20 20:02:52 -08:00
Paul Gauthier (aider)
5504ac535b feat: Add simplified model names for legend labels 2024-11-20 20:02:48 -08:00
Paul Gauthier (aider)
4b3dd7f4ea style: Apply linter formatting to over_time.py 2024-11-20 19:59:43 -08:00
Paul Gauthier (aider)
8edf9540d5 feat: Add legend to plot and remove point labels 2024-11-20 19:59:38 -08:00
Paul Gauthier
1c62ecd1b5 style: Adjust x-axis label rotation angle for better readability 2024-11-20 19:59:36 -08:00
Paul Gauthier
7cf3d9f3ce style: Increase annotation font size in benchmark plot 2024-11-20 19:45:42 -08:00
Paul Gauthier
9b5a703307 updated models-over-time 2024-11-20 19:40:59 -08:00
Paul Gauthier (aider)
370993cbed style: Rotate point labels by 45 degrees in benchmark plot 2024-11-20 18:47:30 -08:00
Paul Gauthier
ddc538cdfa refactor: Adjust plot figure size and y-axis limits for better visualization 2024-11-20 18:47:28 -08:00
Paul Gauthier (aider)
062dc43c87 style: Make graph aspect ratio square 2024-11-20 18:43:18 -08:00
Paul Gauthier (aider)
7d9b986c04 feat: Add cyan color and line for Mistral models in visualization 2024-11-20 18:38:06 -08:00
Paul Gauthier
bd2b9a12ed style: Change Qwen model color from purple to darkblue 2024-11-20 18:38:04 -08:00
Paul Gauthier (aider)
2b55707738 feat: Add purple color and line for Qwen models in visualization 2024-11-20 18:35:25 -08:00
Paul Gauthier (aider)
093540507e feat: Add pink color and line for Haiku models in benchmark visualization 2024-11-20 18:33:54 -08:00
Paul Gauthier (aider)
8f1dcfda07 feat: Add brown color for DeepSeek models in benchmark visualization 2024-11-20 18:31:46 -08:00
Paul Gauthier
16b319174b refactor: Simplify model color detection logic for Sonnet models 2024-11-20 18:31:44 -08:00
Paul Gauthier (aider)
35115f5707 feat: Add orange color for Claude 3 Sonnet models in benchmark visualization 2024-11-20 18:30:09 -08:00
Paul Gauthier
e9e51db9c7 improve precision, tests 2024-11-20 18:20:18 -08:00
Paul Gauthier (aider)
ec39f018e2 test: Update test_is_uuid_in_percentage with full-length UUIDs 2024-11-20 17:58:52 -08:00
Paul Gauthier
59f4a3bcc7 test: Update UUID percentage threshold test case 2024-11-20 17:58:50 -08:00
Paul Gauthier (aider)
1a8949eea3 fix: Correct UUID percentage calculation in analytics method 2024-11-20 17:58:18 -08:00
Paul Gauthier
fa85bdceed fix: Correct sampling logic by changing <= to < in UUID comparison 2024-11-20 17:58:16 -08:00
Paul Gauthier (aider)
6b703244ec fix: Correct percentage calculation in is_uuid_in_percentage method 2024-11-20 17:56:07 -08:00
Paul Gauthier (aider)
1a1cb0d3f1 fix: Correct percentage calculation in UUID sampling method 2024-11-20 17:55:40 -08:00
Paul Gauthier (aider)
95c9863d0a style: Fix linter formatting in analytics module 2024-11-20 17:54:22 -08:00
Paul Gauthier (aider)
82187f6a71 refactor: Extract UUID percentage testing logic into a separate method with tests 2024-11-20 17:54:16 -08:00
Paul Gauthier (aider)
75f52a1324 refactor: Improve user sampling logic with configurable percentage 2024-11-20 17:52:52 -08:00
Paul Gauthier
6e076a40a9 refactor: Modify analytics sampling logic to use 1% of users 2024-11-20 17:52:50 -08:00
Paul Gauthier
ded60036cb copy 2024-11-20 17:43:51 -08:00
Paul Gauthier
539a6cde63 feat: Enhance analytics opt-in logic with user sampling and explicit control 2024-11-20 16:22:01 -08:00
Paul Gauthier
3a28e74d89 copy 2024-11-20 16:03:51 -08:00
Paul Gauthier
c93f3faed9 cleanup openrouter/qwen/qwen-2.5-coder-32b-instruct in resources 2024-11-20 15:33:00 -08:00
Paul Gauthier
1aaa3d9279 gpt-4o-2024-11-20 2024-11-20 15:31:47 -08:00
Paul Gauthier
a06a9ed7d8 show the /editor message 2024-11-20 15:31:32 -08:00
Paul Gauthier
18a88596a6 Added gpt-4o-2024-11-20 2024-11-20 11:33:16 -08:00
Paul Gauthier (aider)
2ac077603b feat: Update add_to_input_history to immediately update prompt session history 2024-11-20 08:16:55 -08:00
Paul Gauthier (aider)
3bb8b163b8 feat: Update HISTORY.md with new release notes entries 2024-11-20 08:09:53 -08:00
Paul Gauthier (aider)
aac45097ca fix: Save empty dict to cache file on download failure 2024-11-20 07:57:56 -08:00
Paul Gauthier (aider)
788956e86d refactor: Update cache TTL in ModelInfoManager even on download failure 2024-11-20 07:56:28 -08:00
Paul Gauthier
e917424f5d copy 2024-11-20 07:13:15 -08:00
Paul Gauthier
1f6a5d04d9 chore: Update edit leaderboard with new Mistral model performance data 2024-11-20 07:09:38 -08:00
Paul Gauthier (aider)
dba844c7f9 style: Format code with linter 2024-11-19 17:45:44 -08:00
Paul Gauthier (aider)
09c11ef8ad test: Add --yes flag to prevent EOFError in test cases 2024-11-19 17:45:40 -08:00
Paul Gauthier
ff21669bb5 copy 2024-11-19 17:42:34 -08:00
Paul Gauthier
a059ca2537 refactor: Improve release notes display logic and user interaction flow 2024-11-19 17:41:57 -08:00
Paul Gauthier
f4531b9434 docs: Add release notes URL and section in HISTORY.md 2024-11-19 17:38:17 -08:00
Paul Gauthier (aider)
05b350ac4b style: Fix linter formatting in main.py 2024-11-19 17:37:19 -08:00
Paul Gauthier (aider)
cfba315a85 fix: Replace utils.open_url with webbrowser.open to resolve AttributeError 2024-11-19 17:37:14 -08:00
Paul Gauthier
12188b6684 refactor: Simplify release notes display logic in main function 2024-11-19 17:37:13 -08:00
Paul Gauthier (aider)
725b2fc16f style: Apply linter formatting to main.py 2024-11-19 17:33:22 -08:00
Paul Gauthier (aider)
90a28e31e8 feat: Add --show-release-notes option to control release notes display 2024-11-19 17:33:16 -08:00
Paul Gauthier
c057b00e08 refactor: Move release notes offer after announcements in main function 2024-11-19 17:33:13 -08:00
Paul Gauthier (aider)
b0c0104ba3 feat: Implement release notes URL offer on first run 2024-11-19 17:30:30 -08:00
Paul Gauthier
855b184e91 feat: Add TODO for displaying release notes on first run 2024-11-19 17:30:29 -08:00
Paul Gauthier (aider)
bc88242dc0 refactor: Move version check to main and pass to check_and_load_imports 2024-11-19 17:27:02 -08:00
Paul Gauthier (aider)
6357cd623f style: Apply linter formatting to main.py 2024-11-19 17:25:02 -08:00
Paul Gauthier (aider)
d3e7d20e30 refactor: Extract version checking logic into separate function 2024-11-19 17:24:57 -08:00
Paul Gauthier
7b568c2df3 copy 2024-11-19 17:22:08 -08:00
Paul Gauthier
2bff0522e8 refactor: Restructure file mention check and interrupt handling in base coder 2024-11-19 16:37:02 -08:00
Paul Gauthier (aider)
77e180171c style: Break long comment into two lines for flake8 compliance 2024-11-19 14:48:22 -08:00
Paul Gauthier (aider)
1e8fc97ba4 style: Apply linter formatting to test_models.py 2024-11-19 14:48:11 -08:00
Paul Gauthier (aider)
a799851832 fix: Resolve temporary file permission issues in test_models.py 2024-11-19 14:48:06 -08:00
Paul Gauthier
2c81105bfc copy 2024-11-19 14:33:21 -08:00
Paul Gauthier
bf99ac56a0 copy 2024-11-19 12:45:56 -08:00
Paul Gauthier
8bfb47948a copy 2024-11-19 12:45:00 -08:00
Paul Gauthier (aider)
b8c41198a3 docs: Add documentation links to v0.63.3 release notes 2024-11-19 12:43:17 -08:00
Paul Gauthier (aider)
fe138ac05b feat: Update HISTORY.md with v0.63.3 release details 2024-11-19 12:42:44 -08:00
Paul Gauthier
bed62fdcb5 chore: Update HISTORY.md for Aider v0.63.2 release 2024-11-19 12:42:41 -08:00
Paul Gauthier
f068df0297 copy 2024-11-19 12:40:09 -08:00
Paul Gauthier
6a05e34d20 copy 2024-11-19 12:37:16 -08:00
Paul Gauthier (aider)
8b69b9c6a4 docs: Add documentation for new multiline tag input method 2024-11-19 12:36:55 -08:00
Paul Gauthier (aider)
10192296fe style: Format code with linter 2024-11-19 12:34:47 -08:00
Paul Gauthier (aider)
7b98db2f7d fix: Escape f-string brace in multiline input tag handling 2024-11-19 12:34:43 -08:00
Paul Gauthier (aider)
81696c2e7a feat: Add support for optional multiline input tags with matching closing tag 2024-11-19 12:34:25 -08:00
Paul Gauthier
16a4f823bd refactor: Move pipe_editor import and return user input in cmd_editor method 2024-11-19 12:30:41 -08:00
Paul Gauthier
39bbfc56a4 copy 2024-11-19 12:30:30 -08:00
Paul Gauthier (aider)
308c49b2d8 fix: Modify discover_editor to dynamically check platform system 2024-11-19 12:26:37 -08:00
Paul Gauthier (aider)
53e46a9251 refactor: Remove unused platform import from test_editor.py 2024-11-19 12:26:06 -08:00
Paul Gauthier (aider)
6075b3dc33 style: Reorder imports and add whitespace in test_editor.py 2024-11-19 12:25:50 -08:00
Paul Gauthier (aider)
860a828973 test: Add comprehensive tests for editor module functionality 2024-11-19 12:25:46 -08:00
Paul Gauthier
033eaa36c6 test: Add test_editor.py for basic editor functionality 2024-11-19 12:25:44 -08:00
Paul Gauthier
b3566f5449 Merge branch 'main' of github.com:Aider-AI/aider 2024-11-19 12:23:12 -08:00
paul-gauthier
f1306d3301 Merge pull request #2234 from thehunmonkgroup/main
add /editor command
2024-11-19 12:22:37 -08:00
Paul Gauthier
cc18441435 refactor: Update model settings name from "aider/extra" to "aider/extra_params" 2024-11-19 12:15:11 -08:00
Paul Gauthier (aider)
7e787d93e6 docs: Add documentation for aider/extra_params pseudo-model settings 2024-11-19 12:10:28 -08:00
Paul Gauthier
b08f444e74 docs: Remove default and override settings section from documentation 2024-11-19 12:10:26 -08:00
Paul Gauthier (aider)
09c1acdbe2 fix: Update model settings override name to match test configuration 2024-11-19 12:07:42 -08:00
Paul Gauthier (aider)
7a4a956eff fix: Remove unexpected skip_name argument in _copy_fields() method 2024-11-19 12:07:08 -08:00
Paul Gauthier (aider)
aabbf5a72f refactor: Remove unused import and add ANTHROPIC_BETA_HEADER import 2024-11-19 12:06:29 -08:00
Paul Gauthier (aider)
5ed44bb174 style: Format test_models.py with consistent whitespace and trailing commas 2024-11-19 12:06:19 -08:00
Paul Gauthier (aider)
92cf2cbd47 test: Implement TODOs in test_aider_extra_model_settings 2024-11-19 12:06:15 -08:00
Paul Gauthier
34aff6c786 test: Update model settings test to check extra parameters 2024-11-19 12:06:13 -08:00
Paul Gauthier (aider)
11f10e586a fix: Remove unused functools.wraps import 2024-11-19 12:03:14 -08:00
Paul Gauthier (aider)
a31feae2bd style: Apply linter formatting to models.py 2024-11-19 12:02:49 -08:00
Paul Gauthier (aider)
3517d58f01 feat: Implement deep merge for extra model settings with nested dict support 2024-11-19 12:02:44 -08:00
Paul Gauthier
9d13fadd41 refactor: Simplify model settings configuration and remove tracking decorator 2024-11-19 12:02:42 -08:00
Paul Gauthier (aider)
c1febce528 fix: Remove unused imports and add missing register_models import 2024-11-19 11:50:12 -08:00
Paul Gauthier (aider)
e0aadbd961 style: Format code with linter and improve readability 2024-11-19 11:50:01 -08:00
Paul Gauthier (aider)
7b9a76c5ea refactor: Use temporary YAML file for model settings in test_default_and_override_settings 2024-11-19 11:49:57 -08:00
Paul Gauthier
6133fa8384 test: Update test cases with new edit_format value 2024-11-19 11:49:55 -08:00
Paul Gauthier (aider)
67cc215ed3 style: Apply linter formatting to models.py 2024-11-19 11:45:37 -08:00
Paul Gauthier (aider)
ea4ad2ea4d feat: Add track_init_fields decorator to track explicitly set fields in ModelSettings 2024-11-19 11:45:32 -08:00
Paul Gauthier
847454a4f7 fix: Remove debug dump statement in ModelSettings initialization 2024-11-19 11:45:31 -08:00
Paul Gauthier (aider)
8cba1fdd71 feat: Track and copy only explicitly set fields in ModelSettings 2024-11-19 10:11:44 -08:00
Paul Gauthier
e56112739c refactor: Add debug dump calls for edit_format in Model initialization 2024-11-19 10:11:42 -08:00
Paul Gauthier (aider)
76988b746f refactor: Remove unused call import and rename loop variable 2024-11-19 10:05:01 -08:00
Paul Gauthier (aider)
32eb365a0b style: Reorder imports in test_models.py 2024-11-19 10:04:45 -08:00
Paul Gauthier (aider)
2c5feddad5 test: Add imports for ModelSettings and MODEL_SETTINGS 2024-11-19 10:04:41 -08:00
Paul Gauthier (aider)
210500ff3e style: Apply linter formatting to test_models.py 2024-11-19 10:04:23 -08:00
Paul Gauthier (aider)
7c8f10e832 test: Add tests for default and override model settings 2024-11-19 10:04:19 -08:00
Paul Gauthier (aider)
644da2f9e4 docs: Add documentation for aider/default and aider/override model settings 2024-11-19 10:03:26 -08:00
Paul Gauthier (aider)
2a80d9c555 feat: Apply generic model settings when no exact model match found 2024-11-19 10:02:25 -08:00
Paul Gauthier
76f8791f3c refactor: Restructure model settings application with early returns and simplified logic 2024-11-19 10:02:24 -08:00
Paul Gauthier (aider)
c51a013109 refactor: Extract field copying logic into reusable _copy_fields method 2024-11-19 10:00:23 -08:00
Paul Gauthier (aider)
88c2f95ea5 style: Format code with linter 2024-11-19 09:59:27 -08:00
Paul Gauthier (aider)
062fa7de78 refactor: Enhance model settings configuration with default and override handling 2024-11-19 09:59:22 -08:00
Paul Gauthier
d6c1a41e8d feat: Add Timeout exception to handle API provider timeouts 2024-11-19 09:27:16 -08:00
Paul Gauthier
20ab5f9326 copy 2024-11-19 06:52:15 -08:00
Paul Gauthier
ab5a8b24a5 updated blame 2024-11-18 13:56:46 -08:00
Paul Gauthier (aider)
21a28623ca feat: Explicitly include specific markdown files in blame script 2024-11-18 13:46:43 -08:00
Paul Gauthier (aider)
06a5fec612 feat: Include .md files from aider/website/share/ in blame statistics 2024-11-18 13:45:50 -08:00
Paul Gauthier (aider)
46ecb8a663 feat: Enhance share page security with markdown sanitization and error handling 2024-11-18 13:40:15 -08:00
Paul Gauthier (aider)
3c9c6eef6e feat: Add URL validation and Content Security Policy to share page 2024-11-18 13:37:02 -08:00
Paul Gauthier
72734de376 copy 2024-11-18 13:28:47 -08:00
Paul Gauthier
a20ea09a6e refactor: Remove redundant streaming=False from model settings 2024-11-18 13:28:14 -08:00
Paul Gauthier (aider)
4bd7bce232 docs: Add example of using .aiderignore to focus on specific directories in monorepo 2024-11-18 13:22:55 -08:00
Paul Gauthier
8adf42216d copy 2024-11-18 07:47:30 -08:00
Paul Gauthier (aider)
5f40aaabb5 style: Lint and clean up code formatting in issues.py script 2024-11-18 07:46:28 -08:00
Paul Gauthier (aider)
5295abbb83 style: Move #noqa comments to triple-quoted strings in issues.py 2024-11-18 07:46:23 -08:00
Paul Gauthier
201abe1524 refactor: Improve code formatting and add noqa comment in issues.py script 2024-11-18 07:46:00 -08:00
Paul Gauthier (aider)
6d26051d11 style: Reformat long string literals using parentheses 2024-11-18 07:44:54 -08:00
Paul Gauthier (aider)
4613bf78d5 feat: Add BOT_SUFFIX to issue comment templates 2024-11-18 07:44:50 -08:00
Paul Gauthier
1f8fdc6f5c refactor: Update issue script comments and add bot suffix 2024-11-18 07:44:48 -08:00
Paul Gauthier
abf804cf10 set version to 0.63.3.dev 2024-11-18 07:30:21 -08:00
Paul Gauthier
d7a195706f version bump to 0.63.2 2024-11-18 07:29:05 -08:00
Paul Gauthier
569370109a copy 2024-11-18 07:11:46 -08:00
Paul Gauthier
eae3f04c83 copy 2024-11-18 06:57:35 -08:00
Paul Gauthier (aider)
ee0987f331 feat: Update HISTORY.md with recent changes since v0.63.1 2024-11-18 06:57:04 -08:00
Paul Gauthier (aider)
bdafa842bd fix: Add missing time import for time.sleep() in write_text method 2024-11-15 16:23:37 -08:00
Paul Gauthier (aider)
76c7c2562c style: Format code with linter for improved readability 2024-11-15 16:23:26 -08:00
Paul Gauthier (aider)
f7de2234f2 fix: Handle different OSError types in write_text method 2024-11-15 16:23:21 -08:00
Paul Gauthier
c725c45726 Merge branch 'main' of github.com:Aider-AI/aider 2024-11-15 16:22:23 -08:00
paul-gauthier
383bef456d Merge pull request #2381 from mark-asymbl/write_text_file_lock_fix
Added io.py write_text exponential backoff to gracefully handle transient file locks
2024-11-15 16:21:40 -08:00
mw
7f48f3d01d Added write_text exponential backoff to
Discord thread ID: 1306776889762906123

Resolve issue where Aider fails to write multiple, consecutive changes to a single file due to Visual Studio briefly locking a file for writing after it was edited. Presumably VS is doing some sort of processing, such as for IntelliSense, behind the scenes. This solution is applicable to other, similar editor/IDE behaviors.
2024-11-15 15:04:25 -08:00
Paul Gauthier
0bf17a48f7 copy 2024-11-15 07:42:17 -08:00
Paul Gauthier (aider)
c127f8f2f0 chore: Update HISTORY.md with v0.63.1 and v0.63.2 release notes 2024-11-15 07:37:14 -08:00
Paul Gauthier
d4d5d15e18 fix: Handle missing litellm_provider in fuzzy model matching 2024-11-15 06:14:15 -08:00
Paul Gauthier
b254afa498 refactor: Modify model metadata file loading to prioritize resource file 2024-11-15 05:33:59 -08:00
Paul Gauthier
0ce5a94c15 bumped deps 2024-11-15 05:29:29 -08:00
Paul Gauthier
38a5405c65 copy 2024-11-14 15:30:49 -08:00
Paul Gauthier
ecef784686 Merge branch 'main' of github.com:Aider-AI/aider 2024-11-14 15:27:51 -08:00
Paul Gauthier
e82b2c12b4 cleanup 2024-11-14 15:27:40 -08:00
Paul Gauthier (aider)
3c26ced8db style: Apply linter formatting to main.py 2024-11-14 15:18:54 -08:00
Paul Gauthier (aider)
2681a41abb refactor: Expand read-only file paths to include all files in directories 2024-11-14 15:18:47 -08:00
Paul Gauthier
805deb1002 feat: Add comment to expand read-only directory files 2024-11-14 15:18:45 -08:00
Paul Gauthier
6b792de802 copy 2024-11-14 15:15:23 -08:00
paul-gauthier
26f8e34dcb Merge pull request #2369 from josx/fix_contrib_pytest_filename 2024-11-14 07:33:53 -08:00
José Luis Di Biase
e0c1b2458c fix: typo pytest filename 2024-11-14 12:27:12 -03:00
Paul Gauthier
66f94d2141 set version to 0.63.2.dev 2024-11-14 06:56:43 -08:00
Paul Gauthier
503a9a0038 version bump to 0.63.1 2024-11-14 06:55:05 -08:00
Paul Gauthier
d8a5bc3ae9 Revert "Merge branch 'issue2283'"
This reverts commit e1a1e43c3a, reversing
changes made to c538817b61.
2024-11-14 06:53:21 -08:00
Paul Gauthier (aider)
94c3957d92 fix: Add error handling for git.ignored() method 2024-11-14 06:48:35 -08:00
Paul Gauthier
266350b8ce fix: Handle potential git errors in git_ignored_file method 2024-11-14 06:48:33 -08:00
Paul Gauthier
fedaede3b0 Merge branch 'main' into watch 2024-11-14 06:47:58 -08:00
Paul Gauthier (aider)
721d852cc7 feat: Add vertical spacing div to improve FAQ anchor link behavior 2024-11-13 16:23:50 -08:00
Paul Gauthier
ffbf205aba docs: Add explanation for aider code stats computation 2024-11-13 16:20:07 -08:00
Paul Gauthier
e1a1e43c3a Merge branch 'issue2283' 2024-11-13 13:43:30 -08:00
Paul Gauthier
c538817b61 updated blame 2024-11-13 13:43:05 -08:00
Paul Gauthier
71d85d2771 fix: Update Qwen 2.5 Coder 32b model configuration condition 2024-11-13 13:40:35 -08:00
Paul Gauthier
69f4d5fca7 set version to 0.63.1.dev 2024-11-13 13:37:03 -08:00
Paul Gauthier
bb31fc5301 version bump to 0.63.0 2024-11-13 13:35:36 -08:00
Paul Gauthier
87ce51e314 copy 2024-11-13 13:32:20 -08:00
Paul Gauthier
33555ca2ea refactor: Simplify file display logic and label formatting 2024-11-13 13:31:38 -08:00
Paul Gauthier (aider)
6fc3776c0c style: Fix linter warnings in io.py 2024-11-13 13:27:11 -08:00
Paul Gauthier (aider)
8a05f05bd4 refactor: Improve file list display logic with line-based spacing 2024-11-13 13:27:06 -08:00
Paul Gauthier (aider)
0dff51920e feat: Conditionally print blank line between file sections based on file count 2024-11-13 13:26:09 -08:00
Paul Gauthier
262f217d04 style: Shorten file list labels for cleaner display 2024-11-13 13:26:08 -08:00
Paul Gauthier (aider)
8b9154bab0 feat: Add labels to read-only and editable files columns 2024-11-13 13:24:51 -08:00
Paul Gauthier (aider)
533613d92b fix: Remove unused repo variable in test_cmd_add_gitignored_file 2024-11-13 13:22:57 -08:00
Paul Gauthier
20d87e1136 refactor: Remove unnecessary .gitignore commit in test setup 2024-11-13 13:22:45 -08:00
Paul Gauthier (aider)
1450c4194e test: Add test to verify cmd_add respects .gitignore files 2024-11-13 13:20:52 -08:00
Paul Gauthier
bc82baa968 refactor: Reorder git ignored file check to handle non-git repos 2024-11-13 13:18:09 -08:00
Paul Gauthier
218623be28 feat: Add git_ignored_file method to check files against gitignore 2024-11-13 13:12:25 -08:00
Paul Gauthier
ea1a4ecdc6 fix: Handle empty content in reply_completed method 2024-11-13 12:57:45 -08:00
Paul Gauthier
6acbff3c11 fix: Handle empty content in ArchitectCoder reply_completed method 2024-11-13 12:57:38 -08:00
Paul Gauthier
153021efcf fix: Handle OSError in get_rel_repo_dir method for edge cases 2024-11-13 12:51:27 -08:00
Paul Gauthier
fef1b59b42 refactor: Restructure file mention check and interrupt handling in base coder 2024-11-13 12:50:17 -08:00
Paul Gauthier
733b11b7d4 copy 2024-11-13 12:40:43 -08:00
Paul Gauthier
400514ff10 fix: Remove hardcoded reminder and add Qwen 2.5 coder model configuration 2024-11-13 12:36:28 -08:00
Paul Gauthier
bbfac316fc feat: Add model metadata for Qwen 2.5 Coder 32B Instruct model 2024-11-13 12:24:32 -08:00
Paul Gauthier
7d0b67f70e copy 2024-11-12 19:12:19 -08:00
Paul Gauthier
d0f1b38848 feat: Add Qwen 2.5 Coder 32B model settings and improve model loading robustness 2024-11-12 19:10:48 -08:00
Paul Gauthier
4d4b5bc366 chore: Remove model-metadata.json file 2024-11-12 18:38:59 -08:00
Paul Gauthier
1f39c7ef0d refactor: Improve model info retrieval logic in ModelInfoManager 2024-11-12 18:37:33 -08:00
Paul Gauthier (aider)
2e97fcc47f fix: Remove double-counting of cached tokens in token calculation 2024-11-11 17:19:11 -08:00
Paul Gauthier
550c8322c4 copy 2024-11-11 15:54:38 -08:00
Paul Gauthier (aider)
2467e23033 feat: Add vertex_ai/gemini-pro-experimental model with diff-fenced edit mode 2024-11-11 15:53:53 -08:00
Paul Gauthier
0e53198c59 do not swallow litellm.get_model_info() exceptions #2318 2024-11-11 15:15:24 -08:00
Paul Gauthier
94ff9dc0a4 Merge branch 'main' into watch 2024-11-11 14:51:38 -08:00
Paul Gauthier
44063590e2 copy 2024-11-11 10:30:23 -08:00
Paul Gauthier
557f25bf80 copy 2024-11-11 10:30:00 -08:00
paul-gauthier
190531543f Merge pull request #2335 from Hambaobao/qwen2.5-coder-32b-diff-results
Add diff format evaluation results of Qwen2.5-Coder-32B-Instruct.
2024-11-11 10:29:16 -08:00
Paul Gauthier
acfb7c3a89 fix: Handle git repo initialization errors gracefully 2024-11-11 09:56:19 -08:00
Paul Gauthier
94a6d3bc7e fix: Handle case when current working directory is inaccessible in git setup 2024-11-11 09:55:23 -08:00
Paul Gauthier (aider)
5751bcd382 refactor: Move Path.cwd() call to top of setup_git and add OSError handling 2024-11-11 09:54:43 -08:00
Paul Gauthier
21b88c0e65 refactor: Update language reply prompts to use {language} placeholder 2024-11-11 09:38:30 -08:00
Paul Gauthier
f66b916d4b feat: Add language configuration for user communication in prompts 2024-11-11 09:36:23 -08:00
柏枫
bd9c43a48d Add evaluation results for Qwen2.5-Coder-32B-Instruct using the diff format. 2024-11-12 01:23:19 +08:00
Paul Gauthier
352b91f342 copy 2024-11-11 08:46:08 -08:00
Paul Gauthier
be6e3254ea copy 2024-11-11 08:45:42 -08:00
paul-gauthier
dd1ee209ab Merge pull request #2334 from Hambaobao/qwen2.5-coder-series-results
Add Evaluation Results of Qwen2.5-Coder Series.
2024-11-11 08:43:51 -08:00
柏枫
c0b1101a52 Add evaluation results of Qwen2.5-Coder series. 2024-11-11 20:18:30 +08:00
Paul Gauthier
52c49fc8fd feat: Add option to return web scrape content instead of printing 2024-11-08 14:27:59 -08:00
Paul Gauthier
77cb64958e refactor: Modify URL scraping and message handling in commands 2024-11-08 14:23:55 -08:00
Paul Gauthier (aider)
b3d13e44b2 refactor: Modify cmd_web to add scraped content to cur_messages as assistant reply 2024-11-08 14:21:59 -08:00
Paul Gauthier
9dd7b795ca fix: Handle NotFoundError in send chat test with single print call 2024-11-08 14:18:23 -08:00
Paul Gauthier (aider)
7a8399571a fix: Handle non-retryable errors by returning None in simple_send_with_retries 2024-11-08 10:03:49 -08:00
Paul Gauthier (aider)
d0e85d9c2c style: Apply linter formatting to sendchat.py and test_sendchat.py 2024-11-08 10:02:54 -08:00
Paul Gauthier (aider)
14d02bc843 fix: Handle None response and update InvalidRequestError test 2024-11-08 10:02:48 -08:00
Paul Gauthier (aider)
b79c09cf58 refactor: Remove unused CACHE import from test_sendchat.py 2024-11-08 10:01:45 -08:00
Paul Gauthier (aider)
c9dfe5daff style: Organize imports and format code in test_sendchat.py 2024-11-08 10:01:16 -08:00
Paul Gauthier (aider)
092e7f6b3c test: Add comprehensive tests for sendchat module functionality 2024-11-08 10:01:11 -08:00
Paul Gauthier (aider)
203634314c style: Format code with linter 2024-11-08 10:00:33 -08:00
Paul Gauthier (aider)
c472e6e160 fix: Update test_exceptions.py to provide required arguments for litellm exceptions 2024-11-08 10:00:30 -08:00
Paul Gauthier (aider)
86d9275375 refactor: Remove unused pytest import from test_exceptions.py 2024-11-08 09:59:44 -08:00
Paul Gauthier (aider)
9db6780af6 style: Sort imports and add whitespace in test_exceptions.py 2024-11-08 09:59:30 -08:00
Paul Gauthier (aider)
e10205ff69 test: Add comprehensive tests for LiteLLMExceptions module 2024-11-08 09:59:25 -08:00
Paul Gauthier
9f539436b8 test: Add test_exceptions.py to basic test suite 2024-11-08 09:59:23 -08:00
Paul Gauthier
acd75e1083 copy 2024-11-08 09:58:21 -08:00
Paul Gauthier
f30225db90 removing buggy close-stale.yml workflow 2024-11-08 09:58:06 -08:00
Paul Gauthier (aider)
007305962a style: Remove unnecessary line breaks in comment_url assignment 2024-11-08 09:56:20 -08:00
Paul Gauthier (aider)
8065e38797 style: Wrap long comment_url line to fix flake8 line length error 2024-11-08 09:56:15 -08:00
Paul Gauthier (aider)
34dc684867 style: Remove unnecessary line breaks in comment_url assignment 2024-11-08 09:56:06 -08:00
Paul Gauthier (aider)
7edc9603d0 fix: Break long line to resolve flake8 line length error 2024-11-08 09:55:59 -08:00
Paul Gauthier (aider)
479d476878 style: Format code with consistent indentation and line breaks 2024-11-08 09:55:42 -08:00
Paul Gauthier (aider)
92bbec1852 feat: Add function to process and close stale issues after 7 days of inactivity 2024-11-08 09:55:37 -08:00
Paul Gauthier
d406636878 refactor: Improve issue output formatting and message clarity 2024-11-08 09:55:35 -08:00
Paul Gauthier (aider)
6362199363 fix: Reorder stale label and comment operations in handle_stale_issues 2024-11-08 09:25:11 -08:00
Paul Gauthier
22dbcb7590 refactor: Update stale issue comment text for clarity and conciseness 2024-11-08 09:25:09 -08:00
Paul Gauthier (aider)
cefea38ee5 feat: Add issue URL to stale issue output for easier navigation 2024-11-08 09:17:55 -08:00
Paul Gauthier (aider)
d44cd01493 refactor: Add noqa comment to stale comment line to resolve flake8 warning 2024-11-08 09:11:41 -08:00
Paul Gauthier (aider)
e578655653 style: Format Python code with linter 2024-11-08 09:11:24 -08:00
Paul Gauthier (aider)
434dc27557 feat: Add stale issue detection for question-labeled issues with no activity 2024-11-08 09:11:19 -08:00
Paul Gauthier
d4a88d08e4 Merge branch 'main' into watch 2024-11-07 13:44:51 -08:00
Paul Gauthier
79af39bd2c fix: Change tool_output to tool_warning for error message logging 2024-11-07 13:22:28 -08:00
Paul Gauthier (aider)
20d5a9fd4b style: Run linter to clean up whitespace in test_sendchat.py 2024-11-07 13:09:52 -08:00
Paul Gauthier (aider)
80e57ca074 fix: Remove unused import of httpx in test_sendchat.py 2024-11-07 13:09:50 -08:00
Paul Gauthier
8a3c95d8dd feat: Add LiteLLMExceptions loading in test for send chat functionality 2024-11-07 13:09:47 -08:00
Paul Gauthier
4941a360cb fix: Restore import of LiteLLMExceptions in base_coder.py 2024-11-07 13:02:17 -08:00
Paul Gauthier (aider)
9e7219c4d6 style: Run linter to clean up code formatting in sendchat.py 2024-11-07 13:02:10 -08:00
Paul Gauthier (aider)
4d96728709 fix: Remove unused import of 'backoff' in sendchat.py 2024-11-07 13:02:07 -08:00
Paul Gauthier
816fd5e65c refactor: Simplify error handling and remove unused retry exceptions code 2024-11-07 13:02:04 -08:00
Paul Gauthier (aider)
8d4175536f style: fix linting issues and whitespace in exceptions.py 2024-11-07 12:45:32 -08:00
Paul Gauthier (aider)
bba9ca3d5a feat: add get_ex_info method to lookup exception info 2024-11-07 12:45:29 -08:00
Paul Gauthier
8bc9ebf2aa feat: add LiteLLM exception handling with ExInfo dataclass 2024-11-07 12:45:27 -08:00
Paul Gauthier (aider)
dad335b8b6 refactor: remove unused comment from LiteLLMExceptions class 2024-11-07 12:19:45 -08:00
Paul Gauthier
62e93d4002 feat: add custom exceptions module 2024-11-07 12:19:41 -08:00
Paul Gauthier
728f4a0f81 copy 2024-11-07 11:54:53 -08:00
Paul Gauthier
0cafd6ee4b Merge branch 'main' of github.com:Aider-AI/aider 2024-11-07 11:50:28 -08:00
Paul Gauthier
2962e51dac test: Add webbrowser patching to TestCoder and fix argument order in test_sanity_check_repo 2024-11-07 11:48:17 -08:00
Paul Gauthier (aider)
cf5733b237 style: fix import order in test_sanity_check_repo.py 2024-11-07 11:47:39 -08:00
Paul Gauthier (aider)
c96e3326bc fix: update test to check for offer_url instead of confirm_ask 2024-11-07 11:47:35 -08:00
Paul Gauthier
1cd373c0a5 test: fix git index version test to use offer_url instead of confirm_ask 2024-11-07 11:47:33 -08:00
Paul Gauthier
ae970cf2da fix: Update webbrowser patch to use correct module path 2024-11-07 11:35:40 -08:00
Paul Gauthier
d43a01f182 cleanup 2024-11-07 11:29:47 -08:00
Paul Gauthier
42aac55b82 use offer_url 2024-11-07 11:29:05 -08:00
Paul Gauthier
a66f31dc87 bugfix 2024-11-07 11:28:52 -08:00
Paul Gauthier (aider)
64c48f2151 refactor: remove unused webbrowser import 2024-11-07 11:23:02 -08:00
Paul Gauthier (aider)
9eead8a904 style: Fix comment formatting and whitespace 2024-11-07 10:30:45 -08:00
Paul Gauthier (aider)
7761bccffe refactor: replace confirm_ask/webbrowser.open with io.offer_url 2024-11-07 10:30:41 -08:00
Paul Gauthier
a848933875 chore: add TODO comment for refactoring URL handling 2024-11-07 10:30:38 -08:00
Paul Gauthier (aider)
e475f3d752 refactor: move webbrowser import to io.py and remove from base_coder.py 2024-11-07 10:26:54 -08:00
Paul Gauthier (aider)
4d24dbc661 style: fix linting issues in io.py header comment 2024-11-07 10:26:41 -08:00
Paul Gauthier (aider)
0368c3fae9 refactor: extract URL opening functionality into dedicated io.offer_url method 2024-11-07 10:26:33 -08:00
Paul Gauthier
2cf93ccb54 refactor: simplify URL opening confirmation prompt 2024-11-07 10:26:31 -08:00
paul-gauthier
3d72cafea4 Merge pull request #2284 from Mushoz/main 2024-11-07 06:07:47 -08:00
Jaap Buurman
af0466ea83 Added Qwen2.5-7b-coder with the updated weights
The Qwen team still calls it Qwen2.5, but as can be seen from the
benchmarks the difference in performance compared to the old weights
is pretty substantial. The GGUF version of this model made by Bartowski
calls it 2.5.1 to differentiate it from the earlier version of the
same model.
2024-11-07 13:18:24 +01:00
Paul Gauthier
c84f2996ec copy 2024-11-06 20:13:38 -08:00
Paul Gauthier
add9b83d3b copy 2024-11-06 20:13:31 -08:00
Paul Gauthier
5411fb6fd4 Merge branch 'main' of github.com:Aider-AI/aider 2024-11-06 20:13:02 -08:00
paul-gauthier
49fc1b40e5 Merge pull request #2277 from lattwood/lattwood/bedrock_claude_feature_parity
Add Sonnet & Haiku ModelSettings for Bedrock
2024-11-06 09:03:18 -08:00
Logan Attwood
daef2eecdd Add Sonnet & Haiku ModelSettings for Bedrock 2024-11-06 12:28:24 -04:00
Paul Gauthier
1520422cc3 copy 2024-11-05 15:39:17 -08:00
Paul Gauthier
c7530085a6 set version to 0.62.2.dev 2024-11-05 12:41:44 -08:00
Paul Gauthier
bf43c567d8 version bump to 0.62.1 2024-11-05 12:40:17 -08:00
Paul Gauthier
b81f3e4f8d style: reorder chart canvas elements in blame.md 2024-11-05 12:11:14 -08:00
Paul Gauthier
97051b9d40 refactor: Replace GitTemporaryDirectory with ChdirTemporaryDirectory 2024-11-05 11:54:27 -08:00
Paul Gauthier
90730845de style: fix indentation in test_editblock.py 2024-11-05 11:43:04 -08:00
Paul Gauthier (aider)
f7c0c433c3 refactor: add mock for sendchat.simple_send_with_retries in test 2024-11-05 11:42:31 -08:00
Paul Gauthier
538752d0cf test: add mock for sendchat.simple_send_with_retries in editblock test 2024-11-05 11:42:30 -08:00
Paul Gauthier
c71a92ac84 fix: handle empty original content when creating new files 2024-11-05 09:14:01 -08:00
Paul Gauthier
85f23b3408 copy 2024-11-05 09:06:56 -08:00
Paul Gauthier
44cab0a4d7 refactor: update Claude model references to use 3.5-haiku-20241022 2024-11-05 09:01:35 -08:00
Paul Gauthier (aider)
33db8ee0c3 feat: enable repo map for Claude 3.5 Haiku models 2024-11-05 08:49:56 -08:00
Paul Gauthier
da4b3770c0 refactor: set use_repo_map=True for Claude 3.5 Haiku models 2024-11-05 08:49:53 -08:00
Paul Gauthier
12698998b9 feat: add verbose output for file processing in RepoMap 2024-11-05 08:48:06 -08:00
Paul Gauthier
6177856baf refactor: simplify issues script by removing redundant flag 2024-11-05 08:45:48 -08:00
Paul Gauthier (aider)
54b9c46b96 style: Fix whitespace in issues.py script 2024-11-05 07:04:15 -08:00
Paul Gauthier (aider)
2dd83e7dbe feat: exclude pull requests from unlabeled issues search 2024-11-05 07:04:11 -08:00
Paul Gauthier (aider)
17351e8f91 refactor: extract issue handling into dedicated functions 2024-11-05 07:02:24 -08:00
Paul Gauthier
e8c153f72f docs: add refactoring comments for issue handling functions 2024-11-05 07:02:22 -08:00
Paul Gauthier
7fc7ea6aba Merge branch 'main' into watch 2024-11-05 07:01:17 -08:00
Paul Gauthier (aider)
ddfd1276c5 style: Format issues.py with black linter 2024-11-05 06:58:44 -08:00
Paul Gauthier (aider)
46251c6a1c feat: add function to find unlabeled issues with paul-gauthier comments 2024-11-05 06:58:40 -08:00
Paul Gauthier
e699968be5 copy 2024-11-05 06:53:13 -08:00
Paul Gauthier
389b58b75b fix: remove premature return after disabling analytics 2024-11-05 06:52:50 -08:00
Paul Gauthier
a7cf34dea4 copy 2024-11-04 15:40:21 -08:00
Paul Gauthier
e601682706 updated blame 2024-11-04 13:00:42 -08:00
Paul Gauthier
55f16dc0b5 copy 2024-11-04 12:53:10 -08:00
Paul Gauthier
775011033f set version to 0.62.1.dev 2024-11-04 12:50:13 -08:00
Paul Gauthier
8ffe21a2dd version bump to 0.62.0 2024-11-04 12:48:44 -08:00
Paul Gauthier
73d63ef5ce copy 2024-11-04 12:37:21 -08:00
Paul Gauthier
e12b1a9184 copy 2024-11-04 12:36:46 -08:00
Paul Gauthier
d099a95b92 copy 2024-11-04 12:36:38 -08:00
Paul Gauthier
496ed90439 copy 2024-11-04 12:17:02 -08:00
Paul Gauthier (aider)
7883db1834 feat: add --haiku flag for claude-3-5-haiku model selection 2024-11-04 12:14:23 -08:00
Paul Gauthier
0cfc23b1a8 refactor: remove unused haiku formatting option 2024-11-04 12:14:22 -08:00
Paul Gauthier (aider)
d33104aec1 refactor: move haiku flag next to sonnet flag in args 2024-11-04 12:13:27 -08:00
Paul Gauthier
711b2a431c chore: add comment about sonnet flag placement 2024-11-04 12:13:25 -08:00
Paul Gauthier (aider)
09d21b5951 feat: add --haiku flag to format responses as haikus 2024-11-04 12:13:05 -08:00
Paul Gauthier
d9193387cc feat: add haiku command line argument placeholder 2024-11-04 12:13:04 -08:00
Paul Gauthier
d5330ae2f3 refactor: update highlight model constant in leaderboard chart 2024-11-04 12:12:32 -08:00
Paul Gauthier (aider)
571c1b47b5 refactor: extract Haiku model name to constant 2024-11-04 12:11:48 -08:00
Paul Gauthier (aider)
0c9d4dd123 fix: update Chart.js scales config and add null checks for labels 2024-11-04 12:09:47 -08:00
Paul Gauthier (aider)
7d79408683 feat: add distinct color for 3.5 Haiku models in leaderboard chart 2024-11-04 12:08:05 -08:00
Paul Gauthier
e6d4c3558b add 3.5 haiku to leaderboard 2024-11-04 11:40:37 -08:00
Paul Gauthier
3be2109964 fix: update Claude 3.5 Haiku models to use diff mode instead of whole 2024-11-04 11:33:40 -08:00
Paul Gauthier
ce37ff26b5 refactor: remove redundant examples_as_sys_msg flag from Claude 3.5 models 2024-11-04 11:32:41 -08:00
Paul Gauthier
03bbdb010f add haiku metadata 2024-11-04 11:18:55 -08:00
Paul Gauthier (aider)
0bde1da42c feat: add Claude 3.5 Haiku model and provider variants 2024-11-04 10:46:55 -08:00
Paul Gauthier
987cb3bca9 feat: add claude-3-haiku model configuration 2024-11-04 10:46:54 -08:00
Paul Gauthier
0b11024967 copy 2024-11-04 10:35:37 -08:00
Paul Gauthier (aider)
dfaaedb466 style: remove empty line at start of main.py 2024-11-04 10:34:27 -08:00
Paul Gauthier (aider)
8bc0d5544d feat: add --apply-clipboard-edits switch for direct clipboard editing 2024-11-04 10:34:21 -08:00
Paul Gauthier
c67e63bc09 feat: add clipboard edit mode via --apply-clipboard-edits flag 2024-11-04 10:34:19 -08:00
Paul Gauthier
129f5fae76 cleanup 2024-11-04 09:09:45 -08:00
Paul Gauthier
966a613ffe fix: handle non-existent files in EditBlockCoder #2233 2024-11-04 09:08:00 -08:00
Paul Gauthier (aider)
96ad107c19 style: add newline before error message in io.py 2024-11-04 09:05:28 -08:00
Paul Gauthier (aider)
ebdc126b00 feat: add traceback printing for file read errors 2024-11-04 09:05:24 -08:00
Paul Gauthier
5e1be966ed chore: add comment about printing traceback stack in error handling 2024-11-04 09:05:23 -08:00
Chad Phillips
8801fda972 formatting fixes 2024-11-04 10:10:37 -06:00
malkoG
a8a3e2401b Update languages.md for dart support 2024-11-04 13:22:22 +09:00
malkoG
a7f59a2e2b Add tags.scm for dart 2024-11-04 12:38:27 +09:00
Chad Phillips
d8e9da35d6 add /editor command
Opens an editor for constructing a user prompt, using the currently defined chat mode.

The editor is determined as follows:

Look for the following environment variables, in order:

1. AIDER_EDITOR
2. VISUAL
3. EDITOR

If none of these are defined, use the following defaults:

Windows: notepad
OS X: vim
*nix: vi

If an editor is not found, a RuntimeError is raised.

Any arguments passed after the /editor command are inserted as content.

The temporary file used for editing has an .md extension, which can be leveraged for syntax highlighting.

NOTE: The editor used MUST block the process until the editor is closed -- the default editors all do this.
2024-11-03 20:18:57 -05:00
Paul Gauthier
b57ad6929c Merge branch 'main' into watch 2024-11-01 11:27:29 -07:00
Paul Gauthier
0022c1a67e copy 2024-11-01 11:26:39 -07:00
Paul Gauthier
6a0380b8c0 copy 2024-11-01 09:46:27 -07:00
Paul Gauthier
305b4fee87 set version to 0.61.1.dev 2024-11-01 09:40:02 -07:00
Paul Gauthier
9e18fc55d3 version bump to 0.61.0 2024-11-01 09:38:46 -07:00
Paul Gauthier
ebc9a30cc6 copy 2024-11-01 09:23:37 -07:00
Paul Gauthier
f53f5927df Show friendly API error messages 2024-11-01 09:20:31 -07:00
Paul Gauthier (aider)
78a8d19ac5 fix: pass exception objects directly to check_and_open_urls 2024-11-01 09:12:50 -07:00
Paul Gauthier
bfa9dce1e0 refactor: improve API error messages and display format 2024-11-01 09:12:49 -07:00
Paul Gauthier (aider)
3b2f1f1e66 style: format long error messages with line breaks 2024-11-01 09:09:03 -07:00
Paul Gauthier (aider)
b2bcca967f refactor: update check_and_open_urls to handle exceptions with friendly messages 2024-11-01 09:08:57 -07:00
Paul Gauthier
929aeb22bf refactor: Update check_and_open_urls to handle exceptions with user-friendly messages 2024-11-01 09:08:56 -07:00
Paul Gauthier
66ad186edd start /save commands with /drop 2024-11-01 09:04:55 -07:00
Paul Gauthier
c098354a67 copy 2024-11-01 09:03:44 -07:00
Paul Gauthier (aider)
d67d319b31 style: fix whitespace and line spacing issues 2024-11-01 08:12:17 -07:00
Paul Gauthier (aider)
93639039d4 feat: disable spinner when stdout is not a tty 2024-11-01 08:12:13 -07:00
Paul Gauthier
789535cb85 feat: disable spinner animation when stdout is not a tty 2024-11-01 08:12:11 -07:00
Paul Gauthier
d8e1e823e7 update deps with chained constraints 2024-10-31 16:04:37 -07:00
Paul Gauthier (aider)
5b9fe6fee0 refactor: convert pip-compile script to use loop for requirements compilation 2024-10-31 16:03:12 -07:00
Paul Gauthier (aider)
91bc8cddf3 fix: add dependency constraints between requirements files 2024-10-31 16:02:33 -07:00
Paul Gauthier
392162ae84 copy 2024-10-31 15:33:17 -07:00
Paul Gauthier
0c4e4a123a pin pillow<11 to avoid regressing streamlit to ancient 1.22 2024-10-31 15:31:58 -07:00
Paul Gauthier (aider)
27711010a0 refactor: update --gui/--browser to use BooleanOptionalAction 2024-10-31 15:01:29 -07:00
Paul Gauthier
401967c27f refactor: convert browser flag to boolean argument 2024-10-31 15:01:26 -07:00
Paul Gauthier (aider)
d1b25b9a72 fix: remove duplicate test_cmd_read_only_with_image_file method 2024-10-31 15:00:21 -07:00
Paul Gauthier
df478e1f8f copy 2024-10-31 14:59:52 -07:00
Paul Gauthier (aider)
a459f0e130 test: add test for read-only command with image files 2024-10-31 14:59:46 -07:00
Paul Gauthier (aider)
66b6788990 test: add test for image file handling in read command 2024-10-31 14:59:22 -07:00
Paul Gauthier (aider)
624f9122ab style: fix whitespace in commands.py 2024-10-31 14:58:29 -07:00
Paul Gauthier (aider)
704350286c feat: allow /read command to work with images for vision models 2024-10-31 14:58:23 -07:00
Paul Gauthier (aider)
ec40ff5987 feat: prevent adding image files with /read command 2024-10-31 14:57:44 -07:00
Paul Gauthier
af7aaad903 fix: handle RecursionError during tree traversal in linter 2024-10-31 14:55:54 -07:00
Paul Gauthier
3794cf941f feat: add support for claude-3-5-sonnet-latest model 2024-10-31 14:53:50 -07:00
Paul Gauthier
72c1f25005 refactor: Move StringIO import to top of file 2024-10-31 14:49:16 -07:00
Paul Gauthier (aider)
c13536e641 style: move rich.columns import to top of file 2024-10-31 14:48:12 -07:00
Paul Gauthier (aider)
7a9988c060 style: fix linting issues in io.py 2024-10-31 14:45:35 -07:00
Paul Gauthier (aider)
b9939d4bd9 refactor: improve file list display with section headers 2024-10-31 14:45:31 -07:00
Paul Gauthier (aider)
b71a3148cf style: fix import order in io.py 2024-10-31 14:43:29 -07:00
Paul Gauthier (aider)
42abdb0a41 feat: add compact file listing using rich Columns when pretty=True 2024-10-31 14:43:25 -07:00
Paul Gauthier
4c39e92773 copy 2024-10-31 14:39:27 -07:00
Paul Gauthier
b7f7204c4e copy 2024-10-31 14:29:53 -07:00
Paul Gauthier
550d274941 copy 2024-10-31 14:23:18 -07:00
Paul Gauthier
5a974483b9 Merge branch 'main' into watch 2024-10-31 14:19:37 -07:00
Paul Gauthier (aider)
8f73c15f48 feat: skip analytics update in check mode 2024-10-31 14:16:34 -07:00
Paul Gauthier
17330e53c3 refactor: Improve error handling and URL processing in chat functionality 2024-10-31 14:13:36 -07:00
Paul Gauthier (aider)
3fcd79e165 style: fix line length and comment formatting 2024-10-31 14:03:33 -07:00
Paul Gauthier (aider)
750b12282f refactor: strip trailing punctuation from URLs before displaying 2024-10-31 14:03:27 -07:00
Paul Gauthier
94c5ff2fd2 refactor: simplify URL pattern matching and cleanup commented code 2024-10-31 14:03:26 -07:00
Paul Gauthier
85ad2826da test: add debug dump of URL pattern regex 2024-10-31 14:02:05 -07:00
Paul Gauthier
15c62e3e43 fix: improve URL pattern to handle trailing commas in links 2024-10-31 14:01:41 -07:00
Paul Gauthier (aider)
fea7134064 style: fix comment spacing and remove commented code 2024-10-31 14:01:28 -07:00
Paul Gauthier (aider)
da706d9eb8 fix: update URL regex to strip trailing punctuation 2024-10-31 14:01:21 -07:00
Paul Gauthier
9a37c0491d refactor: improve URL handling and error reporting in base coder 2024-10-31 14:01:20 -07:00
Paul Gauthier (aider)
1d3d6a589f style: remove unused Optional import 2024-10-31 13:52:50 -07:00
Paul Gauthier (aider)
c5a439e4e8 style: sort imports alphabetically in base_coder.py 2024-10-31 13:52:41 -07:00
Paul Gauthier (aider)
2b7584b651 refactor: extract URL checking logic into separate method 2024-10-31 13:52:37 -07:00
Paul Gauthier (aider)
1ef60b5a40 refactor: add URL checking function with browser open option 2024-10-31 13:52:24 -07:00
Paul Gauthier
b79321da51 chore: add TODO comments for URL handling refactoring 2024-10-31 13:52:22 -07:00
Paul Gauthier (aider)
6829b29ef4 feat: add error base class hierarchy to retry exception messages 2024-10-31 13:50:12 -07:00
Paul Gauthier
a9c0d20347 chore: add comment about error base class inspection 2024-10-31 13:50:11 -07:00
Paul Gauthier (aider)
25a906950c refactor: move webbrowser import to top of file 2024-10-31 13:48:28 -07:00
Paul Gauthier
740534dcff refactor: Move webbrowser import to top of file 2024-10-31 13:48:27 -07:00
Paul Gauthier (aider)
de65d86122 style: fix string quotes and line wrapping in error URL handling 2024-10-31 13:48:08 -07:00
Paul Gauthier (aider)
98bf9bd26d feat: add URL detection and viewer for error messages 2024-10-31 13:48:01 -07:00
Paul Gauthier
ade615c445 chore: Add TODO comment for URL handling in error messages 2024-10-31 13:48:00 -07:00
Paul Gauthier
d959e1c60d test: fix analytics disable test assertion for better clarity 2024-10-31 13:31:43 -07:00
Paul Gauthier (aider)
8d2f66fe34 test: add temp_data_dir fixture to all analytics tests 2024-10-31 13:28:31 -07:00
Paul Gauthier (aider)
66dc8dbccd style: remove unused MagicMock import 2024-10-31 13:22:59 -07:00
Paul Gauthier (aider)
b228bcab8c style: Fix linting issues in test_analytics.py 2024-10-31 13:22:50 -07:00
Paul Gauthier (aider)
ccbf1482c1 test: add comprehensive test suite for Analytics class 2024-10-31 13:22:47 -07:00
Paul Gauthier
f9a0946472 test: add basic analytics test suite 2024-10-31 13:22:45 -07:00
Paul Gauthier
faa80b7699 updated deps 2024-10-31 13:21:56 -07:00
Paul Gauthier
1eb2c724a5 copy 2024-10-31 13:15:33 -07:00
Paul Gauthier
c43e7f998e copy 2024-10-31 13:11:00 -07:00
Paul Gauthier
3e2454b84b cleanup 2024-10-31 11:49:17 -07:00
Paul Gauthier
2817766cf5 cleanup 2024-10-31 11:44:24 -07:00
Paul Gauthier
ba7656bc1c cleanup 2024-10-31 11:37:18 -07:00
Paul Gauthier
c14392a35a copy 2024-10-31 11:33:27 -07:00
Paul Gauthier
6bfb258473 copy 2024-10-31 11:31:32 -07:00
Paul Gauthier
1e872599fd copy 2024-10-31 11:02:04 -07:00
Paul Gauthier
c08b7f9c22 Merge branch 'main' into mixpanel 2024-10-31 10:09:36 -07:00
Paul Gauthier
6e4ccf8715 copy 2024-10-31 10:09:33 -07:00
Paul Gauthier (aider)
e4913669d4 refactor: simplify event method to use main_model attributes 2024-10-31 10:08:43 -07:00
Paul Gauthier
8e098752bd refactor: Use main_model attributes for weak and editor models in analytics 2024-10-31 10:08:41 -07:00
Paul Gauthier (aider)
6867dab89c style: remove trailing whitespace in analytics.py 2024-10-31 10:06:52 -07:00
Paul Gauthier (aider)
09a9fac91e refactor: extract model redaction logic and add model params 2024-10-31 10:05:10 -07:00
Paul Gauthier
2fd1681fab refactor: add weak_model and editor_model args to analytics event method 2024-10-31 10:05:08 -07:00
Paul Gauthier
ece91dc724 copy 2024-10-31 09:57:22 -07:00
Paul Gauthier
01bf154151 copy 2024-10-31 09:53:04 -07:00
Paul Gauthier
b5916981b3 copy 2024-10-30 20:19:47 -07:00
Paul Gauthier
a68b87272b copy 2024-10-30 20:19:08 -07:00
Paul Gauthier (aider)
88b55df1c6 chore: add privacy policy to update-docs script 2024-10-30 20:18:41 -07:00
Paul Gauthier (aider)
676c017eb1 feat: add git-based last updated date to privacy policy 2024-10-30 20:17:53 -07:00
Paul Gauthier
139b8a2d4a docs: add privacy policy document 2024-10-30 20:17:15 -07:00
Paul Gauthier
24c68928d6 feat: Add analytics tracking for model warnings 2024-10-30 14:34:27 -07:00
Paul Gauthier
f957111141 feat: Add model info manager import to analytics module 2024-10-30 14:30:14 -07:00
Paul Gauthier
e94e60b1d2 refactor: improve model name redaction in analytics and model info handling 2024-10-30 14:29:29 -07:00
Paul Gauthier (aider)
a565a63436 style: Fix import formatting in test_models.py 2024-10-30 13:21:47 -07:00
Paul Gauthier (aider)
a045bda171 refactor: update test to use ModelInfoManager instead of get_model_info 2024-10-30 13:21:43 -07:00
Paul Gauthier (aider)
a3d78e0944 style: split long URL string constant into multiple lines 2024-10-30 13:21:21 -07:00
Paul Gauthier
8082cbed98 refactor: rename get_model_flexible to get_model_from_cached_json_db 2024-10-30 13:21:19 -07:00
Paul Gauthier (aider)
aba8b5d00a style: fix linting issues and whitespace in models.py 2024-10-30 13:17:54 -07:00
Paul Gauthier (aider)
3d5a4d9303 refactor: encapsulate model info functionality into ModelInfoManager class 2024-10-30 13:17:49 -07:00
Paul Gauthier
a899b0e27e refactor: Extract model info handling into a dedicated class 2024-10-30 13:17:47 -07:00
Paul Gauthier
267872b7e4 feat: add opt-in analytics collection with privacy notice 2024-10-30 13:15:57 -07:00
Paul Gauthier (aider)
bd59a8debf refactor: extract analytics disable logic into dedicated method 2024-10-30 12:25:18 -07:00
Paul Gauthier
c0e137889c style: Update analytics refactoring comment with method name 2024-10-30 12:25:17 -07:00
Paul Gauthier
5b84b901b2 chore: add TODO comment for analytics refactoring 2024-10-30 12:24:39 -07:00
Paul Gauthier (aider)
059883abf7 feat: add asked_opt_in tracking to analytics 2024-10-30 12:17:17 -07:00
Paul Gauthier
0b622a6fd7 chore: add comment for analytics opt-in tracking implementation 2024-10-30 12:17:15 -07:00
Paul Gauthier
97989dd51a Merge branch 'main' into mixpanel 2024-10-30 12:06:38 -07:00
Paul Gauthier (aider)
d81c421bfe test: mock webbrowser.open in test setup 2024-10-30 12:04:43 -07:00
Paul Gauthier (aider)
bce586f510 fix: remove unused webbrowser import in test file 2024-10-30 12:00:12 -07:00
Paul Gauthier (aider)
a70b364842 style: fix import order and quote style in test file 2024-10-30 11:59:52 -07:00
Paul Gauthier (aider)
920e8da57c test: mock webbrowser.open in git index version test 2024-10-30 11:59:48 -07:00
Paul Gauthier (aider)
71a8b286dc style: fix linting issues in test_sanity_check_repo.py 2024-10-30 11:59:25 -07:00
Paul Gauthier (aider)
ee4decc50b fix: add missing urls import in test_sanity_check_repo.py 2024-10-30 11:59:21 -07:00
Paul Gauthier (aider)
63330aa833 style: fix line wrapping in test file 2024-10-30 11:59:08 -07:00
Paul Gauthier (aider)
15a0eb976f test: update git index version test to check confirm_ask call 2024-10-30 11:59:04 -07:00
Paul Gauthier
4f52ad385a copy 2024-10-30 11:52:09 -07:00
Paul Gauthier
cd1496f91b copy 2024-10-30 11:51:49 -07:00
Paul Gauthier (aider)
31babf39cd style: fix comment spacing in sanity_check_repo function 2024-10-30 11:42:50 -07:00
Paul Gauthier (aider)
fe3dbba1d9 feat: add browser URL launch with user confirmation prompt 2024-10-30 11:42:46 -07:00
Paul Gauthier
763724ed4e docs: add comment about prompting user for URL opening 2024-10-30 11:42:44 -07:00
Paul Gauthier
9e0e68caf9 copy 2024-10-30 11:41:39 -07:00
Paul Gauthier
52f697e513 style: remove extra blank line before main block 2024-10-30 11:41:11 -07:00
Paul Gauthier (aider)
aeca62bcf6 fix: remove unused import of urls module 2024-10-30 11:41:04 -07:00
Paul Gauthier
7e574bc214 refactor: improve documentation URL handling and error messages 2024-10-30 11:40:56 -07:00
Paul Gauthier (aider)
e9beb1336c style: fix line length in model warnings confirmation prompt 2024-10-30 11:34:24 -07:00
Paul Gauthier (aider)
4ac8386313 feat: add browser launch for model warnings documentation 2024-10-30 11:34:19 -07:00
Paul Gauthier
f0233455d2 feat: update model warning prompt to offer documentation link 2024-10-30 11:34:18 -07:00
Paul Gauthier
5c28dd039c pip compile 2024-10-30 09:41:57 -07:00
Paul Gauthier
26d1ab7a5f copy 2024-10-30 09:40:54 -07:00
Paul Gauthier
068fb38a5d Merge branch 'main' into mixpanel 2024-10-30 09:40:01 -07:00
Paul Gauthier
53e7eba00b copy 2024-10-30 06:39:48 -07:00
Paul Gauthier
854d908fe0 refactor: improve chat history file error handling and messaging 2024-10-30 06:37:59 -07:00
Paul Gauthier
ea3359fb4b test: adjust warning count assertion in model test 2024-10-30 06:33:31 -07:00
Paul Gauthier (aider)
55a2ba4bd6 style: Fix comment formatting in test_models.py 2024-10-30 06:32:22 -07:00
Paul Gauthier (aider)
20ca9c84c7 test: add warning message debug print in model test 2024-10-30 06:32:18 -07:00
Paul Gauthier
0d86124b15 test: add comment about tool warning args inspection 2024-10-30 06:32:17 -07:00
Paul Gauthier
554fa98c48 fix: simplify version check for dev mode 2024-10-30 06:30:11 -07:00
Paul Gauthier (aider)
eb92fa4f88 fix: handle TypeError when checking __version__ for dev mode 2024-10-30 06:26:50 -07:00
Paul Gauthier
0424e4b00a refactor: improve SQLite error handling and logging in tags cache 2024-10-29 15:09:22 -07:00
Paul Gauthier (aider)
adca062081 feat: improve SQLite error handling with original exception details 2024-10-29 15:05:16 -07:00
Paul Gauthier
ef0fcb8f38 refactor: Improve SQLite cache error handling and import organization 2024-10-29 15:04:00 -07:00
Paul Gauthier (aider)
0feed0047c style: fix whitespace and formatting in repomap.py 2024-10-29 14:59:55 -07:00
Paul Gauthier (aider)
7f027ff6e5 feat: add auto-recovery for corrupted tags cache 2024-10-29 14:59:50 -07:00
Paul Gauthier (aider)
e25a46c892 fix: wrap TAGS_CACHE length check in try/except block for SQLite errors 2024-10-29 14:58:00 -07:00
Paul Gauthier (aider)
68916b1186 feat: add error handling for SQLite tags cache operations 2024-10-29 14:55:43 -07:00
Paul Gauthier
e9771588e4 copy 2024-10-29 14:48:39 -07:00
Paul Gauthier
e1d55c82b1 refactor: Improve edit handling with dry run and path resolution 2024-10-29 14:31:12 -07:00
Paul Gauthier (aider)
5b6be29c1c chore: remove obsolete comment about path variable 2024-10-29 14:28:39 -07:00
Paul Gauthier
28d9f6f8da refactor: add dry run mode to apply_edits method 2024-10-29 14:28:38 -07:00
Paul Gauthier (aider)
3ccae4eff7 style: fix line length in test_commands.py 2024-10-29 14:19:53 -07:00
Paul Gauthier (aider)
3ad240a10e fix: normalize path separators in save/load tests for Windows compatibility 2024-10-29 14:19:47 -07:00
Paul Gauthier
87a31a583a refactor: remove unused comment in EditBlockCoder 2024-10-29 14:11:13 -07:00
Paul Gauthier (aider)
7553104433 refactor: handle updated edits array returned from apply_edits 2024-10-29 14:10:21 -07:00
Paul Gauthier
f9604633e6 fix: handle updated edits array in apply_edits return value 2024-10-29 14:10:19 -07:00
Paul Gauthier (aider)
eb9a73bdb0 fix: strip whitespace from file paths before resolving in test commands 2024-10-29 14:04:19 -07:00
Paul Gauthier (aider)
d75e75190d style: Fix regex string formatting in test commands 2024-10-29 14:03:46 -07:00
Paul Gauthier (aider)
94a49e601c refactor: use regex to normalize /add command spaces in tests 2024-10-29 14:03:40 -07:00
Paul Gauthier (aider)
3df3d86295 style: fix linting issues in test_commands.py 2024-10-29 14:02:43 -07:00
Paul Gauthier (aider)
63f8979f2b fix: normalize whitespace in command text assertions 2024-10-29 14:02:37 -07:00
Paul Gauthier
ad94e49ef5 test: fix failing test cases for save and load commands 2024-10-29 14:02:35 -07:00
Paul Gauthier
b40ff2a601 fix: improve o1 model detection with startswith check 2024-10-29 14:00:56 -07:00
Paul Gauthier
a4be01b474 refactor: move --load command execution before message processing 2024-10-29 13:59:41 -07:00
Paul Gauthier
c5dc44a73f style: simplify command execution output message 2024-10-29 13:59:04 -07:00
Paul Gauthier (aider)
358cbc9388 feat: add filename autocompletion to /load and /save commands 2024-10-29 13:58:25 -07:00
Paul Gauthier
2e5fa9dea4 style: align /add commands in history file for better readability 2024-10-29 13:58:23 -07:00
Paul Gauthier
717592463e feat: add --load option to execute commands from file on launch 2024-10-29 13:54:42 -07:00
Paul Gauthier (aider)
347a9f2a6d feat: add --load argument to execute commands from file 2024-10-29 13:53:19 -07:00
Paul Gauthier
d288122fab chore: add comment for load command implementation 2024-10-29 13:53:17 -07:00
Paul Gauthier (aider)
d1cf3d4600 refactor: conditionally set cursor shape only in vi mode 2024-10-29 13:50:40 -07:00
Paul Gauthier
5188872791 style: add comment about vi mode cursor config 2024-10-29 13:50:38 -07:00
Paul Gauthier
a57a06e8c7 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-29 13:49:50 -07:00
Paul Gauthier (aider)
347ad34038 fix: update file path comparison in commands test to handle macOS prefix 2024-10-29 13:48:16 -07:00
Paul Gauthier (aider)
ccdd333ba3 fix: update test to use os.path.samefile for path comparison 2024-10-29 13:45:03 -07:00
Paul Gauthier (aider)
56f3220d4c fix: handle macOS /private/ prefix in file path tests 2024-10-29 13:21:31 -07:00
Paul Gauthier (aider)
26a85c2047 style: fix line length in test_commands.py 2024-10-29 13:20:49 -07:00
Paul Gauthier (aider)
f800ce1e5a test: use os.path.samefile for file path comparison in save/load test 2024-10-29 13:20:44 -07:00
Paul Gauthier
d4103cc271 chore: Remove unused comment in test file 2024-10-29 13:20:42 -07:00
Paul Gauthier (aider)
c3ba3b6f48 style: fix whitespace and comment formatting in test_commands.py 2024-10-29 13:19:15 -07:00
Paul Gauthier (aider)
be54df4084 refactor: improve path comparison in command tests using os.path.samefile 2024-10-29 13:19:09 -07:00
Paul Gauthier
d06c6f8557 style: improve clarity of comment in test_commands.py 2024-10-29 13:18:53 -07:00
Paul Gauthier
a876561ea0 test: add comment about parsing text in session file test 2024-10-29 13:17:50 -07:00
Paul Gauthier (aider)
6dc0b8d853 fix: use absolute paths for read-only files outside repo root 2024-10-29 13:14:37 -07:00
Paul Gauthier (aider)
460311d49e style: fix line continuation formatting in test file 2024-10-29 13:11:50 -07:00
Paul Gauthier (aider)
94396070e8 test: add test for saving and loading multiple external files 2024-10-29 13:11:44 -07:00
Paul Gauthier (aider)
4a3cb8dc95 fix: use platform-agnostic paths in test_commands.py 2024-10-29 13:11:00 -07:00
Paul Gauthier
f9005451fa test: add comment about Windows path separator issue in test_commands.py 2024-10-29 13:10:58 -07:00
paul-gauthier
16e292b1fd Merge pull request #2180 from kAIto47802/fix-o1-system-prompt 2024-10-29 13:03:35 -07:00
Paul Gauthier (aider)
7d37793765 style: fix linting issues by removing extra blank line 2024-10-29 12:54:12 -07:00
Paul Gauthier (aider)
9e9c162a16 style: fix indentation in test_cmd_save_and_load_with_external_file 2024-10-29 12:54:05 -07:00
Paul Gauthier (aider)
8d6db81a40 style: fix linting issues in test_commands.py 2024-10-29 12:53:27 -07:00
Paul Gauthier (aider)
425bd8932b test: add save/load test with external read-only file 2024-10-29 12:53:22 -07:00
Paul Gauthier
38820701be test: add comment for read-only file test case 2024-10-29 12:53:20 -07:00
Paul Gauthier
1bc74676ff copy 2024-10-29 12:49:16 -07:00
Paul Gauthier (aider)
0c37f002c9 style: remove extra newlines and fix trailing comma 2024-10-29 12:48:21 -07:00
Paul Gauthier (aider)
18c41b6128 refactor: move test_cmd_save_and_load to test_commands.py 2024-10-29 12:48:11 -07:00
Paul Gauthier
5876af4e94 test: add test for cmd_save and cmd_load functionality 2024-10-29 12:48:08 -07:00
Paul Gauthier (aider)
e1d145013a style: remove trailing newline in test_commands.py 2024-10-29 12:46:37 -07:00
Paul Gauthier (aider)
143eeff4da test: add tests for cmd_save and cmd_load commands 2024-10-29 12:46:31 -07:00
Paul Gauthier
3a7e4bac34 test: add TODO comment for cmd_save and cmd_load test coverage 2024-10-29 12:46:29 -07:00
Paul Gauthier (aider)
f5ca162576 style: fix whitespace and comment formatting 2024-10-29 12:43:56 -07:00
Paul Gauthier (aider)
dbefa6b010 feat: add /save command to store chat session file list 2024-10-29 12:43:51 -07:00
Paul Gauthier
79cdff6163 feat: add /save command to persist added files for /load 2024-10-29 12:43:49 -07:00
Paul Gauthier (aider)
b111fc357c fix: use IO encoding and handle decode errors in cmd_load 2024-10-29 12:42:33 -07:00
Paul Gauthier
2af48e159c feat: add encoding hint for file loading in commands 2024-10-29 12:42:31 -07:00
Paul Gauthier (aider)
6cec44e402 style: fix string quotes and whitespace in commands.py 2024-10-29 12:41:10 -07:00
Paul Gauthier (aider)
fc6c01a9a5 feat: add command to load and execute commands from file 2024-10-29 12:41:01 -07:00
Paul Gauthier
01439875af feat: add comment for future cmd_load implementation 2024-10-29 12:40:57 -07:00
kAIto47802
fcdf998fac Fix o1 settings 2024-10-29 08:47:24 +09:00
Paul Gauthier
34f34879c9 Merge branch 'main' into watch 2024-10-28 15:13:20 -07:00
Paul Gauthier
ed4ad45e3d copy 2024-10-28 15:12:06 -07:00
Paul Gauthier
907c1dbe2b refactor: split error and retry messages in simple_send_with_retries 2024-10-28 15:10:27 -07:00
Paul Gauthier (aider)
3baad86afd refactor: consolidate error and retry messages into single print statement 2024-10-28 15:09:22 -07:00
Paul Gauthier (aider)
0351924628 test: update print call count assertions in sendchat tests 2024-10-28 15:09:11 -07:00
Paul Gauthier
29250f82ed test: fix print call count assertions in sendchat tests 2024-10-28 15:07:50 -07:00
Paul Gauthier
a819bf1d64 test: fix assertion errors in sendchat retry tests 2024-10-28 15:07:11 -07:00
Paul Gauthier (aider)
bc515cf74a refactor: add retry loop to simple_send_with_retries function 2024-10-28 15:05:07 -07:00
Paul Gauthier
f9c45432e6 refactor: Move retry logic from base_coder to sendchat module 2024-10-28 15:05:06 -07:00
Paul Gauthier
54d55c857b refactor: update retry exceptions to use openai instead of litellm 2024-10-28 14:40:42 -07:00
Paul Gauthier
8e2a4b47d6 fix: update litellm exception imports and error handling 2024-10-28 14:29:42 -07:00
Paul Gauthier (aider)
513f06be46 refactor: move retry_exceptions import to top of test file 2024-10-28 14:28:49 -07:00
Paul Gauthier
0fb79917ff test: add test for retry_exceptions function call 2024-10-28 14:28:48 -07:00
Paul Gauthier (aider)
cd133f95ee style: fix linting issues with whitespace and line breaks 2024-10-28 14:27:26 -07:00
Paul Gauthier (aider)
3d66b53791 test: add basic test for retry_exceptions function 2024-10-28 14:27:20 -07:00
Paul Gauthier
bf63e7045b refactor: simplify litellm exception imports 2024-10-28 14:27:19 -07:00
Paul Gauthier
5c4b75909e refac 2024-10-26 07:31:28 -07:00
Paul Gauthier (aider)
41f126cad7 chore: disable verbose mode in watch.py 2024-10-25 16:23:45 -07:00
Paul Gauthier
c26d7d23b5 fix: improve regex pattern for AI comment detection 2024-10-25 16:23:44 -07:00
Paul Gauthier (aider)
4298ae00a9 style: fix linting issue in watch.py comment spacing 2024-10-25 16:21:25 -07:00
Paul Gauthier (aider)
47296e4294 fix: correct regex pattern for AI comment detection 2024-10-25 16:21:21 -07:00
Paul Gauthier
f6daab0728 feat: add support for inline AI comments in code files 2024-10-25 16:21:20 -07:00
Paul Gauthier (aider)
25dd9f1f35 style: fix linting issues and whitespace in watch.py 2024-10-25 16:20:57 -07:00
Paul Gauthier (aider)
130aedc474 fix: update regex pattern to match standalone "#ai" comments 2024-10-25 16:20:53 -07:00
Paul Gauthier
e958f40bd9 refactor: simplify file change processing and enable verbose mode 2024-10-25 16:20:52 -07:00
Paul Gauthier (aider)
ed2a2d7dc3 style: fix linting issues and format code 2024-10-25 16:10:56 -07:00
Paul Gauthier (aider)
0890b32425 refactor: move file change processing logic from io.py to watch.py 2024-10-25 16:10:49 -07:00
Paul Gauthier
2e5981ecb3 fix: extract AI comment content without prefix in file watcher 2024-10-25 16:10:48 -07:00
Paul Gauthier (aider)
ec00bb988c style: format nested list comprehension for better readability 2024-10-25 16:09:17 -07:00
Paul Gauthier (aider)
14a62586cc feat: add special handling for comments containing exclamation marks 2024-10-25 16:09:13 -07:00
Paul Gauthier
a8fe84acc7 fix: update changed_files handling to use dict keys instead of direct list 2024-10-25 16:09:12 -07:00
Paul Gauthier (aider)
144ba783a8 style: fix linting issues in watch.py 2024-10-25 16:05:55 -07:00
Paul Gauthier (aider)
8d81ef811e refactor: return full match including prefix in get_ai_comment function 2024-10-25 16:05:51 -07:00
Paul Gauthier
3d8ec25a33 fix: update AI comment extraction to include full match 2024-10-25 16:05:50 -07:00
Paul Gauthier (aider)
77f636f949 style: fix linting issues in watch.py 2024-10-25 16:03:42 -07:00
Paul Gauthier (aider)
aa86f02b1a feat: collect all AI comments from files instead of just first one 2024-10-25 16:03:39 -07:00
Paul Gauthier
05daab24a2 fix: update regex pattern for AI comment detection 2024-10-25 16:03:37 -07:00
Paul Gauthier (aider)
0960663811 style: add spacing between functions in watch.py 2024-10-25 16:00:59 -07:00
Paul Gauthier (aider)
150cc56b35 feat: add AI comment extraction from changed files 2024-10-25 16:00:55 -07:00
Paul Gauthier
7a9091fcae refactor: disable verbose mode and add comment for changed_file handling 2024-10-25 16:00:53 -07:00
Paul Gauthier (aider)
e6215d969d style: fix linting issues in watch.py 2024-10-25 15:58:45 -07:00
Paul Gauthier (aider)
9f1b8347f5 refactor: simplify regex pattern for matching AI comments 2024-10-25 15:58:41 -07:00
Paul Gauthier
311e1568d9 feat: improve file watching with verbose debug output and error handling 2024-10-25 15:58:39 -07:00
Paul Gauthier
c2dadd8054 Merge branch 'main' into watch 2024-10-25 15:54:31 -07:00
Paul Gauthier
e2dff0a74b #2120 2024-10-25 15:47:30 -07:00
Paul Gauthier
88bdfd6548 cleanup 2024-10-25 15:11:02 -07:00
Paul Gauthier (aider)
70edb62a6b feat: pass encoding parameter to watch_source_files function 2024-10-25 13:24:06 -07:00
Paul Gauthier
6c2e0ccce5 refactor: remove interrupted_partial_input parameter from InputOutput class 2024-10-25 13:24:05 -07:00
Paul Gauthier (aider)
fc6e0dfa65 style: fix linting issues in watch.py 2024-10-25 13:23:49 -07:00
Paul Gauthier (aider)
54aebb7d98 feat: add encoding param to watch_source_files with error handling 2024-10-25 13:23:46 -07:00
Paul Gauthier (aider)
378c67d51f fix: update regex pattern to use word boundary instead of word character 2024-10-25 13:22:38 -07:00
Paul Gauthier (aider)
d535035bdd style: fix string quotes in regex pattern 2024-10-25 13:22:17 -07:00
Paul Gauthier (aider)
43790db48e feat: add AI marker detection in source file watcher 2024-10-25 13:22:13 -07:00
Paul Gauthier
d957adf062 refactor: remove debug dump() call from watch_source_files function 2024-10-25 13:22:11 -07:00
Paul Gauthier (aider)
ff8f3eb8c2 style: fix linting issues in io.py 2024-10-25 13:17:58 -07:00
Paul Gauthier (aider)
88c54c918c feat: store partial input when interrupting prompt 2024-10-25 13:17:54 -07:00
Paul Gauthier
1261a335f4 refactor: improve file change handling in input loop 2024-10-25 13:17:53 -07:00
Paul Gauthier (aider)
7587d76fd1 refactor: simplify file watcher thread cleanup by removing timeout 2024-10-25 12:59:09 -07:00
Paul Gauthier
8e81300f37 fix: improve error handling in input interruption flow 2024-10-25 12:59:07 -07:00
Paul Gauthier (aider)
a999020038 style: fix line length in watch_files function 2024-10-25 12:56:25 -07:00
Paul Gauthier (aider)
bc4664d62c feat: pass gitignore path to watch_source_files function 2024-10-25 12:56:20 -07:00
Paul Gauthier
6a1754aa6a feat: add file change monitoring with gitignore support 2024-10-25 12:56:19 -07:00
Paul Gauthier (aider)
da7bb312c2 style: remove extra blank lines in io.py 2024-10-25 12:52:45 -07:00
Paul Gauthier (aider)
5b7f813f81 feat: add watch_source_files import to io.py 2024-10-25 12:52:41 -07:00
Paul Gauthier
923d9a0df2 fix: move file watcher cleanup to correct finally block 2024-10-25 12:52:39 -07:00
Paul Gauthier
c16224b37a wip 2024-10-25 12:49:52 -07:00
Paul Gauthier (aider)
01b5bdc829 style: fix indentation in get_input method 2024-10-25 12:48:54 -07:00
Paul Gauthier
5a0d66141f fix: change /edit to /add command for file changes 2024-10-25 12:48:53 -07:00
Paul Gauthier (aider)
8e873e7450 feat: return edit command when input interrupted by file change 2024-10-25 12:47:06 -07:00
Paul Gauthier (aider)
add3fa43c6 style: format watch_source_files function signature 2024-10-25 12:43:37 -07:00
Paul Gauthier (aider)
b985a8d47a feat: add clean shutdown for file watcher thread 2024-10-25 12:43:31 -07:00
Paul Gauthier (aider)
3db3150a7e feat: add input interruption from background threads 2024-10-25 12:33:07 -07:00
Paul Gauthier
17ce2a3cad Merge branch 'main' into watch 2024-10-25 10:59:02 -07:00
Paul Gauthier (aider)
bf60e58d5b fix: use os.path.join for cross-platform path handling in tests 2024-10-25 10:57:04 -07:00
Paul Gauthier
e3a3a55dd5 fix: make file paths portable for Windows compatibility in tests 2024-10-25 10:57:03 -07:00
Paul Gauthier
e239304d89 refactor: simplify file change output format 2024-10-25 10:53:10 -07:00
Paul Gauthier
893f3f343f refactor: optimize file path handling in watch_source_files function 2024-10-25 10:51:09 -07:00
Paul Gauthier
5918a18dee ignore emacs tmp files 2024-10-25 10:50:35 -07:00
Paul Gauthier (aider)
c08dcff56d style: fix linting issues in watch.py 2024-10-25 09:55:54 -07:00
Paul Gauthier (aider)
f33cd4e419 refactor: improve path handling in watch_source_files filter function 2024-10-25 09:55:50 -07:00
Paul Gauthier
a625426a28 fix: improve path handling in file watcher filter function 2024-10-25 09:55:49 -07:00
Paul Gauthier (aider)
24e66337ff style: fix line length in watch.py by wrapping function call 2024-10-25 09:51:55 -07:00
Paul Gauthier (aider)
d06f1ecf19 feat: add optional ignore function to watch_source_files 2024-10-25 09:51:52 -07:00
Paul Gauthier (aider)
9c6831c360 style: format argparse argument for better readability 2024-10-25 09:47:53 -07:00
Paul Gauthier (aider)
64ec0708c4 feat: support multiple gitignore files in file watcher 2024-10-25 09:47:50 -07:00
Paul Gauthier (aider)
34aa1e8de0 fix: handle paths outside watched directory in file watcher 2024-10-25 09:46:59 -07:00
Paul Gauthier (aider)
b0f31d8296 refactor: remove unused sys import from watch.py 2024-10-25 09:43:04 -07:00
Paul Gauthier (aider)
e5fe5199a3 style: fix import order and whitespace per linting rules 2024-10-25 09:42:51 -07:00
Paul Gauthier (aider)
45e95d1d00 feat: add gitignore support to file watcher 2024-10-25 09:42:47 -07:00
Paul Gauthier (aider)
21876e72fe style: Format watch.py with black and add newlines between functions 2024-10-25 09:41:33 -07:00
Paul Gauthier (aider)
81903598a8 feat: add file watcher for source code files with # or // comments 2024-10-25 09:41:30 -07:00
Paul Gauthier
290500ae17 feat: add file watcher module for monitoring changes 2024-10-25 09:41:27 -07:00
Paul Gauthier
1ed2eefff4 copy 2024-10-25 09:38:10 -07:00
Paul Gauthier
df65e87ef3 test: update InputOutput initialization with fancy_input param in tests 2024-10-25 09:24:52 -07:00
Paul Gauthier
ddb876d2fe only glob, not rglob for /read 2024-10-25 09:22:50 -07:00
Paul Gauthier
a080581329 refactor: improve file path handling with glob and rglob 2024-10-25 07:49:19 -07:00
Paul Gauthier (aider)
f70a82791b fix: handle absolute paths and globs in cmd_read_only 2024-10-25 07:43:31 -07:00
Paul Gauthier
5d3a60228c fix: use Path.rglob instead of glob.glob for recursive file matching 2024-10-25 07:43:29 -07:00
Paul Gauthier
fd820dbfe2 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-25 07:41:02 -07:00
paul-gauthier
b911ceaa61 Merge pull request #2126 from webkonstantin/fix-read-only-from-working-dir
fix: Impossible to /read-only from another working directory
2024-10-25 07:40:57 -07:00
Paul Gauthier
9edf9b4186 refactor: extract get_rel_fname function for path resolution 2024-10-25 07:36:29 -07:00
Paul Gauthier
be74259df6 fix: add missing AnthropicError exception to retry list 2024-10-25 07:31:39 -07:00
Paul Gauthier
29293cc8ac fix: update import path for AnthropicError in retry_exceptions 2024-10-25 07:07:36 -07:00
Paul Gauthier
9e7995b730 bump deps 2024-10-25 06:55:47 -07:00
Konstantin L
ba9fdaa755 fix: Impossible to /read-only from another working directory 2024-10-25 10:59:23 +02:00
Paul Gauthier
dde2dee304 fix last test 2024-10-24 14:31:41 -07:00
Paul Gauthier (aider)
55a99143c2 test: set fancy_input=False in all InputOutput() test instances 2024-10-24 14:31:11 -07:00
Paul Gauthier
ba2bee61de test: fix confirm_ask_yes_no test by disabling fancy input 2024-10-24 14:31:09 -07:00
Paul Gauthier (aider)
5fd8fb15b9 fix: add fancy_input=False to all InputOutput test initializations 2024-10-24 14:27:53 -07:00
Paul Gauthier
8908a48b68 copy 2024-10-24 14:25:08 -07:00
Paul Gauthier (aider)
43fbda0faf feat: add --fancy-input flag to control input history and completion 2024-10-24 14:24:09 -07:00
Paul Gauthier (aider)
97a9c65125 feat: add fancy_input parameter to InputOutput class initialization 2024-10-24 14:23:24 -07:00
Paul Gauthier
8a63b1b3ce refactor: rename pretty flag to fancy_input for clarity 2024-10-24 14:23:22 -07:00
Paul Gauthier
3c658ac66f feat: set default reminder to "user" for gpt-4-1106-preview model 2024-10-24 14:08:51 -07:00
Paul Gauthier
055d529947 remove accepts_images 2024-10-24 14:08:06 -07:00
Paul Gauthier (aider)
9507f3c008 refactor: use main_model.info["supports_vision"] instead of accepts_images 2024-10-24 14:05:17 -07:00
Paul Gauthier
e0a1eefe0a copy 2024-10-24 14:01:00 -07:00
Paul Gauthier
ea37ba8346 set version to 0.60.2.dev 2024-10-24 13:59:43 -07:00
Paul Gauthier
8ea789c29d version bump to 0.60.1 2024-10-24 13:58:28 -07:00
Paul Gauthier
901e4397cb copy 2024-10-24 13:49:27 -07:00
Paul Gauthier (aider)
bcf781da73 feat: sort file lists alphabetically in format_files_for_input 2024-10-24 13:48:32 -07:00
Paul Gauthier
a68178fd1b refactor: sort files in format_files_for_input method 2024-10-24 13:48:31 -07:00
Paul Gauthier (aider)
e18b8b0a29 style: fix indentation in commands.py 2024-10-24 13:46:32 -07:00
Paul Gauthier (aider)
62ff822ee8 refactor: collect and sort expanded filenames before processing 2024-10-24 13:46:27 -07:00
Paul Gauthier
c9993dccc8 fix: remove stray comment and add sorting note in cmd_read 2024-10-24 13:46:25 -07:00
Paul Gauthier (aider)
6181fe5efa feat: sort filenames in cmd_read_only for consistent behavior 2024-10-24 13:44:52 -07:00
Paul Gauthier
dd6124fa64 refactor: sort filenames in cmd_read to match cmd_add behavior 2024-10-24 13:44:51 -07:00
Paul Gauthier (aider)
239302a219 feat: sort filenames before adding to chat 2024-10-24 13:43:01 -07:00
Paul Gauthier
e0949bff69 feat: sort filenames before adding them to chat 2024-10-24 13:42:59 -07:00
Paul Gauthier
e0c603c764 copy 2024-10-24 13:38:50 -07:00
Paul Gauthier
8f62f99db7 feat: add image support for Claude 3 models 2024-10-24 13:38:21 -07:00
Paul Gauthier (aider)
b46de7127d style: format Python code with black linter 2024-10-24 12:34:04 -07:00
Paul Gauthier (aider)
e9627cb3c6 feat: add --yes flag to auto-close duplicate issues without prompting 2024-10-24 12:34:01 -07:00
Paul Gauthier
eb8fdf483e feat: add --yes flag to issues script 2024-10-24 12:33:59 -07:00
Paul Gauthier
a6d5fa9cda copy 2024-10-22 14:40:14 -07:00
Paul Gauthier
1bef71f57a copy 2024-10-22 14:40:05 -07:00
Paul Gauthier
63c393e269 copy 2024-10-22 14:23:37 -07:00
Paul Gauthier
1efb0ba53e added new sonnet and o1 models to refac leaderboard 2024-10-22 14:17:36 -07:00
Paul Gauthier
4a3e6ef1e5 update sonnet model names since they are in litellm json now 2024-10-22 12:53:26 -07:00
Paul Gauthier (aider)
a800d219c7 feat: add ModelSettings for Claude 3.5 Sonnet v2 on Vertex AI 2024-10-22 12:51:21 -07:00
Paul Gauthier
7f962b5bb0 feat: add Claude 3.5 Sonnet model settings 2024-10-22 12:51:19 -07:00
Paul Gauthier
57642cf96c copy 2024-10-22 12:21:25 -07:00
Paul Gauthier
c2e49be096 set version to 0.60.1.dev 2024-10-22 11:35:38 -07:00
Paul Gauthier
c26b2e4859 version bump to 0.60.0 2024-10-22 11:34:28 -07:00
Paul Gauthier
9ce0757835 copy 2024-10-22 11:11:22 -07:00
Paul Gauthier
c80a032297 copy 2024-10-22 10:54:34 -07:00
Paul Gauthier
bd28d8f3fb corrected 1022 benchmark results 2024-10-22 10:52:35 -07:00
Paul Gauthier
748fd0cf12 copy 2024-10-22 10:49:29 -07:00
Paul Gauthier
ac6f495377 1022 should use 1022 as editor 2024-10-22 10:48:29 -07:00
Paul Gauthier
3b14eb98a5 copy 2024-10-22 10:43:08 -07:00
Paul Gauthier
914bf3d82b feat: add model metadata for Claude 3.5 Sonnet 2024-10-22 10:42:13 -07:00
Paul Gauthier
949b50bd69 fix 1122->1022 2024-10-22 10:36:30 -07:00
Paul Gauthier (aider)
d234d5e3ec feat: add resource model metadata to search path 2024-10-22 10:34:29 -07:00
Paul Gauthier
1b530f9200 copy 2024-10-22 10:10:09 -07:00
Paul Gauthier
3c4dad7eb4 use sonnet 1022 by default 2024-10-22 10:09:35 -07:00
Paul Gauthier
cfcb6656cb added claude-3-5-sonnet-20241022 benchmarks 2024-10-22 10:05:15 -07:00
Paul Gauthier
ae54ef57ae simplify format_files_for_input 2024-10-22 10:02:42 -07:00
Paul Gauthier
cb306b61cd added model settings for sonnet 1022 2024-10-22 09:38:32 -07:00
Paul Gauthier
46269f2e9b cleanup 2024-10-21 15:31:27 -07:00
Paul Gauthier
7c9f9be7d8 fix: remove trailing slash from index.md URLs in fname_to_url tests 2024-10-21 14:46:53 -07:00
Paul Gauthier (aider)
ef45fe1015 style: format code with black 2024-10-21 14:32:05 -07:00
Paul Gauthier (aider)
eaaf05d964 fix: handle Windows-style paths in fname_to_url function 2024-10-21 14:32:01 -07:00
Paul Gauthier (aider)
3ce1cfb908 refactor: remove unused imports in test_help.py 2024-10-21 14:28:50 -07:00
Paul Gauthier (aider)
9e0a9e919b style: apply linter formatting changes 2024-10-21 14:28:35 -07:00
Paul Gauthier (aider)
671f3078c1 test: add fname_to_url tests for Unix, Windows, and edge cases 2024-10-21 14:28:28 -07:00
Paul Gauthier (aider)
67d538a499 style: format code with linter 2024-10-21 14:23:11 -07:00
Paul Gauthier (aider)
b69d131810 refactor: improve robustness of fname_to_url function 2024-10-21 14:23:07 -07:00
Paul Gauthier
949b7ece36 chore: Add debug logging for filepath and node metadata 2024-10-21 14:23:05 -07:00
Paul Gauthier
d1e35bcdd1 refactor: update stale issue handling and edit block replacement logic 2024-10-21 12:02:29 -07:00
Paul Gauthier
34ec197199 copy 2024-10-21 10:46:15 -07:00
Paul Gauthier (aider)
5a1cf67ea3 ci: add permissions for stale issue workflow 2024-10-21 10:39:45 -07:00
Paul Gauthier
e427e2da05 do not stale prs 2024-10-21 10:37:43 -07:00
Paul Gauthier (aider)
2cfd4d719a feat: add manual trigger for stale issue closure workflow 2024-10-21 10:30:19 -07:00
Paul Gauthier
709633de72 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-21 10:27:26 -07:00
Paul Gauthier
bf46f6dc8b only stale questions 2024-10-21 10:26:55 -07:00
Paul Gauthier (aider)
259a18f3dd chore: update stale workflow to mark issues as stale after 14 days 2024-10-21 10:25:45 -07:00
Paul Gauthier (aider)
4c3aea4bfc feat: add stale issue and PR workflow 2024-10-21 10:04:26 -07:00
Paul Gauthier
6c595c261c chore: add GitHub action to close stale issues and PRs 2024-10-21 10:04:24 -07:00
paul-gauthier
ecaf1e674d Merge pull request #1982 from jbellis/minimal_fileids
add format_files_for_input and compute_minimal_fileids to beautify the shown session context
2024-10-21 09:55:21 -07:00
Paul Gauthier
e76704e261 copy 2024-10-16 10:32:41 -07:00
Paul Gauthier
e092081c56 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-16 10:17:42 -07:00
Paul Gauthier
4d6db0cb09 copy 2024-10-16 10:16:22 -07:00
Paul Gauthier
0729a725ad copy 2024-10-16 10:15:17 -07:00
Paul Gauthier
b7a884d81e feat: add Llama-3.1-Nemotron-70B model to edit leaderboard 2024-10-16 10:14:42 -07:00
Paul Gauthier
90e6941de5 slight tweak to wholefile prompt 2024-10-16 10:13:48 -07:00
paul-gauthier
c7a05d75fd Merge pull request #1927 from mbokinala/update-docs-pipx-boto3
docs: update instructions for AWS Bedrock pipx installation to include boto3 inject step
2024-10-15 13:21:34 -07:00
Manav Bokinala
ce253fec8f move pipx bedrock boto3 instructions to bedrock.md 2024-10-15 12:59:41 -07:00
Paul Gauthier
6bb9b2567f refactor: Centralize retry timeout and use consistent value 2024-10-15 12:25:05 -07:00
Paul Gauthier
26058c89fe fix pages deploy 2024-10-14 12:57:02 -07:00
Paul Gauthier
692f6a7b85 update linkchecker install 2024-10-14 11:22:05 -07:00
Paul Gauthier
163a29b026 copy 2024-10-14 11:01:00 -07:00
Paul Gauthier
06534fa91e copy 2024-10-14 10:59:42 -07:00
Paul Gauthier
bf45a14b30 feat: add Grok-2 and Grok-2-mini model results to leaderboard 2024-10-14 10:58:40 -07:00
Paul Gauthier
0a497b7fd7 copy 2024-10-10 19:19:54 -07:00
Paul Gauthier
e1f85aa19e copy 2024-10-10 15:24:41 -07:00
Paul Gauthier
2f307e46e2 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-10 15:24:04 -07:00
Paul Gauthier
22203124e9 copy 2024-10-10 15:23:46 -07:00
Paul Gauthier
7e881927d6 cleanup 2024-10-10 15:22:06 -07:00
Paul Gauthier
a4e359daf4 cleanup 2024-10-10 15:08:18 -07:00
paul-gauthier
ef2c165399 Merge pull request #2005 from strayer/strayer/add-azure-o1-model-settings 2024-10-10 06:29:00 -07:00
Sven Grunewaldt
deb27f8f27 feat: Add new model settings for azure/o1-preview
Fixes litellm exceptions and incorrect model settings when using
o1-preview on Azure OpenAI.
2024-10-10 12:05:04 +02:00
fry69
e51d8a403f Merge pull request #2002 from fry69/help-cleanup
Cleanup.
2024-10-10 06:49:02 +02:00
fry69
27ddf8aeab fix: remove unreachable return statements 2024-10-10 06:46:10 +02:00
Jonathan Ellis
b915b1834d remove unused imports 2024-10-09 14:37:22 -05:00
fry69
cd3e0ae914 Merge pull request #1990 from fry69/clipboard-fix
Another quick fix
2024-10-09 14:08:00 +02:00
fry69
e820fea289 doc: fix leftover /clipboard mention 2024-10-09 14:06:30 +02:00
fry69
fc63faa737 Merge pull request #1987 from fry69/openrouter-haiku-fix
Quick emergency fix
2024-10-09 13:04:30 +02:00
fry69
65b50cdaee fix: correct weak model names for Sonnet-3.5 on OpenRouter 2024-10-09 12:50:44 +02:00
Jonathan Ellis
464c3e29e1 add format_files_for_input and compute_minimal_fileids 2024-10-08 22:29:46 -05:00
Paul Gauthier
f65bf9aee7 indent 2024-10-08 10:47:44 -07:00
Paul Gauthier
80f7e56785 initial 2024-10-08 10:39:30 -07:00
Paul Gauthier
0cb05dd001 initial 2024-10-08 10:38:36 -07:00
paul-gauthier
0fe5247d4c Merge pull request #1967 from fry69/chat-history-fix-try2
doc: fix wrong encapsulation
2024-10-07 16:33:01 -07:00
fry69
91a013afb3 doc: fix wrong encapsulation 2024-10-08 01:22:50 +02:00
fry69
3bc056a107 doc: fix wrong encapsulation 2024-10-08 01:22:01 +02:00
paul-gauthier
456c163cb9 Merge pull request #1966 from fry69/chat-history-fix 2024-10-07 15:54:19 -07:00
fry69
f3ff24e35a doc: clarify soft limit for chat history tokens 2024-10-08 00:51:04 +02:00
Paul Gauthier
1d2a3f573c fixes #1941 2024-10-07 13:05:40 -07:00
Paul Gauthier
cbdabd3ae9 fixes #1944 2024-10-07 13:05:28 -07:00
Paul Gauthier
c24ec7f230 fix: Handle additional Git errors in repo check 2024-10-07 12:52:38 -07:00
Paul Gauthier
3146d285bf fix gitignore test 2024-10-07 12:29:39 -07:00
Paul Gauthier (aider)
bde93903de feat: add .env to gitignore check and update process 2024-10-07 12:26:45 -07:00
Paul Gauthier
e487351c8d copy 2024-10-05 14:40:05 -07:00
Paul Gauthier
10ecb4b97f copy 2024-10-05 14:38:01 -07:00
Paul Gauthier (aider)
04a2cbb494 refactor: update regex patterns to match complete lines with optional whitespace 2024-10-05 12:31:23 -07:00
Paul Gauthier
7729974253 set version to 0.59.2.dev 2024-10-05 12:30:48 -07:00
Paul Gauthier
27bfb3c662 version bump to 0.59.1 2024-10-05 12:29:27 -07:00
Paul Gauthier
3d5a7dce4f copy 2024-10-05 12:28:10 -07:00
Paul Gauthier
2d0de85976 Merge branch 'main' of github.com:Aider-AI/aider 2024-10-05 11:40:19 -07:00
Paul Gauthier (aider)
ea4e58e509 refactor: improve error message matching flexibility 2024-10-05 11:37:15 -07:00
Paul Gauthier (aider)
48272449bb style: remove unused exception variable 2024-10-05 11:36:11 -07:00
Paul Gauthier
989e7c18fb refactor: Simplify config file check and error handling 2024-10-05 11:36:04 -07:00
Paul Gauthier (aider)
c6d1c45abc style: format code with black and adjust line breaks 2024-10-05 11:32:53 -07:00
Paul Gauthier (aider)
57efba2763 refactor: improve config file error handling and messaging 2024-10-05 11:32:48 -07:00
Paul Gauthier
e56df2391d refactor: Simplify error handling in main function 2024-10-05 11:32:47 -07:00
Paul Gauthier (aider)
28fab9548b style: format long lines in main.py 2024-10-05 11:30:46 -07:00
Paul Gauthier (aider)
7d117d05c5 fix: replace io.tool_output with print for early error handling 2024-10-05 11:30:42 -07:00
Paul Gauthier (aider)
a482ef9bfa feat: add error handling for 'yes:' config issue 2024-10-05 11:29:44 -07:00
Paul Gauthier (aider)
f82ab9cc6e feat: add error handling for 'yes:' config issue 2024-10-05 11:28:00 -07:00
paul-gauthier
13141fc733 Merge pull request #1934 from fry69/openrouter-beta-models-fix
fix: add OpenRouter Sonnet-3.5 beta/self-moderated model
2024-10-05 07:13:29 -07:00
fry69
3c7e285182 fix: add OpenRouter Sonnet-3.5 beta/self-moderated model 2024-10-05 16:12:34 +02:00
Manav Bokinala
30238dbbd5 docs: update instructions for pipx installation to include boto3 inject step 2024-10-04 20:05:33 -07:00
Paul Gauthier
96cdd95988 refactor: Reorganize charts and update HISTORY.md structure 2024-10-04 15:56:28 -07:00
Paul Gauthier
c10442087b copy 2024-10-04 15:40:43 -07:00
Paul Gauthier
06bd2ace69 set version to 0.59.1.dev 2024-10-04 15:28:29 -07:00
Paul Gauthier
3759340eb4 version bump to 0.59.0 2024-10-04 15:27:13 -07:00
Paul Gauthier
46e182004e copy 2024-10-04 15:25:43 -07:00
Paul Gauthier
e84de1fb5a Revert "test: add DummyInput and DummyOutput to TestHelp setup"
This reverts commit d098a4cd80.
2024-10-04 15:25:22 -07:00
Paul Gauthier
3b9af69dec copy 2024-10-04 15:19:19 -07:00
Paul Gauthier
d098a4cd80 test: add DummyInput and DummyOutput to TestHelp setup 2024-10-04 14:04:02 -07:00
Paul Gauthier
501a304d32 copy 2024-10-04 13:53:07 -07:00
Paul Gauthier
19b6e79719 copy 2024-10-04 13:47:43 -07:00
Paul Gauthier
d77ae7c2ac copy 2024-10-04 13:36:25 -07:00
Paul Gauthier
2b4206fd57 paul-gauthier -> Aider-AI 2024-10-04 13:06:38 -07:00
Paul Gauthier
4ef7022343 copy 2024-10-04 13:00:01 -07:00
Paul Gauthier
1c67ddcbff copy 2024-10-04 12:58:48 -07:00
Paul Gauthier
516e637c39 Update docs github.com/paul-gauthier -> github.com/Aider-AI 2024-10-04 12:53:45 -07:00
Paul Gauthier
d17bd6ebcc move import 2024-10-04 12:51:39 -07:00
Paul Gauthier (aider)
cde45d9fdf style: fix linting issues and add newline 2024-10-04 12:50:38 -07:00
Paul Gauthier (aider)
bfba7e8e73 refactor: move git index version URL to urls.py 2024-10-04 12:50:32 -07:00
Paul Gauthier
f8243b3632 refactor: Move reply_completed call before KeyboardInterrupt handling 2024-10-04 11:46:44 -07:00
Paul Gauthier
7ff2dc89b4 refactor: modify command parsing to use last word only 2024-10-04 11:20:55 -07:00
Paul Gauthier (aider)
0c743ce8e8 feat: sort completions in completions_raw_read_only method 2024-10-04 11:17:47 -07:00
Paul Gauthier
50f88a8d28 copy 2024-10-04 09:37:34 -07:00
Paul Gauthier
ff230554ce chore: Update edit leaderboard with latest model performance data 2024-10-04 09:35:28 -07:00
Paul Gauthier
af10953534 refactor: Improve completion matching for 'add' command 2024-10-03 11:00:18 -07:00
Paul Gauthier (aider)
6093a4c2bb feat: add 'add' command completions to /read-only command 2024-10-03 10:54:26 -07:00
Paul Gauthier
33b45b68e2 copy 2024-10-02 12:03:47 -07:00
Paul Gauthier (aider)
e33e9c44bb fix: import ANY from unittest.mock to resolve undefined name error 2024-10-02 11:21:28 -07:00
Paul Gauthier (aider)
b35bd06eb8 style: format code in test_models.py 2024-10-02 11:21:17 -07:00
Paul Gauthier (aider)
875fb3a178 test: update sanity_check_models_bogus_editor to expect two warnings 2024-10-02 11:21:13 -07:00
Paul Gauthier (aider)
97d6b68613 fix: add missing sanity_check_model import 2024-10-02 11:20:01 -07:00
Paul Gauthier (aider)
21adf405a0 fix: correct imports and model usage in test_models.py 2024-10-02 11:19:38 -07:00
Paul Gauthier (aider)
1a355cbf74 style: format code in test_models.py 2024-10-02 11:19:25 -07:00
Paul Gauthier (aider)
1a3e8b3375 test: update sanity check test to use real Model instances 2024-10-02 11:19:22 -07:00
Paul Gauthier (aider)
da9af264f8 fix: import sanity_check_models in test_models.py 2024-10-02 11:17:53 -07:00
Paul Gauthier (aider)
93cb615ffd test: add test for sanity check with bogus editor model 2024-10-02 11:15:27 -07:00
Paul Gauthier (aider)
7e55a8f684 style: Format code in test_models.py to improve readability 2024-10-02 11:15:09 -07:00
Paul Gauthier (aider)
433223a7fc test: add sanity check for bogus editor model 2024-10-02 11:15:05 -07:00
Paul Gauthier (aider)
1b58e1f6ad style: format code with linter 2024-10-02 11:13:49 -07:00
Paul Gauthier (aider)
03faad3110 refactor: improve sanity_check_models to include editor model check 2024-10-02 11:13:44 -07:00
Paul Gauthier
992600fcb7 fixes #1889 2024-10-02 11:06:19 -07:00
Paul Gauthier
99c3a1ec7f feat: Rename --yes to --yes-always and update config file syntax 2024-10-02 10:55:59 -07:00
Paul Gauthier
d4fe0b18ad rename --yes to --yes-always #767 2024-10-02 10:45:11 -07:00
Paul Gauthier
8dfda27151 copy 2024-10-02 09:30:35 -07:00
Paul Gauthier (aider)
70a509bbea style: Format error message assertion in test_commands.py 2024-10-02 09:21:23 -07:00
Paul Gauthier (aider)
8c45e25724 test: update cmd_read_only test with full path for nonexistent glob 2024-10-02 09:21:17 -07:00
Paul Gauthier (aider)
f12682a0c1 style: Format code and remove whitespace 2024-10-02 09:20:45 -07:00
Paul Gauthier (aider)
79350ab195 test: add glob functionality tests for cmd_read_only method 2024-10-02 09:20:39 -07:00
Paul Gauthier (aider)
ff0bacc984 style: reorder imports and remove whitespace 2024-10-02 09:18:58 -07:00
Paul Gauthier (aider)
d76f7a597e fix: handle tilde expansion in cmd_read_only for home directories 2024-10-02 09:18:53 -07:00
Paul Gauthier (aider)
9ad915f40e style: reorder imports alphabetically in commands.py 2024-10-02 09:16:13 -07:00
Paul Gauthier (aider)
e5b27355b7 feat: use glob for flexible file matching in cmd_read_only 2024-10-02 09:16:08 -07:00
Paul Gauthier (aider)
510fa24ade feat: add --skip-sanity-check-repo switch 2024-10-01 17:31:34 -07:00
Paul Gauthier
72cb5db530 refactor: remove debug print statement for commit_system 2024-10-01 14:25:35 -07:00
Paul Gauthier
8b6b558483 refactor: Optimize cache key generation in RepoMap class 2024-10-01 14:25:27 -07:00
Paul Gauthier
90e42045df copy 2024-10-01 14:23:16 -07:00
Paul Gauthier (aider)
1ff9157c95 style: Format code to comply with linter rules 2024-10-01 14:22:49 -07:00
Paul Gauthier (aider)
cf1e6e65c7 feat: add mentioned_fnames and mentioned_idents to cache key 2024-10-01 14:22:44 -07:00
Paul Gauthier
be5012db96 refactor: improve sorting of ranked definitions 2024-10-01 14:22:43 -07:00
Paul Gauthier
aec8550e56 Merge branch 'main' of github.com:paul-gauthier/aider 2024-10-01 14:20:30 -07:00
Paul Gauthier
1a4ef0f532 fix: Handle OSError when resolving config file path 2024-10-01 14:19:09 -07:00
paul-gauthier
20ab8eb90a Merge pull request #1876 from itlackey/benchmark/ollama-models
Benchmark/ollama models
2024-10-01 14:17:17 -07:00
itlackey
d621d16255 - Added hermes3 2024-10-01 16:06:15 -05:00
itlackey
61bc130464 - Added yi-coder:9b-chat-fp16 2024-10-01 16:06:15 -05:00
itlackey
aa911a847d - Added mistral-small 2024-10-01 16:06:15 -05:00
itlackey
268331d5c0 - Added hermes3:8b-llama3.1-fp16 2024-10-01 16:06:15 -05:00
itlackey
8d4dd5c9de - Added llama3.2:3b-instruct-fp16 2024-10-01 16:06:15 -05:00
itlackey
fb34af4362 - Added qwen2.5:32b 2024-10-01 16:06:15 -05:00
itlackey
e381260932 - Added mistral-nemo:12b-instruct-2407-q4_K_M 2024-10-01 16:06:15 -05:00
itlackey
e2d5f15aff - Added wojtek/opencodeinterpreter:6.7b 2024-10-01 16:06:15 -05:00
itlackey
d4cecf9fd0 - Added codegeex4 2024-10-01 16:06:15 -05:00
paul-gauthier
12578c0388 Merge pull request #1852 from fry69/commit-prompt-fix
fix: enhance commit prompt to ensure one-line with Haiku
2024-10-01 12:19:37 -07:00
Paul Gauthier
9b22d6248a fix: Swap the order of settings and announcements in the output 2024-10-01 11:56:01 -07:00
Paul Gauthier (aider)
729cad640f feat: Add announcements to /settings output 2024-10-01 11:54:28 -07:00
fry69
7a56be174e fix: enhance commit prompt to ensure one-line with Haiku 2024-10-01 10:09:20 +02:00
Paul Gauthier
9789668ca4 copy 2024-09-30 21:21:50 -07:00
Paul Gauthier
9f7aada9c5 copy 2024-09-30 21:21:40 -07:00
Paul Gauthier
51f46393c3 copy 2024-09-30 21:18:20 -07:00
Paul Gauthier
e1029a3858 copy 2024-09-30 21:17:27 -07:00
Paul Gauthier (aider)
51ba096916 feat: implement cog to fetch and process model data 2024-09-30 21:15:09 -07:00
Paul Gauthier
d9c159fe7a feat: Add documentation for infinite output 2024-09-30 21:15:08 -07:00
Paul Gauthier
8ebd519615 copy 2024-09-30 14:28:05 -07:00
Paul Gauthier
bfcba012fa set version to 0.58.2.dev 2024-09-30 14:25:39 -07:00
Paul Gauthier
8f48c68fc6 version bump to 0.58.1 2024-09-30 14:24:18 -07:00
Paul Gauthier
f2e1e17741 avoid stomping extra_params[max_tokens]=1 in cache warming, which causes loop of 1 token infinite-output responses with prefill models #1842 #1841 2024-09-30 14:22:11 -07:00
Paul Gauthier
8fb0362b47 copy 2024-09-30 09:37:47 -07:00
Paul Gauthier
a42587b8de copy 2024-09-30 09:31:50 -07:00
Paul Gauthier
474056a068 copy 2024-09-30 09:25:37 -07:00
Paul Gauthier
adde5e08d0 copy 2024-09-30 08:34:40 -07:00
Paul Gauthier
0aaa37f528 copy 2024-09-29 16:05:00 -07:00
Paul Gauthier
e5862ae81e Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-29 15:50:53 -07:00
Paul Gauthier
485bfa2492 copy 2024-09-29 15:46:32 -07:00
paul-gauthier
d5117921cf Merge pull request #1826 from mario7421/typo-fix 2024-09-29 12:43:51 -07:00
mario7421
98b3f5bbdb Fix typo in diff prompt 2024-09-29 21:07:20 +02:00
paul-gauthier
b73c518eb2 Merge pull request #1823 from fry69/architect-hot-fix 2024-09-29 09:33:55 -07:00
fry69
457b627b67 doc: hotfix for Full results table 2024-09-29 18:15:08 +02:00
Paul Gauthier
53ca83beea copy 2024-09-29 08:31:13 -07:00
Paul Gauthier
53a83734ca set version to 0.58.1.dev 2024-09-29 08:19:48 -07:00
Paul Gauthier
2bdd9360ab version bump to 0.58.0 2024-09-29 08:18:38 -07:00
Paul Gauthier
805e46a1df publish architect 2024-09-29 08:13:22 -07:00
Paul Gauthier
291ef5711d architect graphic 2024-09-29 08:12:30 -07:00
Paul Gauthier
00605e67fb copy 2024-09-29 08:10:13 -07:00
Paul Gauthier
6c6c6076eb copy 2024-09-29 08:09:50 -07:00
Paul Gauthier
b8ec4a5291 Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-29 08:09:18 -07:00
Paul Gauthier
387a9434f8 copy 2024-09-29 08:06:17 -07:00
paul-gauthier
cc01313500 Merge pull request #1807 from itlackey/benchmark/ollama-codestral 2024-09-28 15:49:49 -07:00
Paul Gauthier
0091ab004c fix: Update autocomplete test to handle partial file names 2024-09-28 15:29:54 -07:00
Paul Gauthier (aider)
d647ebf058 fix: remove unused import of Completion in test_io.py 2024-09-28 15:28:29 -07:00
Paul Gauthier (aider)
c2b48b5256 style: format code and improve readability in test_io.py 2024-09-28 15:28:14 -07:00
Paul Gauthier (aider)
d5b8a15410 test: add unit tests for AutoCompleter.get_command_completions method 2024-09-28 15:28:11 -07:00
Paul Gauthier
2139de76fb test: remove unused test for command completions in TestInputOutput class 2024-09-28 15:28:10 -07:00
Paul Gauthier (aider)
e832ee8450 style: format code and run linter on test_io.py 2024-09-28 15:24:18 -07:00
Paul Gauthier (aider)
37236aa907 fix: update test_get_command_completions to match new method signature with Document and CompleteEvent parameters 2024-09-28 15:24:14 -07:00
Paul Gauthier (aider)
4ea68efd0e test: Fix confirm_ask test to handle invalid input and verify call count 2024-09-28 15:19:19 -07:00
Paul Gauthier (aider)
843cc9ee4e style: run linter and fix whitespace in test_io.py 2024-09-28 15:16:59 -07:00
Paul Gauthier (aider)
ec10ead0c3 test: add unit tests for allow_never option in confirm_ask method 2024-09-28 15:16:56 -07:00
Paul Gauthier
b78d19c7a5 copy 2024-09-28 15:15:42 -07:00
Paul Gauthier
97ddcb2ae6 feat: Add autocomplete support for /read-only command 2024-09-28 15:14:35 -07:00
Paul Gauthier (aider)
d1ee3644ec style: run linter and format import statements in io.py 2024-09-28 15:02:37 -07:00
Paul Gauthier (aider)
b9fb59dc3e fix: remove unused import of PathCompleter from aider/io.py 2024-09-28 15:02:33 -07:00
Paul Gauthier (aider)
ad0497dfdf style: run linter and fix code formatting in io.py 2024-09-28 15:02:13 -07:00
Paul Gauthier (aider)
c1642b5eca feat: add "Never" option to confirm_ask and store user choices in never_prompts set 2024-09-28 15:02:09 -07:00
Paul Gauthier
f8746feaa1 fix: Improve warning message for unsupported streaming 2024-09-28 14:55:22 -07:00
Paul Gauthier
40588ccffa copy 2024-09-28 14:55:16 -07:00
Paul Gauthier (aider)
9884d838ea style: run linter and format test_commands.py for improved readability 2024-09-28 14:48:23 -07:00
Paul Gauthier (aider)
384391129d test: add unit test for /copy command with cur_messages present 2024-09-28 14:48:18 -07:00
Paul Gauthier
0819258e0f test: add unit test for handling bad glob in command add 2024-09-28 14:48:17 -07:00
Paul Gauthier (aider)
1e776863ac style: format code and improve linter compliance in test_commands.py 2024-09-28 14:44:04 -07:00
Paul Gauthier (aider)
202a219d82 test: add tests for the /copy command including success, no messages, and exception handling 2024-09-28 14:44:00 -07:00
Paul Gauthier
817530ccb7 fixed regression allowing non-repo files to move from /read to /add 2024-09-28 14:42:07 -07:00
Paul Gauthier
ffd7364410 Merge branch 'main' into path-completer 2024-09-28 14:33:58 -07:00
Paul Gauthier
bebffee3dd Merge branch 'main' of github.com:paul-gauthier/aider 2024-09-28 14:33:25 -07:00
Paul Gauthier
8cb3e523a5 copy 2024-09-28 14:31:49 -07:00
itlackey
228ae24834 added ollama/codestral benchmark 2024-09-28 16:08:49 -05:00
paul-gauthier
ffc7d35145 Merge pull request #1796 from fry69/git-doc-fix 2024-09-28 07:21:38 -07:00
fry69
010f921c53 doc: fix /paste entry in commands.html spilling into new line 2024-09-28 15:11:26 +02:00
fry69
d7d87847a6 doc: small fixes 2024-09-28 08:31:50 +02:00
Paul Gauthier
91307ecfc4 fix: Remove unnecessary call to dump() in InputOutput.read_style() 2024-09-27 19:50:45 -07:00
Paul Gauthier (aider)
1a75b79c81 fix: change default values for completion menu arguments to None in InputOutput.__init__ method 2024-09-27 19:49:53 -07:00
Paul Gauthier
3ff5f280bb fix: add dump function call to style dictionary processing in InputOutput class 2024-09-27 19:49:52 -07:00
Paul Gauthier (aider)
e465cda5c8 fix: change default values for completion menu arguments from "default" to None in aider/args.py 2024-09-27 19:49:17 -07:00
Paul Gauthier (aider)
2d5db0dc23 style: format code with linter adjustments 2024-09-27 19:47:45 -07:00
Paul Gauthier (aider)
537f5a1f98 fix: update _get_style method to conditionally add completion menu styles based on non-null values 2024-09-27 19:47:41 -07:00
Paul Gauthier
ede3cbb372 refactor: simplify _get_style method in InputOutput class 2024-09-27 19:47:40 -07:00
Paul Gauthier (aider)
d3908ca971 fix: update style dictionary and simplify style retrieval in get_input method 2024-09-27 19:45:14 -07:00
Paul Gauthier (aider)
725b5f7063 feat: centralize pygments.literal.string style configuration in _get_style method and simplify calling code 2024-09-27 19:45:04 -07:00
Paul Gauthier (aider)
fd9dc9e8d2 style: format linter adjustments in io.py for better readability 2024-09-27 19:44:23 -07:00
Paul Gauthier (aider)
c5fb25eec3 fix: correct SEARCH/REPLACE block in aider/io.py to match existing lines exactly 2024-09-27 19:44:20 -07:00
Paul Gauthier (aider)
d2e0d3c06d refactor: ensure _get_style always returns a dictionary and simplify calling code 2024-09-27 19:44:14 -07:00
Paul Gauthier (aider)
1cd5b11b5c style: fix linter issues in io.py 2024-09-27 19:43:34 -07:00
Paul Gauthier (aider)
b16050211c fix: fix line length issue in _get_style method by breaking long string into multiple lines 2024-09-27 19:43:30 -07:00
Paul Gauthier (aider)
0a558682d8 style: format linter adjustments in io.py for better readability 2024-09-27 19:43:16 -07:00
Paul Gauthier (aider)
bff1b3de9c refactor: centralize completion menu styles in _get_style method to reduce code duplication 2024-09-27 19:43:12 -07:00
Paul Gauthier (aider)
cf46d9cdd0 style: run linter and format completion menu style definitions 2024-09-27 19:41:56 -07:00
Paul Gauthier (aider)
2c084d65d9 refactor: centralize style creation logic by introducing _get_style method in InputOutput class 2024-09-27 19:41:51 -07:00
Paul Gauthier (aider)
41d5b284e3 fix: resolve syntax errors in commands.py and improve file handling logic 2024-09-27 19:31:43 -07:00
Paul Gauthier (aider)
45d94b1c7c fix: handle file status correctly in /add and _add_read_only_file commands 2024-09-27 19:30:20 -07:00
Paul Gauthier (aider)
2509f0704f style: Fix formatting in commands.py 2024-09-27 17:10:10 -07:00
Paul Gauthier (aider)
1f56118c99 feat: Simplify completions_raw_read_only method 2024-09-27 17:10:05 -07:00
Paul Gauthier
38d03bca09 fix: Rename _old_completions_add to completions_add 2024-09-27 17:10:04 -07:00
Paul Gauthier (aider)
731f312731 fix: remove unused import of 'shlex' 2024-09-27 17:06:32 -07:00
Paul Gauthier
635a800032 fix: Quote file names with spaces in completions 2024-09-27 17:06:27 -07:00
Paul Gauthier (aider)
87da3a7132 fix: adjust start_position for quoted filename completions in completions_raw_read_only method 2024-09-27 16:53:15 -07:00
Paul Gauthier
eef97e4938 fix: remove redundant import of shlex in commands.py 2024-09-27 16:53:14 -07:00
Paul Gauthier (aider)
36bc8f90db fix: properly quote filenames with spaces and special characters using shlex.quote() 2024-09-27 16:52:06 -07:00
Paul Gauthier (aider)
c4e766a4c4 style: run linter and reorder import statements in commands.py 2024-09-27 16:51:01 -07:00
Paul Gauthier (aider)
8bb9bbef19 feat: modify PathCompleter to quote filenames with spaces in completions 2024-09-27 16:50:57 -07:00
Paul Gauthier
2a79723336 refactor: rename completions_add method to _old_completions_add for clarity 2024-09-27 16:50:57 -07:00
Paul Gauthier
542afbeb74 fix: Use self.coder.root instead of self.root in get_paths function 2024-09-27 16:48:55 -07:00
Paul Gauthier (aider)
9644546a65 feat: add get_paths function to PathCompleter for starting from self.root if not None 2024-09-27 16:47:47 -07:00
Paul Gauthier
79e0b80f34 Merge branch 'main' into path-completer 2024-09-27 16:46:24 -07:00
Paul Gauthier
7e4e6782d1 fix: set max_tokens to 1 for cache warming 2024-09-27 16:46:03 -07:00
Paul Gauthier (aider)
aab01086a2 style: fix formatting in base_coder.py 2024-09-27 16:43:24 -07:00
Paul Gauthier (aider)
f7818c6994 feat: Use **kwargs for extra_params in warm_cache_worker 2024-09-27 16:43:18 -07:00
Paul Gauthier
22c60cad1a refactor: Replace extra_params with extra_headers in cache warming request 2024-09-27 16:43:17 -07:00
Paul Gauthier
237ee1c5a1 Merge branch 'main' into path-completer 2024-09-27 16:40:53 -07:00
Paul Gauthier (aider)
87e4010b8b style: Run linter 2024-09-27 16:39:42 -07:00
Paul Gauthier (aider)
7830dadccf fix: Remove unused imports in aider/commands.py 2024-09-27 16:39:37 -07:00
Paul Gauthier (aider)
6287bf37e5 feat: Implement partial prefix matching for /read-only command in completions_raw_read_only method 2024-09-27 16:39:26 -07:00
Paul Gauthier
369310a7c3 fix: Remove commented-out code in PathCompleter configuration 2024-09-27 16:39:25 -07:00
Paul Gauthier (aider)
7e1497e114 style: Run linter and fix code formatting issues in commands.py 2024-09-27 16:35:27 -07:00
Paul Gauthier (aider)
57257b7c15 fix: correct indentation error in completions_raw_read_only method in aider/commands.py 2024-09-27 16:35:22 -07:00
Paul Gauthier (aider)
68c4817c14 fix: adjust completions_raw_read_only to process only file path input for correct path completions 2024-09-27 16:34:55 -07:00
Paul Gauthier (aider)
c35a41466b fix: correct completions_raw_read_only method to yield all path completions without unnecessary filtering 2024-09-27 16:25:39 -07:00
Paul Gauthier
bb740f3004 refactor: Replace extra_headers with extra_params in cache warming request 2024-09-27 16:22:17 -07:00
Paul Gauthier
c745d0dc38 wip 2024-09-27 16:21:18 -07:00
Paul Gauthier (aider)
9c5ef0b41a style: run linter 2024-09-27 16:17:41 -07:00
Paul Gauthier (aider)
2d3605156e feat: Implement file path completion for read-only command 2024-09-27 16:17:37 -07:00
Paul Gauthier
8e276939a7 feat: Implement completions_raw_read_only method
diff --git a/aider/commands.py b/aider/commands.py
index 80dd81dd..d4d4d4d1 100644
--- a/aider/commands.py
+++ b/aider/commands.py
@@ -580,7 +580,31 @@ class Commands:
         return fname

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

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

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

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

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

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

Default behaviour is unchanged.

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

View File

@@ -15,34 +15,43 @@ on:
branches:
- main
# copy most of these steps from release.yml, but push: false and no tags:
jobs:
build:
docker_build_and_push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
dockerhub_username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub_password: ${{ secrets.DOCKERHUB_PASSWORD }}
if: ${{ env.dockerhub_username }} && ${{ env.dockerhub_password }}
- name: Build Docker image
- name: Build and push Docker images
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: false
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider:dev
target: aider
- name: Build and push Docker full image
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider-full:dev
target: aider-full

View File

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

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

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

View File

@@ -36,7 +36,9 @@ jobs:
working-directory: aider/website
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
@@ -70,16 +72,16 @@ jobs:
id: deployment
uses: actions/deploy-pages@v2
- name: Set up Python ${{ matrix.python-version }}
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
python-version: '3.12'
- name: Install linkchecker
run: |
python -m pip install --upgrade pip
pip install linkchecker
python -m pip install linkchecker
- name: Run linkchecker
run: |
linkchecker https://aider.chat
linkchecker --ignore-url='.+\.(mp4|mov|avi)' https://aider.chat

View File

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

View File

@@ -25,12 +25,19 @@ jobs:
steps:
- name: Check out repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libportaudio2
- name: Install dependencies
run: |
python -m pip install --upgrade pip
@@ -38,5 +45,7 @@ jobs:
pip install .
- name: Run tests
env:
AIDER_ANALYTICS: false
run: |
pytest

View File

@@ -25,6 +25,8 @@ jobs:
steps:
- name: Check out repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
@@ -38,6 +40,8 @@ jobs:
pip install .
- name: Run tests
env:
AIDER_ANALYTICS: false
run: |
pytest

5
.gitignore vendored
View File

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

View File

@@ -17,10 +17,10 @@ Contributions of
[LLM benchmark results](https://aider.chat/docs/leaderboards/)
are welcome!
See the
[benchmark README](https://github.com/paul-gauthier/aider/blob/main/benchmark/README.md)
[benchmark README](https://github.com/Aider-AI/aider/blob/main/benchmark/README.md)
for information on running aider's code editing benchmarks.
Submit results by opening a PR with edits to the
[benchmark results data files](https://github.com/paul-gauthier/aider/blob/main/aider/website/_data/).
[benchmark results data files](https://github.com/Aider-AI/aider/blob/main/aider/website/_data/).
## Pull Requests
@@ -33,19 +33,16 @@ ensure that your contributions can be integrated smoothly.
## Licensing
By contributing to this project, you agree that your contributions
will be licensed under the Apache License 2.0. Additionally, you
understand and agree that contributions may be subject to a different
license, should the project maintainers decide to change the licensing
terms.
Before contributing a PR, please review our
[Individual Contributor License Agreement](https://aider.chat/docs/legal/contributor-agreement.html).
All contributors will be asked to complete the agreement as part of the PR process.
## Setting up a Development Environment
### Clone the Repository
```
git clone https://github.com/paul-gauthier/aider.git
git clone https://github.com/Aider-AI/aider.git
cd aider
```
@@ -59,13 +56,6 @@ It is recommended to create a virtual environment outside of the repository to k
python -m venv /path/to/venv
```
#### Using `virtualenv` (for older Python versions)
```
pip install virtualenv
virtualenv /path/to/venv
```
### Activate the Virtual Environment
#### On Windows
@@ -154,6 +144,10 @@ The project's documentation is built using Jekyll and hosted on GitHub Pages. To
```
bundle exec jekyll build
```
5. Preview the website while editing (optional):
```
bundle exec jekyll serve
```
The built documentation will be available in the `aider/website/_site` directory.
@@ -186,8 +180,8 @@ pytest
You can also run specific test files or test cases by providing the file path or test name:
```
pytest aider/tests/test_coder.py
pytest aider/tests/test_coder.py::TestCoder::test_specific_case
pytest tests/basic/test_coder.py
pytest tests/basic/test_coder.py::TestCoder::test_specific_case
```
#### Continuous Integration

View File

@@ -1,6 +1,295 @@
# Release history
### Aider v0.71.1
- Fix permissions issue in Docker images.
- Added read-only file announcements to chat.
- Bugfix: ASCII fallback for unicode errors.
- Bugfix: integer indices for list slicing in repomap calculations.
- Aider wrote 83% of the code in this release.
### Aider v0.71.0
- Prompts to help DeepSeek work better when alternating between `/ask` and `/code`.
- Streaming pretty LLM responses is smoother and faster for long replies.
- Streaming automatically turns of for model that don't support it
- Can now switch to/from `/model o1` and a streaming model
- Pretty output remains enabled even when editing files with triple-backtick fences
- Bare `/ask`, `/code` and `/architect` commands now switch the chat mode.
- Increased default size of the repomap.
- Increased max chat history tokens limit from 4k to 8k.
- Turn off fancy input and watch files if terminal is dumb.
- Added support for custom voice format and input device settings.
- Disabled Streamlit email prompt, by apaz-cli.
- Docker container runs as non-root user.
- Fixed lint command handling of nested spaced strings, by Aaron Weisberg.
- Added token count feedback when adding command output to chat.
- Improved error handling for large audio files with automatic format conversion.
- Improved handling of git repo index errors, by Krazer.
- Improved unicode handling in console output with ASCII fallback.
- Added AssertionError, AttributeError to git error handling.
- Aider wrote 60% of the code in this release.
### Aider v0.70.0
- Full support for o1 models.
- Watch files now honors `--subtree-only`, and only watches that subtree.
- Improved prompting for watch files, to work more reliably with more models.
- New install methods via uv, including one-liners.
- Support for openrouter/deepseek/deepseek-chat model.
- Better error handling when interactive commands are attempted via `/load` or `--load`.
- Display read-only files with abs path if its shorter than rel path.
- Ask 10% of users to opt-in to analytics.
- Bugfix for auto-suggest.
- Gracefully handle unicode errors in git path names.
- Aider wrote 74% of the code in this release.
### Aider v0.69.1
- Fix for gemini model names in model metadata.
- Show hints about AI! and AI? when user makes AI comments.
- Support for running without git installed.
- Improved environment variable setup messages on Windows.
### Aider v0.69.0
- [Watch files](https://aider.chat/docs/usage/watch.html) improvements:
- Use `# ... AI?` comments to trigger aider and ask questions about your code.
- Now watches *all* files, not just certain source files.
- Use `# AI comments`, `// AI comments`, or `-- AI comments` to give aider instructions in any text file.
- Full support for Gemini Flash 2.0 Exp:
- `aider --model flash` or `aider --model gemini/gemini-2.0-flash-exp`
- [New `--multiline` flag and `/multiline-mode` command](https://aider.chat/docs/usage/commands.html#entering-multi-line-chat-messages) makes ENTER a soft newline and META-ENTER send the message, by @miradnanali.
- `/copy-context <instructions>` now takes optional "instructions" when [copying code context to the clipboard](https://aider.chat/docs/usage/copypaste.html#copy-aiders-code-context-to-your-clipboard-paste-into-the-web-ui).
- Improved clipboard error handling with helpful requirements install info.
- Ask 5% of users if they want to opt-in to analytics.
- `/voice` now lets you edit the transcribed text before sending.
- Disabled auto-complete in Y/N prompts.
- Aider wrote 68% of the code in this release.
### Aider v0.68.0
- [Aider works with LLM web chat UIs](https://aider.chat/docs/usage/copypaste.html).
- New `--copy-paste` mode.
- New `/copy-context` command.
- [Set API keys and other environment variables for all providers from command line or yaml conf file](https://aider.chat/docs/config/aider_conf.html#storing-llm-keys).
- New `--api-key provider=key` setting.
- New `--set-env VAR=value` setting.
- Added bash and zsh support to `--watch-files`.
- Better error messages when missing dependencies for Gemini and Bedrock models.
- Control-D now properly exits the program.
- Don't count token costs when API provider returns a hard error.
- Bugfix so watch files works with files that don't have tree-sitter support.
- Bugfix so o1 models can be used as weak model.
- Updated shell command prompt.
- Added docstrings for all Coders.
- Reorganized command line arguments with improved help messages and grouping.
- Use the exact `sys.python` for self-upgrades.
- Added experimental Gemini models.
- Aider wrote 71% of the code in this release.
### Aider v0.67.0
- [Use aider in your IDE or editor](https://aider.chat/docs/usage/watch.html).
- Run `aider --watch-files` and it will watch for instructions you add to your source files.
- One-liner `# ...` or `// ...` comments that start or end with "AI" are instructions to aider.
- When aider sees "AI!" it reads and follows all the instructions in AI comments.
- Support for new Amazon Bedrock Nova models.
- When `/run` or `/test` have non-zero exit codes, pre-fill "Fix that" into the next message prompt.
- `/diff` now invokes `git diff` to use your preferred diff tool.
- Added Ctrl-Z support for process suspension.
- Spinner now falls back to ASCII art if fancy symbols throw unicode errors.
- `--read` now expands `~` home dirs.
- Enabled exception capture in analytics.
- [Aider wrote 61% of the code in this release.](https://aider.chat/HISTORY.html)
### Aider v0.66.0
- PDF support for Sonnet and Gemini models.
- Added `--voice-input-device` to select audio input device for voice recording, by @preynal.
- Added `--timeout` option to configure API call timeouts.
- Set cwd to repo root when running shell commands.
- Added Ctrl-Up/Down keyboard shortcuts for per-message history navigation.
- Improved error handling for failed .gitignore file operations.
- Improved error handling for input history file permissions.
- Improved error handling for analytics file access.
- Removed spurious warning about disabling pretty in VSCode.
- Removed broken support for Dart.
- Bugfix when scraping URLs found in chat messages.
- Better handling of __version__ import errors.
- Improved `/drop` command to support substring matching for non-glob patterns.
- Aider wrote 82% of the code in this release.
### Aider v0.65.1
- Bugfix to `--alias`.
### Aider v0.65.0
- Added `--alias` config to define [custom model aliases](https://aider.chat/docs/config/model-aliases.html).
- Added `--[no-]detect-urls` flag to disable detecting and offering to scrape URLs found in the chat.
- Ollama models now default to an 8k context window.
- Added [RepoMap support for Dart language](https://aider.chat/docs/languages.html) by @malkoG.
- Ask 2.5% of users if they want to opt-in to [analytics](https://aider.chat/docs/more/analytics.html).
- Skip suggesting files that share names with files already in chat.
- `/editor` returns and prefill the file content into the prompt, so you can use `/editor` to compose messages that start with `/commands`, etc.
- Enhanced error handling for analytics.
- Improved handling of UnknownEditFormat exceptions with helpful documentation links.
- Bumped dependencies to pick up grep-ast 0.4.0 for Dart language support.
- Aider wrote 81% of the code in this release.
### Aider v0.64.1
- Disable streaming for o1 on OpenRouter.
### Aider v0.64.0
- Added [`/editor` command](https://aider.chat/docs/usage/commands.html) to open system editor for writing prompts, by @thehunmonkgroup.
- Full support for `gpt-4o-2024-11-20`.
- Stream o1 models by default.
- `/run` and suggested shell commands are less mysterious and now confirm that they "Added XX lines of output to the chat."
- Ask 1% of users if they want to opt-in to [analytics](https://aider.chat/docs/more/analytics.html).
- Added support for [optional multiline input tags](https://aider.chat/docs/usage/commands.html#entering-multi-line-chat-messages) with matching closing tags.
- Improved [model settings configuration](https://aider.chat/docs/config/adv-model-settings.html#global-extra-params) with support for global `extra_params` for `litellm.completion()`.
- Architect mode now asks to add files suggested by the LLM.
- Fixed bug in fuzzy model name matching.
- Added Timeout exception to handle API provider timeouts.
- Added `--show-release-notes` to control release notes display on first run of new version.
- Save empty dict to cache file on model metadata download failure, to delay retry.
- Improved error handling and code formatting.
- Aider wrote 74% of the code in this release.
### Aider v0.63.2
- Fixed bug in fuzzy model name matching when litellm provider info is missing.
- Modified model metadata file loading to allow override of resource file.
- Allow recursive loading of dirs using `--read`.
- Updated dependency versions to pick up litellm fix for ollama models.
- Added exponential backoff retry when writing files to handle editor file locks.
- Updated Qwen 2.5 Coder 32B model configuration.
### Aider v0.63.1
- Fixed bug in git ignored file handling.
- Improved error handling for git operations.
### Aider v0.63.0
- Support for Qwen 2.5 Coder 32B.
- `/web` command just adds the page to the chat, without triggering an LLM response.
- Improved prompting for the user's preferred chat language.
- Improved handling of LiteLLM exceptions.
- Bugfix for double-counting tokens when reporting cache stats.
- Bugfix for the LLM creating new files.
- Other small bug fixes.
- Aider wrote 55% of the code in this release.
### Aider v0.62.0
- Full support for Claude 3.5 Haiku
- Scored 75% on [aider's code editing leaderboard](https://aider.chat/docs/leaderboards/).
- Almost as good as Sonnet at much lower cost.
- Launch with `--haiku` to use it.
- Easily apply file edits from ChatGPT, Claude or other web apps
- Chat with ChatGPT or Claude via their web app.
- Give it your source files and ask for the changes you want.
- Use the web app's "copy response" button to copy the entire reply from the LLM.
- Run `aider --apply-clipboard-edits file-to-edit.js`.
- Aider will edit your file with the LLM's changes.
- Bugfix for creating new files.
- Aider wrote 84% of the code in this release.
### Aider v0.61.0
- Load and save aider slash-commands to files:
- `/save <fname>` command will make a file of `/add` and `/read-only` commands that recreate the current file context in the chat.
- `/load <fname>` will replay the commands in the file.
- You can use `/load` to run any arbitrary set of slash-commands, not just `/add` and `/read-only`.
- Use `--load <fname>` to run a list of commands on launch, before the interactive chat begins.
- Anonymous, opt-in [analytics](https://aider.chat/docs/more/analytics.html) with no personal data sharing.
- Aider follows litellm's `supports_vision` attribute to enable image support for models.
- Bugfix for when diff mode flexibly handles the model using the wrong filename.
- Displays filenames in sorted order for `/add` and `/read-only`.
- New `--no-fancy-input` switch disables prompt toolkit input, now still available with `--no-pretty`.
- Override browser config with `--no-browser` or `--no-gui`.
- Offer to open documentation URLs when errors occur.
- Properly support all o1 models, regardless of provider.
- Improved layout of filenames above input prompt.
- Better handle corrupted repomap tags cache.
- Improved handling of API errors, especially when accessing the weak model.
- Aider wrote 68% of the code in this release.
### Aider v0.60.1
- Enable image support for Sonnet 10/22.
- Display filenames in sorted order.
### Aider v0.60.0
- Full support for Sonnet 10/22, the new SOTA model on aider's code editing benchmark.
- Aider uses Sonnet 10/22 by default.
- Improved formatting of added and read-only files above chat prompt, by @jbellis.
- Improved support for o1 models by more flexibly parsing their nonconforming code edit replies.
- Corrected diff edit format prompt that only the first match is replaced.
- Stronger whole edit format prompt asking for clean file names.
- Now offers to add `.env` to the `.gitignore` file.
- Ships with a small model metadata json file to handle models not yet updated in litellm.
- Model settings for o1 models on azure.
- Bugfix to properly include URLs in `/help` RAG results.
- Aider wrote 49% of the code in this release.
### Aider v0.59.1
- Check for obsolete `yes: true` in yaml config, show helpful error.
- Model settings for openrouter/anthropic/claude-3.5-sonnet:beta
### Aider v0.59.0
- Improvements to `/read-only`:
- Now supports shell-style auto-complete of the full file system.
- Still auto-completes the full paths of the repo files like `/add`.
- Now supports globs like `src/**/*.py`
- Renamed `--yes` to `--yes-always`.
- Now uses `AIDER_YES_ALWAYS` env var and `yes-always:` yaml key.
- Existing YAML and .env files will need to be updated.
- Can still abbreviate to `--yes` on the command line.
- Config file now uses standard YAML list syntax with ` - list entries`, one per line.
- `/settings` now includes the same announcement lines that would print at launch.
- Sanity checks the `--editor-model` on launch now, same as main and weak models.
- Added `--skip-sanity-check-repo` switch to speedup launch in large repos.
- Bugfix so architect mode handles Control-C properly.
- Repo-map is deterministic now, with improved caching logic.
- Improved commit message prompt.
- Aider wrote 77% of the code in this release.
### Aider v0.58.1
- Fixed bug where cache warming pings caused subsequent user messages to trigger a tight loop of LLM requests.
### Aider v0.58.0
- [Use a pair of Architect/Editor models for improved coding](https://aider.chat/2024/09/26/architect.html)
- Use a strong reasoning model like o1-preview as your Architect.
- Use a cheaper, faster model like gpt-4o as your Editor.
- New `--o1-preview` and `--o1-mini` shortcuts.
- Support for new Gemini 002 models.
- Better support for Qwen 2.5 models.
- Many confirmation questions can be skipped for the rest of the session with "(D)on't ask again" response.
- Autocomplete for `/read-only` supports the entire filesystem.
- New settings for completion menu colors.
- New `/copy` command to copy the last LLM response to the clipboard.
- Renamed `/clipboard` to `/paste`.
- Will now follow HTTP redirects when scraping urls.
- New `--voice-format` switch to send voice audio as wav/mp3/webm, by @mbailey.
- ModelSettings takes `extra_params` dict to specify any extras to pass to `litellm.completion()`.
- Support for cursor shapes when in vim mode.
- Numerous bug fixes.
- Aider wrote 53% of the code in this release.
### Aider v0.57.1
- Fixed dependency conflict between aider-chat[help] and [playwright].
### Aider v0.57.0
- Support for OpenAI o1 models:
@@ -661,7 +950,7 @@
### Aider v0.14.0
- [Support for Claude2 and other LLMs via OpenRouter](https://aider.chat/docs/faq.html#accessing-other-llms-with-openrouter) by @joshuavial
- Documentation for [running the aider benchmarking suite](https://github.com/paul-gauthier/aider/tree/main/benchmark)
- Documentation for [running the aider benchmarking suite](https://github.com/Aider-AI/aider/tree/main/benchmark)
- Aider now requires Python >= 3.9

20
MANIFEST.in Normal file
View File

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

View File

@@ -5,9 +5,9 @@
Aider lets you pair program with LLMs,
to edit code in your local git repository.
Start a new project or work with an existing git repo.
Aider works best with GPT-4o & Claude 3.5 Sonnet and can
[connect to almost any LLM](https://aider.chat/docs/llms.html).
Start a new project or work with an existing code base.
Aider works best with Claude 3.5 Sonnet, DeepSeek V3, o1 & GPT-4o and can [connect to almost any LLM](https://aider.chat/docs/llms.html).
<!-- SCREENCAST START -->
<p align="center">
@@ -43,28 +43,27 @@ VIDEO END -->
cog.out(open("aider/website/_includes/get-started.md").read())
]]]-->
You can get started quickly like this:
If you already have python 3.8-3.13 installed, you can get started quickly like this:
```
python -m pip install aider-chat
```bash
python -m pip install aider-install
aider-install
# Change directory into a git repo
cd /to/your/git/repo
# Change directory into your code base
cd /to/your/project
# Work with Claude 3.5 Sonnet on your repo
export ANTHROPIC_API_KEY=your-key-goes-here
aider
# Work with Claude 3.5 Sonnet on your code
aider --model sonnet --anthropic-api-key your-key-goes-here
# Work with GPT-4o on your repo
export OPENAI_API_KEY=your-key-goes-here
aider
# Work with GPT-4o on your code
aider --model gpt-4o --openai-api-key your-key-goes-here
```
<!--[[[end]]]-->
See the
[installation instructions](https://aider.chat/docs/install.html)
and other
[documentation](https://aider.chat/docs/usage.html)
and
[usage documentation](https://aider.chat/docs/usage.html)
for more details.
## Features
@@ -78,16 +77,17 @@ for more details.
- Update docs.
- Aider will edit your files to complete your request.
- Aider [automatically git commits](https://aider.chat/docs/git.html) changes with a sensible commit message.
- [Use aider inside your favorite editor or IDE](https://aider.chat/docs/usage/watch.html).
- Aider works with [most popular languages](https://aider.chat/docs/languages.html): python, javascript, typescript, php, html, css, and more...
- Aider works best with GPT-4o & Claude 3.5 Sonnet and can [connect to almost any LLM](https://aider.chat/docs/llms.html).
- Aider can edit multiple files at once for complex requests.
- Aider uses a [map of your entire git repo](https://aider.chat/docs/repomap.html), which helps it work well in larger codebases.
- Edit files in your editor while chatting with aider,
- Edit files in your editor or IDE while chatting with aider,
and it will always use the latest version.
Pair program with AI.
- [Add images to the chat](https://aider.chat/docs/usage/images-urls.html) (GPT-4o, Claude 3.5 Sonnet, etc).
- [Add URLs to the chat](https://aider.chat/docs/usage/images-urls.html) and aider will read their content.
- [Code with your voice](https://aider.chat/docs/usage/voice.html).
- Aider works best with Claude 3.5 Sonnet, DeepSeek V3, o1 & GPT-4o and can [connect to almost any LLM](https://aider.chat/docs/llms.html).
## Top tier performance
@@ -107,7 +107,7 @@ projects like django, scikitlearn, matplotlib, etc.
- [Configuration](https://aider.chat/docs/config.html)
- [Troubleshooting](https://aider.chat/docs/troubleshooting.html)
- [LLM Leaderboards](https://aider.chat/docs/leaderboards/)
- [GitHub](https://github.com/paul-gauthier/aider)
- [GitHub](https://github.com/Aider-AI/aider)
- [Discord](https://discord.gg/Tv2uQnR88V)
- [Blog](https://aider.chat/blog/)
@@ -118,14 +118,14 @@ projects like django, scikitlearn, matplotlib, etc.
- *The best AI coding assistant so far.* -- [Matthew Berman](https://www.youtube.com/watch?v=df8afeb1FY8)
- *Aider ... has easily quadrupled my coding productivity.* -- [SOLAR_FIELDS](https://news.ycombinator.com/item?id=36212100)
- *It's a cool workflow... Aider's ergonomics are perfect for me.* -- [qup](https://news.ycombinator.com/item?id=38185326)
- *It's really like having your senior developer live right in your Git repo - truly amazing!* -- [rappster](https://github.com/paul-gauthier/aider/issues/124)
- *What an amazing tool. It's incredible.* -- [valyagolev](https://github.com/paul-gauthier/aider/issues/6#issue-1722897858)
- *Aider is such an astounding thing!* -- [cgrothaus](https://github.com/paul-gauthier/aider/issues/82#issuecomment-1631876700)
- *It's really like having your senior developer live right in your Git repo - truly amazing!* -- [rappster](https://github.com/Aider-AI/aider/issues/124)
- *What an amazing tool. It's incredible.* -- [valyagolev](https://github.com/Aider-AI/aider/issues/6#issue-1722897858)
- *Aider is such an astounding thing!* -- [cgrothaus](https://github.com/Aider-AI/aider/issues/82#issuecomment-1631876700)
- *It was WAY faster than I would be getting off the ground and making the first few working versions.* -- [Daniel Feldman](https://twitter.com/d_feldman/status/1662295077387923456)
- *THANK YOU for Aider! It really feels like a glimpse into the future of coding.* -- [derwiki](https://news.ycombinator.com/item?id=38205643)
- *It's just amazing. It is freeing me to do things I felt were out my comfort zone before.* -- [Dougie](https://discord.com/channels/1131200896827654144/1174002618058678323/1174084556257775656)
- *This project is stellar.* -- [funkytaco](https://github.com/paul-gauthier/aider/issues/112#issuecomment-1637429008)
- *Amazing project, definitely the best AI coding assistant I've used.* -- [joshuavial](https://github.com/paul-gauthier/aider/issues/84)
- *This project is stellar.* -- [funkytaco](https://github.com/Aider-AI/aider/issues/112#issuecomment-1637429008)
- *Amazing project, definitely the best AI coding assistant I've used.* -- [joshuavial](https://github.com/Aider-AI/aider/issues/84)
- *I absolutely love using Aider ... It makes software development feel so much lighter as an experience.* -- [principalideal0](https://discord.com/channels/1131200896827654144/1133421607499595858/1229689636012691468)
- *I have been recovering from multiple shoulder surgeries ... and have used aider extensively. It has allowed me to continue productivity.* -- [codeninja](https://www.reddit.com/r/OpenAI/s/nmNwkHy1zG)
- *I am an aider addict. I'm getting so much more work done, but in less time.* -- [dandandan](https://discord.com/channels/1131200896827654144/1131200896827654149/1135913253483069470)

View File

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

250
aider/analytics.py Normal file
View File

@@ -0,0 +1,250 @@
import json
import platform
import sys
import time
import uuid
from pathlib import Path
from mixpanel import MixpanelException
from posthog import Posthog
from aider import __version__
from aider.dump import dump # noqa: F401
from aider.models import model_info_manager
PERCENT = 10
def compute_hex_threshold(percent):
"""Convert percentage to 6-digit hex threshold.
Args:
percent: Percentage threshold (0-100)
Returns:
str: 6-digit hex threshold
"""
return format(int(0xFFFFFF * percent / 100), "06x")
def is_uuid_in_percentage(uuid_str, percent):
"""Check if a UUID string falls within the first X percent of the UUID space.
Args:
uuid_str: UUID string to test
percent: Percentage threshold (0-100)
Returns:
bool: True if UUID falls within the first X percent
"""
if not (0 <= percent <= 100):
raise ValueError("Percentage must be between 0 and 100")
if not uuid_str:
return False
# Convert percentage to hex threshold (1% = "04...", 10% = "1a...", etc)
# Using first 6 hex digits
if percent == 0:
return False
threshold = compute_hex_threshold(percent)
return uuid_str[:6] <= threshold
mixpanel_project_token = "6da9a43058a5d1b9f3353153921fb04d"
posthog_project_api_key = "phc_99T7muzafUMMZX15H8XePbMSreEUzahHbtWjy3l5Qbv"
posthog_host = "https://us.i.posthog.com"
class Analytics:
# providers
mp = None
ph = None
# saved
user_id = None
permanently_disable = None
asked_opt_in = None
# ephemeral
logfile = None
def __init__(self, logfile=None, permanently_disable=False):
self.logfile = logfile
self.get_or_create_uuid()
if self.permanently_disable or permanently_disable or not self.asked_opt_in:
self.disable(permanently_disable)
def enable(self):
if not self.user_id:
self.disable(False)
return
if self.permanently_disable:
self.disable(True)
return
if not self.asked_opt_in:
self.disable(False)
return
# self.mp = Mixpanel(mixpanel_project_token)
self.ph = Posthog(
project_api_key=posthog_project_api_key,
host=posthog_host,
on_error=self.posthog_error,
enable_exception_autocapture=True,
super_properties=self.get_system_info(), # Add system info to all events
)
def disable(self, permanently):
self.mp = None
self.ph = None
if permanently:
self.asked_opt_in = True
self.permanently_disable = True
self.save_data()
def need_to_ask(self, args_analytics):
if args_analytics is False:
return False
could_ask = not self.asked_opt_in and not self.permanently_disable
if not could_ask:
return False
if args_analytics is True:
return True
assert args_analytics is None, args_analytics
if not self.user_id:
return False
return is_uuid_in_percentage(self.user_id, PERCENT)
def get_data_file_path(self):
try:
data_file = Path.home() / ".aider" / "analytics.json"
data_file.parent.mkdir(parents=True, exist_ok=True)
return data_file
except OSError:
# If we can't create/access the directory, just disable analytics
self.disable(permanently=False)
return None
def get_or_create_uuid(self):
self.load_data()
if self.user_id:
return
self.user_id = str(uuid.uuid4())
self.save_data()
def load_data(self):
data_file = self.get_data_file_path()
if not data_file:
return
if data_file.exists():
try:
data = json.loads(data_file.read_text())
self.permanently_disable = data.get("permanently_disable")
self.user_id = data.get("uuid")
self.asked_opt_in = data.get("asked_opt_in", False)
except (json.decoder.JSONDecodeError, OSError):
self.disable(permanently=False)
def save_data(self):
data_file = self.get_data_file_path()
if not data_file:
return
data = dict(
uuid=self.user_id,
permanently_disable=self.permanently_disable,
asked_opt_in=self.asked_opt_in,
)
try:
data_file.write_text(json.dumps(data, indent=4))
except OSError:
# If we can't write the file, just disable analytics
self.disable(permanently=False)
def get_system_info(self):
return {
"python_version": sys.version.split()[0],
"os_platform": platform.system(),
"os_release": platform.release(),
"machine": platform.machine(),
"aider_version": __version__,
}
def _redact_model_name(self, model):
if not model:
return None
info = model_info_manager.get_model_from_cached_json_db(model.name)
if info:
return model.name
elif "/" in model.name:
return model.name.split("/")[0] + "/REDACTED"
return None
def posthog_error(self):
"""disable posthog if we get an error"""
print("X" * 100)
# https://github.com/PostHog/posthog-python/blob/9e1bb8c58afaa229da24c4fb576c08bb88a75752/posthog/consumer.py#L86
# https://github.com/Aider-AI/aider/issues/2532
self.ph = None
def event(self, event_name, main_model=None, **kwargs):
if not self.mp and not self.ph and not self.logfile:
return
properties = {}
if main_model:
properties["main_model"] = self._redact_model_name(main_model)
properties["weak_model"] = self._redact_model_name(main_model.weak_model)
properties["editor_model"] = self._redact_model_name(main_model.editor_model)
properties.update(kwargs)
# Handle numeric values
for key, value in properties.items():
if isinstance(value, (int, float)):
properties[key] = value
else:
properties[key] = str(value)
if self.mp:
try:
self.mp.track(self.user_id, event_name, dict(properties))
except MixpanelException:
self.mp = None # Disable mixpanel on connection errors
if self.ph:
self.ph.capture(self.user_id, event_name, dict(properties))
if self.logfile:
log_entry = {
"event": event_name,
"properties": properties,
"user_id": self.user_id,
"time": int(time.time()),
}
try:
with open(self.logfile, "a") as f:
json.dump(log_entry, f)
f.write("\n")
except OSError:
pass # Ignore OS errors when writing to logfile
if __name__ == "__main__":
dump(compute_hex_threshold(PERCENT))

View File

@@ -25,24 +25,13 @@ def get_parser(default_config_files, git_root):
description="aider is AI pair programming in your terminal",
add_config_file_help=True,
default_config_files=default_config_files,
config_file_parser_class=configargparse.YAMLConfigFileParser,
auto_env_var_prefix="AIDER_",
)
group = parser.add_argument_group("Main")
group = parser.add_argument_group("Main model")
group.add_argument(
"files", metavar="FILE", nargs="*", help="files to edit with an LLM (optional)"
)
group.add_argument(
"--openai-api-key",
metavar="OPENAI_API_KEY",
env_var="OPENAI_API_KEY",
help="Specify the OpenAI API key",
)
group.add_argument(
"--anthropic-api-key",
metavar="ANTHROPIC_API_KEY",
env_var="ANTHROPIC_API_KEY",
help="Specify the Anthropic API key",
)
group.add_argument(
"--model",
metavar="MODEL",
@@ -57,7 +46,7 @@ def get_parser(default_config_files, git_root):
const=opus_model,
help=f"Use {opus_model} model for the main chat",
)
sonnet_model = "claude-3-5-sonnet-20240620"
sonnet_model = "claude-3-5-sonnet-20241022"
group.add_argument(
"--sonnet",
action="store_const",
@@ -65,6 +54,14 @@ def get_parser(default_config_files, git_root):
const=sonnet_model,
help=f"Use {sonnet_model} model for the main chat",
)
haiku_model = "claude-3-5-haiku-20241022"
group.add_argument(
"--haiku",
action="store_const",
dest="model",
const=haiku_model,
help=f"Use {haiku_model} model for the main chat",
)
gpt_4_model = "gpt-4-0613"
group.add_argument(
"--4",
@@ -74,7 +71,7 @@ def get_parser(default_config_files, git_root):
const=gpt_4_model,
help=f"Use {gpt_4_model} model for the main chat",
)
gpt_4o_model = "gpt-4o-2024-08-06"
gpt_4o_model = "gpt-4o"
group.add_argument(
"--4o",
action="store_const",
@@ -109,7 +106,7 @@ def get_parser(default_config_files, git_root):
const=gpt_3_model_name,
help=f"Use {gpt_3_model_name} model for the main chat",
)
deepseek_model = "deepseek/deepseek-coder"
deepseek_model = "deepseek/deepseek-chat"
group.add_argument(
"--deepseek",
action="store_const",
@@ -117,45 +114,77 @@ def get_parser(default_config_files, git_root):
const=deepseek_model,
help=f"Use {deepseek_model} model for the main chat",
)
o1_mini_model = "o1-mini"
group.add_argument(
"--o1-mini",
action="store_const",
dest="model",
const=o1_mini_model,
help=f"Use {o1_mini_model} model for the main chat",
)
o1_preview_model = "o1-preview"
group.add_argument(
"--o1-preview",
action="store_const",
dest="model",
const=o1_preview_model,
help=f"Use {o1_preview_model} model for the main chat",
)
##########
group = parser.add_argument_group("Model Settings")
group = parser.add_argument_group("API Keys and settings")
group.add_argument(
"--openai-api-key",
help="Specify the OpenAI API key",
)
group.add_argument(
"--anthropic-api-key",
help="Specify the Anthropic API key",
)
group.add_argument(
"--openai-api-base",
help="Specify the api base url",
)
group.add_argument(
"--openai-api-type",
help="(deprecated, use --set-env OPENAI_API_TYPE=<value>)",
)
group.add_argument(
"--openai-api-version",
help="(deprecated, use --set-env OPENAI_API_VERSION=<value>)",
)
group.add_argument(
"--openai-api-deployment-id",
help="(deprecated, use --set-env OPENAI_API_DEPLOYMENT_ID=<value>)",
)
group.add_argument(
"--openai-organization-id",
help="(deprecated, use --set-env OPENAI_ORGANIZATION=<value>)",
)
group.add_argument(
"--set-env",
action="append",
metavar="ENV_VAR_NAME=value",
help="Set an environment variable (to control API settings, can be used multiple times)",
default=[],
)
group.add_argument(
"--api-key",
action="append",
metavar="PROVIDER=KEY",
help=(
"Set an API key for a provider (eg: --api-key provider=<key> sets"
" PROVIDER_API_KEY=<key>)"
),
default=[],
)
group = parser.add_argument_group("Model settings")
group.add_argument(
"--list-models",
"--models",
metavar="MODEL",
help="List known models which match the (partial) MODEL name",
)
group.add_argument(
"--openai-api-base",
metavar="OPENAI_API_BASE",
env_var="OPENAI_API_BASE",
help="Specify the api base url",
)
group.add_argument(
"--openai-api-type",
metavar="OPENAI_API_TYPE",
env_var="OPENAI_API_TYPE",
help="Specify the api_type",
)
group.add_argument(
"--openai-api-version",
metavar="OPENAI_API_VERSION",
env_var="OPENAI_API_VERSION",
help="Specify the api_version",
)
group.add_argument(
"--openai-api-deployment-id",
metavar="OPENAI_API_DEPLOYMENT_ID",
env_var="OPENAI_API_DEPLOYMENT_ID",
help="Specify the deployment_id",
)
group.add_argument(
"--openai-organization-id",
metavar="OPENAI_ORGANIZATION_ID",
env_var="OPENAI_ORGANIZATION_ID",
help="Specify the OpenAI organization ID",
)
group.add_argument(
"--model-settings-file",
metavar="MODEL_SETTINGS_FILE",
@@ -168,12 +197,24 @@ def get_parser(default_config_files, git_root):
default=".aider.model.metadata.json",
help="Specify a file with context window and costs for unknown models",
)
group.add_argument(
"--alias",
action="append",
metavar="ALIAS:MODEL",
help="Add a model alias (can be used multiple times)",
)
group.add_argument(
"--verify-ssl",
action=argparse.BooleanOptionalAction,
default=True,
help="Verify the SSL cert when connecting to models (default: True)",
)
group.add_argument(
"--timeout",
type=int,
default=None,
help="Timeout in seconds for API calls (default: None)",
)
group.add_argument(
"--edit-format",
"--chat-mode",
@@ -181,6 +222,13 @@ def get_parser(default_config_files, git_root):
default=None,
help="Specify what edit format the LLM should use (default depends on model)",
)
group.add_argument(
"--architect",
action="store_const",
dest="edit_format",
const="architect",
help="Use architect edit format for the main chat",
)
group.add_argument(
"--weak-model",
metavar="WEAK_MODEL",
@@ -190,6 +238,18 @@ def get_parser(default_config_files, git_root):
" depends on --model)"
),
)
group.add_argument(
"--editor-model",
metavar="EDITOR_MODEL",
default=None,
help="Specify the model to use for editor tasks (default depends on --model)",
)
group.add_argument(
"--editor-edit-format",
metavar="EDITOR_EDIT_FORMAT",
default=None,
help="Specify the edit format for the editor model (default: depends on editor model)",
)
group.add_argument(
"--show-model-warnings",
action=argparse.BooleanOptionalAction,
@@ -197,17 +257,17 @@ def get_parser(default_config_files, git_root):
help="Only work with models that have meta-data available (default: True)",
)
group.add_argument(
"--map-tokens",
"--max-chat-history-tokens",
type=int,
default=None,
help="Suggested number of tokens to use for repo map, use 0 to disable (default: 1024)",
)
group.add_argument(
"--map-refresh",
choices=["auto", "always", "files", "manual"],
default="auto",
help="Control how often the repo map is refreshed (default: auto)",
help=(
"Soft limit on tokens for chat history, after which summarization begins."
" If unspecified, defaults to the model's max_chat_history_tokens."
),
)
##########
group = parser.add_argument_group("Cache settings")
group.add_argument(
"--cache-prompts",
action=argparse.BooleanOptionalAction,
@@ -220,29 +280,30 @@ def get_parser(default_config_files, git_root):
default=0,
help="Number of times to ping at 5min intervals to keep prompt cache warm (default: 0)",
)
##########
group = parser.add_argument_group("Repomap settings")
group.add_argument(
"--map-tokens",
type=int,
default=None,
help="Suggested number of tokens to use for repo map, use 0 to disable",
)
group.add_argument(
"--map-refresh",
choices=["auto", "always", "files", "manual"],
default="auto",
help=(
"Control how often the repo map is refreshed. Options: auto, always, files, manual"
" (default: auto)"
),
)
group.add_argument(
"--map-multiplier-no-files",
type=float,
default=2,
help="Multiplier for map tokens when no files are specified (default: 2)",
)
group.add_argument(
"--max-chat-history-tokens",
type=int,
default=None,
help=(
"Maximum number of tokens to use for chat history. If not specified, uses the model's"
" max_chat_history_tokens."
),
)
# This is a duplicate of the argument in the preparser and is a no-op by this time of
# argument parsing, but it's here so that the help is displayed as expected.
group.add_argument(
"--env-file",
metavar="ENV_FILE",
default=default_env_file(git_root),
help="Specify the .env file to load (default: .env in git root)",
)
##########
group = parser.add_argument_group("History Files")
@@ -278,7 +339,7 @@ def get_parser(default_config_files, git_root):
)
##########
group = parser.add_argument_group("Output Settings")
group = parser.add_argument_group("Output settings")
group.add_argument(
"--dark-mode",
action="store_true",
@@ -328,12 +389,46 @@ def get_parser(default_config_files, git_root):
default="#0088ff",
help="Set the color for assistant output (default: #0088ff)",
)
group.add_argument(
"--completion-menu-color",
metavar="COLOR",
default=None,
help="Set the color for the completion menu (default: terminal's default text color)",
)
group.add_argument(
"--completion-menu-bg-color",
metavar="COLOR",
default=None,
help=(
"Set the background color for the completion menu (default: terminal's default"
" background color)"
),
)
group.add_argument(
"--completion-menu-current-color",
metavar="COLOR",
default=None,
help=(
"Set the color for the current item in the completion menu (default: terminal's default"
" background color)"
),
)
group.add_argument(
"--completion-menu-current-bg-color",
metavar="COLOR",
default=None,
help=(
"Set the background color for the current item in the completion menu (default:"
" terminal's default text color)"
),
)
group.add_argument(
"--code-theme",
default="default",
help=(
"Set the markdown code theme (default: default, other options include monokai,"
" solarized-dark, solarized-light)"
" solarized-dark, solarized-light, or a Pygments builtin style,"
" see https://pygments.org/styles for available themes)"
),
)
group.add_argument(
@@ -344,7 +439,7 @@ def get_parser(default_config_files, git_root):
)
##########
group = parser.add_argument_group("Git Settings")
group = parser.add_argument_group("Git settings")
group.add_argument(
"--git",
action=argparse.BooleanOptionalAction,
@@ -425,6 +520,18 @@ def get_parser(default_config_files, git_root):
default=False,
help="Perform a dry run without modifying files (default: False)",
)
group.add_argument(
"--skip-sanity-check-repo",
action="store_true",
help="Skip the sanity check for the git repository (default: False)",
default=False,
)
group.add_argument(
"--watch-files",
action=argparse.BooleanOptionalAction,
default=False,
help="Enable/disable watching files for ai coding comments (default: False)",
)
group = parser.add_argument_group("Fixing and committing")
group.add_argument(
"--lint",
@@ -461,48 +568,32 @@ def get_parser(default_config_files, git_root):
group.add_argument(
"--test",
action="store_true",
help="Run tests and fix problems found",
help="Run tests, fix problems found and then exit",
default=False,
)
##########
group = parser.add_argument_group("Other Settings")
group = parser.add_argument_group("Analytics")
group.add_argument(
"--file",
action="append",
metavar="FILE",
help="specify a file to edit (can be used multiple times)",
"--analytics",
action=argparse.BooleanOptionalAction,
default=None,
help="Enable/disable analytics for current session (default: random)",
)
group.add_argument(
"--read",
action="append",
metavar="FILE",
help="specify a read-only file (can be used multiple times)",
"--analytics-log",
metavar="ANALYTICS_LOG_FILE",
help="Specify a file to log analytics events",
)
group.add_argument(
"--vim",
"--analytics-disable",
action="store_true",
help="Use VI editing mode in the terminal (default: False)",
help="Permanently disable analytics",
default=False,
)
group.add_argument(
"--voice-language",
metavar="VOICE_LANGUAGE",
default="en",
help="Specify the language for voice using ISO 639-1 code (default: auto)",
)
group.add_argument(
"--chat-language",
metavar="CHAT_LANGUAGE",
default=None,
help="Specify the language to use in the chat (default: None, uses system settings)",
)
group.add_argument(
"--version",
action="version",
version=f"%(prog)s {__version__}",
help="Show the version number and exit",
)
#########
group = parser.add_argument_group("Upgrading")
group.add_argument(
"--just-check-update",
action="store_true",
@@ -515,6 +606,12 @@ def get_parser(default_config_files, git_root):
help="Check for new aider versions on launch",
default=True,
)
group.add_argument(
"--show-release-notes",
action=argparse.BooleanOptionalAction,
help="Show release notes on first run of new version (default: None, ask user)",
default=None,
)
group.add_argument(
"--install-main-branch",
action="store_true",
@@ -529,41 +626,14 @@ def get_parser(default_config_files, git_root):
default=False,
)
group.add_argument(
"--apply",
metavar="FILE",
help="Apply the changes from the given file instead of running the chat (debug)",
)
group.add_argument(
"--yes",
action="store_true",
help="Always say yes to every confirmation",
default=None,
)
group.add_argument(
"-v",
"--verbose",
action="store_true",
help="Enable verbose output",
default=False,
)
group.add_argument(
"--show-repo-map",
action="store_true",
help="Print the repo map and exit (debug)",
default=False,
)
group.add_argument(
"--show-prompts",
action="store_true",
help="Print the system prompts and exit (debug)",
default=False,
)
group.add_argument(
"--exit",
action="store_true",
help="Do all startup activities then exit before accepting user input (debug)",
default=False,
"--version",
action="version",
version=f"%(prog)s {__version__}",
help="Show the version number and exit",
)
##########
group = parser.add_argument_group("Modes")
group.add_argument(
"--message",
"--msg",
@@ -582,6 +652,115 @@ def get_parser(default_config_files, git_root):
" (disables chat mode)"
),
)
group.add_argument(
"--gui",
"--browser",
action=argparse.BooleanOptionalAction,
help="Run aider in your browser (default: False)",
default=False,
)
group.add_argument(
"--copy-paste",
action=argparse.BooleanOptionalAction,
default=False,
help="Enable automatic copy/paste of chat between aider and web UI (default: False)",
)
group.add_argument(
"--apply",
metavar="FILE",
help="Apply the changes from the given file instead of running the chat (debug)",
)
group.add_argument(
"--apply-clipboard-edits",
action="store_true",
help="Apply clipboard contents as edits using the main model's editor format",
default=False,
)
group.add_argument(
"--exit",
action="store_true",
help="Do all startup activities then exit before accepting user input (debug)",
default=False,
)
group.add_argument(
"--show-repo-map",
action="store_true",
help="Print the repo map and exit (debug)",
default=False,
)
group.add_argument(
"--show-prompts",
action="store_true",
help="Print the system prompts and exit (debug)",
default=False,
)
##########
group = parser.add_argument_group("Voice settings")
group.add_argument(
"--voice-format",
metavar="VOICE_FORMAT",
default="wav",
choices=["wav", "mp3", "webm"],
help="Audio format for voice recording (default: wav). webm and mp3 require ffmpeg",
)
group.add_argument(
"--voice-language",
metavar="VOICE_LANGUAGE",
default="en",
help="Specify the language for voice using ISO 639-1 code (default: auto)",
)
group.add_argument(
"--voice-input-device",
metavar="VOICE_INPUT_DEVICE",
default=None,
help="Specify the input device name for voice recording",
)
######
group = parser.add_argument_group("Other settings")
group.add_argument(
"--file",
action="append",
metavar="FILE",
help="specify a file to edit (can be used multiple times)",
)
group.add_argument(
"--read",
action="append",
metavar="FILE",
help="specify a read-only file (can be used multiple times)",
)
group.add_argument(
"--vim",
action="store_true",
help="Use VI editing mode in the terminal (default: False)",
default=False,
)
group.add_argument(
"--chat-language",
metavar="CHAT_LANGUAGE",
default=None,
help="Specify the language to use in the chat (default: None, uses system settings)",
)
group.add_argument(
"--yes-always",
action="store_true",
help="Always say yes to every confirmation",
default=None,
)
group.add_argument(
"-v",
"--verbose",
action="store_true",
help="Enable verbose output",
default=False,
)
group.add_argument(
"--load",
metavar="LOAD_FILE",
help="Load and execute /commands from a file on launch",
)
group.add_argument(
"--encoding",
default="utf-8",
@@ -597,12 +776,13 @@ def get_parser(default_config_files, git_root):
" or home directory)"
),
)
# This is a duplicate of the argument in the preparser and is a no-op by this time of
# argument parsing, but it's here so that the help is displayed as expected.
group.add_argument(
"--gui",
"--browser",
action="store_true",
help="Run aider in your browser",
default=False,
"--env-file",
metavar="ENV_FILE",
default=default_env_file(git_root),
help="Specify the .env file to load (default: .env in git root)",
)
group.add_argument(
"--suggest-shell-commands",
@@ -610,6 +790,28 @@ def get_parser(default_config_files, git_root):
default=True,
help="Enable/disable suggesting shell commands (default: True)",
)
group.add_argument(
"--fancy-input",
action=argparse.BooleanOptionalAction,
default=True,
help="Enable/disable fancy input with history and completion (default: True)",
)
group.add_argument(
"--multiline",
action=argparse.BooleanOptionalAction,
default=False,
help="Enable/disable multi-line input mode with Meta-Enter to submit (default: False)",
)
group.add_argument(
"--detect-urls",
action=argparse.BooleanOptionalAction,
default=True,
help="Enable/disable detection and offering to add URLs to chat (default: True)",
)
group.add_argument(
"--editor",
help="Specify which editor to use for the /editor command",
)
return parser
@@ -625,7 +827,6 @@ def get_md_help():
parser.formatter_class = MarkdownHelpFormatter
return argparse.ArgumentParser.format_help(parser)
return parser.format_help()
def get_sample_yaml():
@@ -639,7 +840,6 @@ def get_sample_yaml():
parser.formatter_class = YamlHelpFormatter
return argparse.ArgumentParser.format_help(parser)
return parser.format_help()
def get_sample_dotenv():
@@ -653,7 +853,6 @@ def get_sample_dotenv():
parser.formatter_class = DotEnvFormatter
return argparse.ArgumentParser.format_help(parser)
return parser.format_help()
def main():

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,9 +17,12 @@ from collections import defaultdict
from datetime import datetime
from json.decoder import JSONDecodeError
from pathlib import Path
from typing import List
from aider import __version__, models, prompts, urls, utils
from aider.analytics import Analytics
from aider.commands import Commands
from aider.exceptions import LiteLLMExceptions
from aider.history import ChatSummary
from aider.io import ConfirmGroup, InputOutput
from aider.linter import Linter
@@ -27,13 +30,22 @@ from aider.llm import litellm
from aider.repo import ANY_GIT_ERROR, GitRepo
from aider.repomap import RepoMap
from aider.run_cmd import run_cmd
from aider.sendchat import retry_exceptions, send_completion
from aider.sendchat import RETRY_TIMEOUT, send_completion
from aider.utils import format_content, format_messages, format_tokens, is_image_file
from ..dump import dump # noqa: F401
from .chat_chunks import ChatChunks
class UnknownEditFormat(ValueError):
def __init__(self, edit_format, valid_formats):
self.edit_format = edit_format
self.valid_formats = valid_formats
super().__init__(
f"Unknown edit format {edit_format}. Valid formats are: {', '.join(valid_formats)}"
)
class MissingAPIKeyError(ValueError):
pass
@@ -47,7 +59,8 @@ def wrap_fence(name):
all_fences = [
("``" + "`", "``" + "`"),
("`" * 3, "`" * 3),
("`" * 4, "`" * 4),
wrap_fence("source"),
wrap_fence("code"),
wrap_fence("pre"),
@@ -88,8 +101,10 @@ class Coder:
cache_warming_thread = None
num_cache_warming_pings = 0
suggest_shell_commands = True
detect_urls = True
ignore_mentions = None
chat_language = None
file_watcher = None
@classmethod
def create(
@@ -140,8 +155,9 @@ class Coder:
aider_commit_hashes=from_coder.aider_commit_hashes,
commands=from_coder.commands.clone(),
total_cost=from_coder.total_cost,
ignore_mentions=from_coder.ignore_mentions,
file_watcher=from_coder.file_watcher,
)
use_kwargs.update(update) # override to complete the switch
use_kwargs.update(kwargs) # override passed kwargs
@@ -153,11 +169,15 @@ class Coder:
res.original_kwargs = dict(kwargs)
return res
raise ValueError(f"Unknown edit format {edit_format}")
valid_formats = [
str(c.edit_format)
for c in coders.__all__
if hasattr(c, "edit_format") and c.edit_format is not None
]
raise UnknownEditFormat(edit_format, valid_formats)
def clone(self, **kwargs):
new_coder = Coder.create(from_coder=self, **kwargs)
new_coder.ignore_mentions = self.ignore_mentions
return new_coder
def get_announcements(self):
@@ -180,6 +200,13 @@ class Coder:
output += ", infinite output"
lines.append(output)
if self.edit_format == "architect":
output = (
f"Editor model: {main_model.editor_model.name} with"
f" {main_model.editor_edit_format} edit format"
)
lines.append(output)
if weak_model is not main_model:
output = f"Weak model: {weak_model.name}"
lines.append(output)
@@ -204,10 +231,10 @@ class Coder:
if map_tokens > 0:
refresh = self.repo_map.refresh
lines.append(f"Repo-map: using {map_tokens} tokens, {refresh} refresh")
max_map_tokens = 2048
max_map_tokens = self.main_model.get_repo_map_tokens() * 2
if map_tokens > max_map_tokens:
lines.append(
f"Warning: map-tokens > {max_map_tokens} is not recommended as too much"
f"Warning: map-tokens > {max_map_tokens} is not recommended. Too much"
" irrelevant code can confuse LLMs."
)
else:
@@ -219,9 +246,16 @@ class Coder:
for fname in self.get_inchat_relative_files():
lines.append(f"Added {fname} to the chat.")
for fname in self.abs_read_only_fnames:
rel_fname = self.get_rel_fname(fname)
lines.append(f"Added {rel_fname} to the chat (read-only).")
if self.done_messages:
lines.append("Restored previous conversation history.")
if self.io.multiline_mode:
lines.append("Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text")
return lines
def __init__(
@@ -251,20 +285,39 @@ class Coder:
commands=None,
summarizer=None,
total_cost=0.0,
analytics=None,
map_refresh="auto",
cache_prompts=False,
num_cache_warming_pings=0,
suggest_shell_commands=True,
chat_language=None,
detect_urls=True,
ignore_mentions=None,
file_watcher=None,
auto_copy_context=False,
):
# Fill in a dummy Analytics if needed, but it is never .enable()'d
self.analytics = analytics if analytics is not None else Analytics()
self.event = self.analytics.event
self.chat_language = chat_language
self.commit_before_message = []
self.aider_commit_hashes = set()
self.rejected_urls = set()
self.abs_root_path_cache = {}
self.ignore_mentions = set()
self.auto_copy_context = auto_copy_context
self.ignore_mentions = ignore_mentions
if not self.ignore_mentions:
self.ignore_mentions = set()
self.file_watcher = file_watcher
if self.file_watcher:
self.file_watcher.coder = self
self.suggest_shell_commands = suggest_shell_commands
self.detect_urls = detect_urls
self.num_cache_warming_pings = num_cache_warming_pings
@@ -300,7 +353,6 @@ class Coder:
self.done_messages = []
self.io = io
self.stream = stream
self.shell_commands = []
@@ -315,6 +367,8 @@ class Coder:
self.main_model = main_model
self.stream = stream and main_model.streaming
if cache_prompts and self.main_model.cache_control:
self.add_cache_headers = True
@@ -340,6 +394,9 @@ class Coder:
for fname in fnames:
fname = Path(fname)
if self.repo and self.repo.git_ignored_file(fname):
self.io.tool_warning(f"Skipping {fname} that matches gitignore spec.")
if self.repo and self.repo.ignored_file(fname):
self.io.tool_warning(f"Skipping {fname} that matches aiderignore spec.")
continue
@@ -468,7 +525,7 @@ class Coder:
return False
# only show pretty output if fences are the normal triple-backtick
if self.fence != self.fences[0]:
if self.fence[0][0] != "`":
return False
return True
@@ -562,9 +619,19 @@ class Coder:
def get_ident_filename_matches(self, idents):
all_fnames = defaultdict(set)
for fname in self.get_all_relative_files():
base = Path(fname).with_suffix("").name.lower()
if len(base) >= 5:
all_fnames[base].add(fname)
# Skip empty paths or just '.'
if not fname or fname == ".":
continue
try:
# Handle dotfiles properly
path = Path(fname)
base = path.stem.lower() # Use stem instead of with_suffix("").name
if len(base) >= 5:
all_fnames[base].add(fname)
except ValueError:
# Skip paths that can't be processed
continue
matches = set()
for ident in idents:
@@ -630,6 +697,8 @@ class Coder:
def get_readonly_files_messages(self):
readonly_messages = []
# Handle non-image files
read_only_content = self.get_read_only_files_content()
if read_only_content:
readonly_messages += [
@@ -641,6 +710,15 @@ class Coder:
content="Ok, I will use these files as references.",
),
]
# Handle image files
images_message = self.get_images_message(self.abs_read_only_fnames)
if images_message is not None:
readonly_messages += [
images_message,
dict(role="assistant", content="Ok, I will use these images as references."),
]
return readonly_messages
def get_chat_files_messages(self):
@@ -648,7 +726,7 @@ class Coder:
if self.abs_fnames:
files_content = self.gpt_prompts.files_content_prefix
files_content += self.get_files_content()
files_reply = "Ok, any changes I propose will be to those files."
files_reply = self.gpt_prompts.files_content_assistant_reply
elif self.get_repo_map() and self.gpt_prompts.files_no_full_files_with_repo_map:
files_content = self.gpt_prompts.files_no_full_files_with_repo_map
files_reply = self.gpt_prompts.files_no_full_files_with_repo_map_reply
@@ -662,7 +740,7 @@ class Coder:
dict(role="assistant", content=files_reply),
]
images_message = self.get_images_message()
images_message = self.get_images_message(self.abs_fnames)
if images_message is not None:
chat_files_messages += [
images_message,
@@ -671,23 +749,42 @@ class Coder:
return chat_files_messages
def get_images_message(self):
if not self.main_model.accepts_images:
def get_images_message(self, fnames):
supports_images = self.main_model.info.get("supports_vision")
supports_pdfs = self.main_model.info.get("supports_pdf_input") or self.main_model.info.get(
"max_pdf_size_mb"
)
# https://github.com/BerriAI/litellm/pull/6928
supports_pdfs = supports_pdfs or "claude-3-5-sonnet-20241022" in self.main_model.name
if not (supports_images or supports_pdfs):
return None
image_messages = []
for fname, content in self.get_abs_fnames_content():
if is_image_file(fname):
with open(fname, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
mime_type, _ = mimetypes.guess_type(fname)
if mime_type and mime_type.startswith("image/"):
image_url = f"data:{mime_type};base64,{encoded_string}"
rel_fname = self.get_rel_fname(fname)
image_messages += [
{"type": "text", "text": f"Image file: {rel_fname}"},
{"type": "image_url", "image_url": {"url": image_url, "detail": "high"}},
]
for fname in fnames:
if not is_image_file(fname):
continue
mime_type, _ = mimetypes.guess_type(fname)
if not mime_type:
continue
with open(fname, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
image_url = f"data:{mime_type};base64,{encoded_string}"
rel_fname = self.get_rel_fname(fname)
if mime_type.startswith("image/") and supports_images:
image_messages += [
{"type": "text", "text": f"Image file: {rel_fname}"},
{"type": "image_url", "image_url": {"url": image_url, "detail": "high"}},
]
elif mime_type == "application/pdf" and supports_pdfs:
image_messages += [
{"type": "text", "text": f"PDF file: {rel_fname}"},
{"type": "image_url", "image_url": image_url},
]
if not image_messages:
return None
@@ -706,6 +803,7 @@ class Coder:
self.lint_outcome = None
self.test_outcome = None
self.shell_commands = []
self.message_cost = 0
if self.repo:
self.commit_before_message.append(self.repo.get_head_commit_sha())
@@ -716,9 +814,10 @@ class Coder:
self.io.user_input(with_message)
self.run_one(with_message, preproc)
return self.partial_response_content
while True:
try:
if not self.io.placeholder:
self.copy_context()
user_message = self.get_input()
self.run_one(user_message, preproc)
self.show_undo_hint()
@@ -727,6 +826,10 @@ class Coder:
except EOFError:
return
def copy_context(self):
if self.auto_copy_context:
self.commands.cmd_copy_context()
def get_input(self):
inchat_files = self.get_inchat_relative_files()
read_only_files = [self.get_rel_fname(fname) for fname in self.abs_read_only_fnames]
@@ -749,7 +852,7 @@ class Coder:
return self.commands.run(inp)
self.check_for_file_mentions(inp)
self.check_for_urls(inp)
inp = self.check_for_urls(inp)
return inp
@@ -775,21 +878,43 @@ class Coder:
self.num_reflections += 1
message = self.reflected_message
def check_for_urls(self, inp):
def check_and_open_urls(self, exc, friendly_msg=None):
"""Check exception for URLs, offer to open in a browser, with user-friendly error msgs."""
text = str(exc)
if friendly_msg:
self.io.tool_warning(text)
self.io.tool_error(f"{friendly_msg}")
else:
self.io.tool_error(text)
url_pattern = re.compile(r"(https?://[^\s/$.?#].[^\s]*)")
urls = list(set(url_pattern.findall(text))) # Use set to remove duplicates
for url in urls:
url = url.rstrip(".',\"")
self.io.offer_url(url)
return urls
def check_for_urls(self, inp: str) -> List[str]:
"""Check input for URLs and offer to add them to the chat."""
if not self.detect_urls:
return inp
url_pattern = re.compile(r"(https?://[^\s/$.?#].[^\s]*[^\s,.])")
urls = list(set(url_pattern.findall(inp))) # Use set to remove duplicates
added_urls = []
group = ConfirmGroup(urls)
for url in urls:
if url not in self.rejected_urls:
if self.io.confirm_ask("Add URL to the chat?", subject=url, group=group):
url = url.rstrip(".',\"")
if self.io.confirm_ask(
"Add URL to the chat?", subject=url, group=group, allow_never=True
):
inp += "\n\n"
inp += self.commands.cmd_web(url)
added_urls.append(url)
inp += self.commands.cmd_web(url, return_content=True)
else:
self.rejected_urls.add(url)
return added_urls
return inp
def keyboard_interrupt(self):
now = time.time()
@@ -797,6 +922,7 @@ class Coder:
thresh = 2 # seconds
if self.last_keyboard_interrupt and now - self.last_keyboard_interrupt < thresh:
self.io.tool_warning("\n\n^C KeyboardInterrupt")
self.event("exit", reason="Control-C")
sys.exit()
self.io.tool_warning("\n\n^C again to exit")
@@ -920,12 +1046,18 @@ class Coder:
platform=platform_text
)
if self.chat_language:
language = self.chat_language
else:
language = "the same language they are using"
prompt = prompt.format(
fence=self.fence,
lazy_prompt=lazy_prompt,
platform=platform_text,
shell_cmd_prompt=shell_cmd_prompt,
shell_cmd_reminder=shell_cmd_reminder,
language=language,
)
return prompt
@@ -1009,18 +1141,21 @@ class Coder:
# add the reminder anyway
total_tokens = 0
final = chunks.cur[-1]
if chunks.cur:
final = chunks.cur[-1]
else:
final = None
max_input_tokens = self.main_model.info.get("max_input_tokens") or 0
# Add the reminder prompt if we still have room to include it.
if (
max_input_tokens is None
not max_input_tokens
or total_tokens < max_input_tokens
and self.gpt_prompts.system_reminder
):
if self.main_model.reminder == "sys":
chunks.reminder = reminder_message
elif self.main_model.reminder == "user" and final["role"] == "user":
elif self.main_model.reminder == "user" and final and final["role"] == "user":
# stuff it into the user message
new_content = (
final["content"]
@@ -1064,13 +1199,15 @@ class Coder:
self.warming_pings_left -= 1
self.next_cache_warm = time.time() + delay
kwargs = dict(self.main_model.extra_params) or dict()
kwargs["max_tokens"] = 1
try:
completion = litellm.completion(
model=self.main_model.name,
messages=self.cache_warming_chunks.cacheable_messages(),
stream=False,
max_tokens=1,
extra_headers=self.main_model.extra_headers,
**kwargs,
)
except Exception as err:
self.io.tool_warning(f"Cache warming error: {str(err)}")
@@ -1090,6 +1227,8 @@ class Coder:
return chunks
def send_message(self, inp):
self.event("message_send_starting")
self.cur_messages += [
dict(role="user", content=inp),
]
@@ -1102,10 +1241,15 @@ class Coder:
utils.show_messages(messages, functions=self.functions)
self.multi_response_content = ""
self.mdstream = self.io.assistant_output("", self.stream)
if self.show_pretty() and self.stream:
self.mdstream = self.io.get_assistant_mdstream()
else:
self.mdstream = None
retry_delay = 0.125
litellm_ex = LiteLLMExceptions()
self.usage_report = None
exhausted = False
interrupted = False
@@ -1114,24 +1258,37 @@ class Coder:
try:
yield from self.send(messages, functions=self.functions)
break
except retry_exceptions() as err:
self.io.tool_warning(str(err))
retry_delay *= 2
if retry_delay > 60:
except litellm_ex.exceptions_tuple() as err:
ex_info = litellm_ex.get_ex_info(err)
if ex_info.name == "ContextWindowExceededError":
exhausted = True
break
should_retry = ex_info.retry
if should_retry:
retry_delay *= 2
if retry_delay > RETRY_TIMEOUT:
should_retry = False
if not should_retry:
self.mdstream = None
self.check_and_open_urls(err, ex_info.description)
break
err_msg = str(err)
if ex_info.description:
self.io.tool_warning(err_msg)
self.io.tool_error(ex_info.description)
else:
self.io.tool_error(err_msg)
self.io.tool_output(f"Retrying in {retry_delay:.1f} seconds...")
time.sleep(retry_delay)
continue
except KeyboardInterrupt:
interrupted = True
break
except litellm.ContextWindowExceededError:
# The input is overflowing the context window!
exhausted = True
break
except litellm.exceptions.BadRequestError as br_err:
self.io.tool_error(f"BadRequestError: {br_err}")
return
except FinishReasonLength:
# We hit the output limit!
if not self.main_model.info.get("supports_assistant_prefill"):
@@ -1147,9 +1304,11 @@ class Coder:
dict(role="assistant", content=self.multi_response_content, prefix=True)
)
except Exception as err:
self.io.tool_error(f"Unexpected error: {err}")
self.mdstream = None
lines = traceback.format_exception(type(err), err, err.__traceback__)
self.io.tool_error("".join(lines))
self.io.tool_warning("".join(lines))
self.io.tool_error(str(err))
self.event("message_send_exception", exception=str(err))
return
finally:
if self.mdstream:
@@ -1179,6 +1338,20 @@ class Coder:
else:
content = ""
if not interrupted:
add_rel_files_message = self.check_for_file_mentions(content)
if add_rel_files_message:
if self.reflected_message:
self.reflected_message += "\n\n" + add_rel_files_message
else:
self.reflected_message = add_rel_files_message
return
try:
self.reply_completed()
except KeyboardInterrupt:
interrupted = True
if interrupted:
content += "\n^C KeyboardInterrupt"
self.cur_messages += [dict(role="assistant", content=content)]
@@ -1228,12 +1401,8 @@ class Coder:
self.update_cur_messages()
return
add_rel_files_message = self.check_for_file_mentions(content)
if add_rel_files_message:
if self.reflected_message:
self.reflected_message += "\n\n" + add_rel_files_message
else:
self.reflected_message = add_rel_files_message
def reply_completed(self):
pass
def show_exhausted_error(self):
output_tokens = 0
@@ -1274,9 +1443,7 @@ class Coder:
res.append("- Ask for smaller changes in each request.")
res.append("- Break your code into smaller source files.")
if "diff" not in self.main_model.edit_format:
res.append(
"- Use a stronger model like gpt-4o, sonnet or opus that can return diffs."
)
res.append("- Use a stronger model that can return diffs.")
if input_tokens >= max_input_tokens or total_tokens >= max_input_tokens:
res.append("")
@@ -1286,15 +1453,15 @@ class Coder:
res.append("- Use /clear to clear the chat history.")
res.append("- Break your code into smaller source files.")
res.append("")
res.append(f"For more info: {urls.token_limits}")
res = "".join([line + "\n" for line in res])
self.io.tool_error(res)
self.io.offer_url(urls.token_limits)
def lint_edited(self, fnames):
res = ""
for fname in fnames:
if not fname:
continue
errors = self.linter.lint(self.abs_root_path(fname))
if errors:
@@ -1323,7 +1490,7 @@ class Coder:
words = set(word for word in content.split())
# drop sentence punctuation from the end
words = set(word.rstrip(",.!;:") for word in words)
words = set(word.rstrip(",.!;:?") for word in words)
# strip away all kinds of quotes
quotes = "".join(['"', "'", "`"])
@@ -1331,9 +1498,18 @@ class Coder:
addable_rel_fnames = self.get_addable_relative_files()
# Get basenames of files already in chat or read-only
existing_basenames = {os.path.basename(f) for f in self.get_inchat_relative_files()} | {
os.path.basename(self.get_rel_fname(f)) for f in self.abs_read_only_fnames
}
mentioned_rel_fnames = set()
fname_to_rel_fnames = {}
for rel_fname in addable_rel_fnames:
# Skip files that share a basename with files already in chat
if os.path.basename(rel_fname) in existing_basenames:
continue
normalized_rel_fname = rel_fname.replace("\\", "/")
normalized_words = set(word.replace("\\", "/") for word in words)
if normalized_rel_fname in normalized_words:
@@ -1364,7 +1540,7 @@ class Coder:
added_fnames = []
group = ConfirmGroup(new_mentions)
for rel_fname in sorted(new_mentions):
if self.io.confirm_ask(f"Add {rel_fname} to the chat?", group=group):
if self.io.confirm_ask(f"Add {rel_fname} to the chat?", group=group, allow_never=True):
self.add_rel_fname(rel_fname)
added_fnames.append(rel_fname)
else:
@@ -1395,8 +1571,7 @@ class Coder:
functions,
self.stream,
temp,
extra_headers=model.extra_headers,
max_tokens=model.max_tokens,
extra_params=model.extra_params,
)
self.chat_completion_call_hashes.append(hash_object.hexdigest())
@@ -1404,6 +1579,16 @@ class Coder:
yield from self.show_send_output_stream(completion)
else:
self.show_send_output(completion)
# Calculate costs for successful responses
self.calculate_and_show_tokens_and_cost(messages, completion)
except LiteLLMExceptions().exceptions_tuple() as err:
ex_info = LiteLLMExceptions().get_ex_info(err)
if ex_info.name == "ContextWindowExceededError":
# Still calculate costs for context window errors
self.calculate_and_show_tokens_and_cost(messages, completion)
raise
except KeyboardInterrupt as kbi:
self.keyboard_interrupt()
raise kbi
@@ -1421,8 +1606,6 @@ class Coder:
if args:
self.io.ai_output(json.dumps(args, indent=4))
self.calculate_and_show_tokens_and_cost(messages, completion)
def show_send_output(self, completion):
if self.verbose:
print(completion)
@@ -1459,7 +1642,7 @@ class Coder:
raise Exception("No data found in LLM response!")
show_resp = self.render_incremental_response(True)
self.io.assistant_output(show_resp)
self.io.assistant_output(show_resp, pretty=self.show_pretty())
if (
hasattr(completion.choices[0], "finish_reason")
@@ -1535,7 +1718,6 @@ class Coder:
completion.usage, "cache_creation_input_tokens"
):
self.message_tokens_sent += prompt_tokens
self.message_tokens_sent += cache_hit_tokens
self.message_tokens_sent += cache_write_tokens
else:
self.message_tokens_sent += prompt_tokens
@@ -1617,11 +1799,27 @@ class Coder:
self.usage_report = tokens_report + sep + cost_report
def show_usage_report(self):
if self.usage_report:
self.io.tool_output(self.usage_report)
self.message_cost = 0.0
self.message_tokens_sent = 0
self.message_tokens_received = 0
if not self.usage_report:
return
self.io.tool_output(self.usage_report)
prompt_tokens = self.message_tokens_sent
completion_tokens = self.message_tokens_received
self.event(
"message_send",
main_model=self.main_model,
edit_format=self.edit_format,
prompt_tokens=prompt_tokens,
completion_tokens=completion_tokens,
total_tokens=prompt_tokens + completion_tokens,
cost=self.message_cost,
total_cost=self.total_cost,
)
self.message_cost = 0.0
self.message_tokens_sent = 0
self.message_tokens_received = 0
def get_multi_response_content(self, final=False):
cur = self.multi_response_content or ""
@@ -1696,6 +1894,10 @@ class Coder:
self.check_for_dirty_commit(path)
return True
if self.repo and self.repo.git_ignored_file(path):
self.io.tool_warning(f"Skipping edits to {path} that matches gitignore spec.")
return
if not Path(full_path).exists():
if not self.io.confirm_ask("Create new file?", subject=path):
self.io.tool_output(f"Skipping edits to {path}")
@@ -1790,8 +1992,10 @@ class Coder:
edited = set()
try:
edits = self.get_edits()
edits = self.apply_edits_dry_run(edits)
edits = self.prepare_to_edit(edits)
edited = set(edit[0] for edit in edits)
self.apply_edits(edits)
except ValueError as err:
self.num_malformed_responses += 1
@@ -1919,6 +2123,9 @@ class Coder:
def apply_edits(self, edits):
return
def apply_edits_dry_run(self, edits):
return edits
def run_shell_commands(self):
if not self.suggest_shell_commands:
return ""
@@ -1942,7 +2149,11 @@ class Coder:
)
prompt = "Run shell command?" if command_count == 1 else "Run shell commands?"
if not self.io.confirm_ask(
prompt, subject="\n".join(commands), explicit_yes_required=True, group=group
prompt,
subject="\n".join(commands),
explicit_yes_required=True,
group=group,
allow_never=True,
):
return
@@ -1956,13 +2167,14 @@ class Coder:
self.io.tool_output(f"Running {command}")
# Add the command to input history
self.io.add_to_input_history(f"/run {command.strip()}")
exit_status, output = run_cmd(command, error_print=self.io.tool_error)
exit_status, output = run_cmd(command, error_print=self.io.tool_error, cwd=self.root)
if output:
accumulated_output += f"Output from {command}\n{output}\n"
if accumulated_output.strip() and not self.io.confirm_ask(
"Add command output to the chat?"
if accumulated_output.strip() and self.io.confirm_ask(
"Add command output to the chat?", allow_never=True
):
accumulated_output = ""
return accumulated_output
num_lines = len(accumulated_output.strip().splitlines())
line_plural = "line" if num_lines == 1 else "lines"
self.io.tool_output(f"Added {num_lines} {line_plural} of output to the chat.")
return accumulated_output

View File

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

View File

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

View File

@@ -11,7 +11,7 @@ Respect and use existing conventions, libraries, etc that are already present in
Take requests for changes to the supplied code.
If the request is ambiguous, ask questions.
Always reply to the user in the same language they are using.
Always reply to the user in {language}.
Once you understand the request you MUST:
@@ -34,8 +34,10 @@ ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!
4. *Concisely* suggest any shell commands the user might want to run in ```bash blocks.
Just suggest shell commands this way, not example code.
Only suggest complete shell commands that area ready to execute, without placeholders.
Only suggest at most a few shell commands at a time, not more than 1-3.
Only suggest complete shell commands that are ready to execute, without placeholders.
Only suggest at most a few shell commands at a time, not more than 1-3, one per line.
Do not suggest multi-line shell commands.
All shell commands will run from the root directory of the user's project.
Use the appropriate shell based on the user's system info:
{platform}
@@ -159,8 +161,9 @@ Use the *FULL* file path, as shown to you by the user.
Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.
If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.
*SEARCH/REPLACE* blocks will replace *all* matching occurrences.
Include enough lines to make the SEARCH blocks uniquely match the lines to change.
*SEARCH/REPLACE* blocks will *only* replace the first match occurrence.
Including multiple unique *SEARCH/REPLACE* blocks if needed.
Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.
Keep *SEARCH/REPLACE* blocks concise.
Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.
@@ -180,6 +183,9 @@ If you want to put code in a new file, use a *SEARCH/REPLACE block* with:
To rename files which have been added to the chat, use shell commands at the end of your response.
If the user just says something like "ok" or "go ahead" or "do that" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.
The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.
{lazy_prompt}
ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!
{shell_cmd_reminder}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,15 +1,20 @@
import glob
import os
import re
import subprocess
import sys
import tempfile
from collections import OrderedDict
from os.path import expanduser
from pathlib import Path
import pyperclip
from PIL import Image, ImageGrab
from prompt_toolkit.completion import Completion, PathCompleter
from prompt_toolkit.document import Document
from aider import models, prompts, voice
from aider.editor import pipe_editor
from aider.format_settings import format_settings
from aider.help import Help, install_help_extra
from aider.llm import litellm
@@ -38,10 +43,22 @@ class Commands:
verify_ssl=self.verify_ssl,
args=self.args,
parser=self.parser,
verbose=self.verbose,
editor=self.editor,
)
def __init__(
self, io, coder, voice_language=None, verify_ssl=True, args=None, parser=None, verbose=False
self,
io,
coder,
voice_language=None,
voice_input_device=None,
voice_format=None,
verify_ssl=True,
args=None,
parser=None,
verbose=False,
editor=None,
):
self.io = io
self.coder = coder
@@ -54,8 +71,11 @@ class Commands:
voice_language = None
self.voice_language = voice_language
self.voice_format = voice_format
self.voice_input_device = voice_input_device
self.help = None
self.editor = editor
def cmd_model(self, args):
"Switch to a new LLM"
@@ -87,6 +107,13 @@ class Commands:
("help", "Get help about using aider (usage, config, troubleshoot)."),
("ask", "Ask questions about your code without making any changes."),
("code", "Ask for changes to your code (using the best edit format)."),
(
"architect",
(
"Work with an architect model to design code changes, and an editor to make"
" them."
),
),
]
)
@@ -135,7 +162,7 @@ class Commands:
else:
self.io.tool_output("Please provide a partial model name to search for.")
def cmd_web(self, args):
def cmd_web(self, args, return_content=False):
"Scrape a webpage, convert to markdown and send in a message"
url = args.strip()
@@ -154,15 +181,28 @@ class Commands:
)
content = self.scraper.scrape(url) or ""
content = f"{url}:\n\n" + content
content = f"Here is the content of {url}:\n\n" + content
if return_content:
return content
self.io.tool_output("... done.")
self.io.tool_output("... added to chat.")
return content
self.coder.cur_messages += [
dict(role="user", content=content),
dict(role="assistant", content="Ok."),
]
def is_command(self, inp):
return inp[0] in "/!"
def get_raw_completions(self, cmd):
assert cmd.startswith("/")
cmd = cmd[1:]
cmd = cmd.replace("-", "_")
raw_completer = getattr(self, f"completions_raw_{cmd}", None)
return raw_completer
def get_completions(self, cmd):
assert cmd.startswith("/")
cmd = cmd[1:]
@@ -211,6 +251,7 @@ class Commands:
def run(self, inp):
if inp.startswith("!"):
self.coder.event("command_run")
return self.do_run("run", inp[1:])
res = self.matching_commands(inp)
@@ -218,9 +259,13 @@ class Commands:
return
matching_commands, first_word, rest_inp = res
if len(matching_commands) == 1:
return self.do_run(matching_commands[0][1:], rest_inp)
command = matching_commands[0][1:]
self.coder.event(f"command_{command}")
return self.do_run(command, rest_inp)
elif first_word in matching_commands:
return self.do_run(first_word[1:], rest_inp)
command = first_word[1:]
self.coder.event(f"command_{command}")
return self.do_run(command, rest_inp)
elif len(matching_commands) > 1:
self.io.tool_error(f"Ambiguous command: {', '.join(matching_commands)}")
else:
@@ -556,6 +601,10 @@ class Commands:
self.io.tool_output(f"Diff since {commit_before_message[:7]}...")
if self.coder.pretty:
run_cmd(f"git diff {commit_before_message}")
return
diff = self.coder.repo.diff_commits(
self.coder.pretty,
commit_before_message,
@@ -569,8 +618,62 @@ class Commands:
fname = f'"{fname}"'
return fname
def completions_read_only(self):
return self.completions_add()
def completions_raw_read_only(self, document, complete_event):
# Get the text before the cursor
text = document.text_before_cursor
# Skip the first word and the space after it
after_command = text.split()[-1]
# Create a new Document object with the text after the command
new_document = Document(after_command, cursor_position=len(after_command))
def get_paths():
return [self.coder.root] if self.coder.root else None
path_completer = PathCompleter(
get_paths=get_paths,
only_directories=False,
expanduser=True,
)
# Adjust the start_position to replace all of 'after_command'
adjusted_start_position = -len(after_command)
# Collect all completions
all_completions = []
# Iterate over the completions and modify them
for completion in path_completer.get_completions(new_document, complete_event):
quoted_text = self.quote_fname(after_command + completion.text)
all_completions.append(
Completion(
text=quoted_text,
start_position=adjusted_start_position,
display=completion.display,
style=completion.style,
selected_style=completion.selected_style,
)
)
# Add completions from the 'add' command
add_completions = self.completions_add()
for completion in add_completions:
if after_command in completion:
all_completions.append(
Completion(
text=completion,
start_position=adjusted_start_position,
display=completion,
)
)
# Sort all completions based on their text
sorted_completions = sorted(all_completions, key=lambda c: c.text)
# Yield the sorted completions
for completion in sorted_completions:
yield completion
def completions_add(self):
files = set(self.coder.get_all_relative_files())
@@ -588,7 +691,7 @@ class Commands:
else:
try:
raw_matched_files = list(Path(self.coder.root).glob(pattern))
except IndexError:
except (IndexError, AttributeError):
raw_matched_files = []
except ValueError as err:
self.io.tool_error(f"Error matching {pattern}: {err}")
@@ -658,7 +761,7 @@ class Commands:
except OSError as e:
self.io.tool_error(f"Error creating file {fname}: {e}")
for matched_file in all_matched_files:
for matched_file in sorted(all_matched_files):
abs_file_path = self.coder.abs_root_path(matched_file)
if not abs_file_path.startswith(self.coder.root) and not is_image_file(matched_file):
@@ -667,8 +770,13 @@ class Commands:
)
continue
if self.coder.repo and self.coder.repo.git_ignored_file(matched_file):
self.io.tool_error(f"Can't add {matched_file} which is in gitignore")
continue
if abs_file_path in self.coder.abs_fnames:
self.io.tool_warning(f"{matched_file} is already in the chat")
self.io.tool_error(f"{matched_file} is already in the chat as an editable file")
continue
elif abs_file_path in self.coder.abs_read_only_fnames:
if self.coder.repo and self.coder.repo.path_in_repo(matched_file):
self.coder.abs_read_only_fnames.remove(abs_file_path)
@@ -681,7 +789,9 @@ class Commands:
f"Cannot add {matched_file} as it's not part of the repository"
)
else:
if is_image_file(matched_file) and not self.coder.main_model.accepts_images:
if is_image_file(matched_file) and not self.coder.main_model.info.get(
"supports_vision"
):
self.io.tool_error(
f"Cannot add image file {matched_file} as the"
f" {self.coder.main_model.name} does not support images."
@@ -692,7 +802,8 @@ class Commands:
self.io.tool_error(f"Unable to read {matched_file}")
else:
self.coder.abs_fnames.add(abs_file_path)
self.io.tool_output(f"Added {matched_file} to the chat")
fname = self.coder.get_rel_fname(abs_file_path)
self.io.tool_output(f"Added {fname} to the chat")
self.coder.check_added_files()
def completions_drop(self):
@@ -715,15 +826,33 @@ class Commands:
# Expand tilde in the path
expanded_word = os.path.expanduser(word)
# Handle read-only files separately, without glob_filtered_to_repo
read_only_matched = [f for f in self.coder.abs_read_only_fnames if expanded_word in f]
# Handle read-only files with substring matching and samefile check
read_only_matched = []
for f in self.coder.abs_read_only_fnames:
if expanded_word in f:
read_only_matched.append(f)
continue
if read_only_matched:
for matched_file in read_only_matched:
self.coder.abs_read_only_fnames.remove(matched_file)
self.io.tool_output(f"Removed read-only file {matched_file} from the chat")
# Try samefile comparison for relative paths
try:
abs_word = os.path.abspath(expanded_word)
if os.path.samefile(abs_word, f):
read_only_matched.append(f)
except (FileNotFoundError, OSError):
continue
matched_files = self.glob_filtered_to_repo(expanded_word)
for matched_file in read_only_matched:
self.coder.abs_read_only_fnames.remove(matched_file)
self.io.tool_output(f"Removed read-only file {matched_file} from the chat")
# For editable files, use glob if word contains glob chars, otherwise use substring
if any(c in expanded_word for c in "*?[]"):
matched_files = self.glob_filtered_to_repo(expanded_word)
else:
# Use substring matching like we do for read-only files
matched_files = [
self.coder.get_rel_fname(f) for f in self.coder.abs_fnames if expanded_word in f
]
if not matched_files:
matched_files.append(expanded_word)
@@ -735,7 +864,7 @@ class Commands:
self.io.tool_output(f"Removed {matched_file} from the chat")
def cmd_git(self, args):
"Run a git command"
"Run a git command (output excluded from chat)"
combined_output = None
try:
args = "git " + args
@@ -783,54 +912,47 @@ class Commands:
def cmd_run(self, args, add_on_nonzero_exit=False):
"Run a shell command and optionally add the output to the chat (alias: !)"
exit_status, combined_output = run_cmd(
args, verbose=self.verbose, error_print=self.io.tool_error
args, verbose=self.verbose, error_print=self.io.tool_error, cwd=self.coder.root
)
instructions = None
if combined_output is None:
return
# Calculate token count of output
token_count = self.coder.main_model.token_count(combined_output)
k_tokens = token_count / 1000
if add_on_nonzero_exit:
add = exit_status != 0
else:
self.io.tool_output()
response = self.io.prompt_ask(
"Add the output to the chat?\n(Y)es/(n)o/message with instructions:",
).strip()
self.io.tool_output()
if response.lower() in ["yes", "y"]:
add = True
elif response.lower() in ["no", "n"]:
add = False
else:
add = True
instructions = response
if response.strip():
self.io.user_input(response, log_only=True)
self.io.add_to_input_history(response)
add = self.io.confirm_ask(f"Add {k_tokens:.1f}k tokens of command output to the chat?")
if add:
for line in combined_output.splitlines():
self.io.tool_output(line, log_only=True)
num_lines = len(combined_output.strip().splitlines())
line_plural = "line" if num_lines == 1 else "lines"
self.io.tool_output(f"Added {num_lines} {line_plural} of output to the chat.")
msg = prompts.run_output.format(
command=args,
output=combined_output,
)
if instructions:
msg = instructions + "\n\n" + msg
self.coder.cur_messages += [
dict(role="user", content=msg),
dict(role="assistant", content="Ok."),
]
return msg
if add and exit_status != 0:
self.io.placeholder = "What's wrong? Fix"
def cmd_exit(self, args):
"Exit the application"
self.coder.event("exit", reason="/exit")
sys.exit()
def cmd_quit(self, args):
"Exit the application"
sys.exit()
self.cmd_exit(args)
def cmd_ls(self, args):
"List all known files and indicate which are included in the chat session"
@@ -894,7 +1016,8 @@ class Commands:
self.basic_help()
return
from aider.coders import Coder
self.coder.event("interactive help")
from aider.coders.base_coder import Coder
if not self.help:
res = install_help_extra(self.io)
@@ -938,19 +1061,23 @@ class Commands:
)
def cmd_ask(self, args):
"Ask questions about the code base without editing any files"
"""Ask questions about the code base without editing any files. If no prompt provided, switches to ask mode.""" # noqa
return self._generic_chat_command(args, "ask")
def cmd_code(self, args):
"Ask for changes to your code"
"""Ask for changes to your code. If no prompt provided, switches to code mode.""" # noqa
return self._generic_chat_command(args, self.coder.main_model.edit_format)
def cmd_architect(self, args):
"""Enter architect mode to discuss high-level design and architecture. If no prompt provided, switches to architect mode.""" # noqa
return self._generic_chat_command(args, "architect")
def _generic_chat_command(self, args, edit_format):
if not args.strip():
self.io.tool_error(f"Please provide a question or topic for the {edit_format} chat.")
return
# Switch to the corresponding chat mode if no args provided
return self.cmd_chat_mode(edit_format)
from aider.coders import Coder
from aider.coders.base_coder import Coder
coder = Coder.create(
io=self.io,
@@ -997,46 +1124,27 @@ class Commands:
self.io.tool_error("To use /voice you must provide an OpenAI API key.")
return
try:
self.voice = voice.Voice()
self.voice = voice.Voice(
audio_format=self.voice_format or "wav", device_name=self.voice_input_device
)
except voice.SoundDeviceError:
self.io.tool_error(
"Unable to import `sounddevice` and/or `soundfile`, is portaudio installed?"
)
return
history_iter = self.io.get_input_history()
history = []
size = 0
for line in history_iter:
if line.startswith("/"):
continue
if line in history:
continue
if size + len(line) > 1024:
break
size += len(line)
history.append(line)
history.reverse()
history = "\n".join(history)
try:
text = self.voice.record_and_transcribe(history, language=self.voice_language)
text = self.voice.record_and_transcribe(None, language=self.voice_language)
except litellm.OpenAIError as err:
self.io.tool_error(f"Unable to use OpenAI whisper model: {err}")
return
if text:
self.io.add_to_input_history(text)
self.io.print()
self.io.user_input(text, log_only=False)
self.io.print()
self.io.placeholder = text
return text
def cmd_clipboard(self, args):
"Add image/text from the clipboard to the chat (optionally provide a name for the image)"
def cmd_paste(self, args):
"""Paste image/text from the clipboard into the chat.\
Optionally provide a name for the image."""
try:
# Check for image first
image = ImageGrab.grabclipboard()
@@ -1085,33 +1193,61 @@ class Commands:
self.io.tool_error(f"Error processing clipboard content: {e}")
def cmd_read_only(self, args):
"Add files to the chat that are for reference, not to be edited"
"Add files to the chat that are for reference only, or turn added files to read-only"
if not args.strip():
self.io.tool_error("Please provide filenames or directories to read.")
# Convert all files in chat to read-only
for fname in list(self.coder.abs_fnames):
self.coder.abs_fnames.remove(fname)
self.coder.abs_read_only_fnames.add(fname)
rel_fname = self.coder.get_rel_fname(fname)
self.io.tool_output(f"Converted {rel_fname} to read-only")
return
filenames = parse_quoted_filenames(args)
for word in filenames:
# Expand the home directory if the path starts with "~"
expanded_path = os.path.expanduser(word)
abs_path = self.coder.abs_root_path(expanded_path)
all_paths = []
if not os.path.exists(abs_path):
self.io.tool_error(f"Path not found: {abs_path}")
continue
# First collect all expanded paths
for pattern in filenames:
expanded_pattern = expanduser(pattern)
if os.path.isabs(expanded_pattern):
# For absolute paths, glob it
matches = list(glob.glob(expanded_pattern))
else:
# For relative paths and globs, use glob from the root directory
matches = list(Path(self.coder.root).glob(expanded_pattern))
if not matches:
self.io.tool_error(f"No matches found for: {pattern}")
else:
all_paths.extend(matches)
# Then process them in sorted order
for path in sorted(all_paths):
abs_path = self.coder.abs_root_path(path)
if os.path.isfile(abs_path):
self._add_read_only_file(abs_path, word)
self._add_read_only_file(abs_path, path)
elif os.path.isdir(abs_path):
self._add_read_only_directory(abs_path, word)
self._add_read_only_directory(abs_path, path)
else:
self.io.tool_error(f"Not a file or directory: {abs_path}")
def _add_read_only_file(self, abs_path, original_name):
if abs_path in self.coder.abs_fnames:
self.io.tool_error(f"{original_name} is already in the chat as an editable file")
elif abs_path in self.coder.abs_read_only_fnames:
if is_image_file(original_name) and not self.coder.main_model.info.get("supports_vision"):
self.io.tool_error(
f"Cannot add image file {original_name} as the"
f" {self.coder.main_model.name} does not support images."
)
return
if abs_path in self.coder.abs_read_only_fnames:
self.io.tool_error(f"{original_name} is already in the chat as a read-only file")
return
elif abs_path in self.coder.abs_fnames:
self.coder.abs_fnames.remove(abs_path)
self.coder.abs_read_only_fnames.add(abs_path)
self.io.tool_output(
f"Moved {original_name} from editable to read-only files in the chat"
)
else:
self.coder.abs_read_only_fnames.add(abs_path)
self.io.tool_output(f"Added {original_name} to read-only files.")
@@ -1152,7 +1288,102 @@ class Commands:
def cmd_settings(self, args):
"Print out the current settings"
settings = format_settings(self.parser, self.args)
self.io.tool_output(settings)
announcements = "\n".join(self.coder.get_announcements())
output = f"{announcements}\n{settings}"
self.io.tool_output(output)
def completions_raw_load(self, document, complete_event):
return self.completions_raw_read_only(document, complete_event)
def cmd_load(self, args):
"Load and execute commands from a file"
if not args.strip():
self.io.tool_error("Please provide a filename containing commands to load.")
return
try:
with open(args.strip(), "r", encoding=self.io.encoding, errors="replace") as f:
commands = f.readlines()
except FileNotFoundError:
self.io.tool_error(f"File not found: {args}")
return
except Exception as e:
self.io.tool_error(f"Error reading file: {e}")
return
for cmd in commands:
cmd = cmd.strip()
if not cmd or cmd.startswith("#"):
continue
self.io.tool_output(f"\nExecuting: {cmd}")
try:
self.run(cmd)
except SwitchCoder:
self.io.tool_error(
f"Command '{cmd}' is only supported in interactive mode, skipping."
)
def completions_raw_save(self, document, complete_event):
return self.completions_raw_read_only(document, complete_event)
def cmd_save(self, args):
"Save commands to a file that can reconstruct the current chat session's files"
if not args.strip():
self.io.tool_error("Please provide a filename to save the commands to.")
return
try:
with open(args.strip(), "w", encoding=self.io.encoding) as f:
f.write("/drop\n")
# Write commands to add editable files
for fname in sorted(self.coder.abs_fnames):
rel_fname = self.coder.get_rel_fname(fname)
f.write(f"/add {rel_fname}\n")
# Write commands to add read-only files
for fname in sorted(self.coder.abs_read_only_fnames):
# Use absolute path for files outside repo root, relative path for files inside
if Path(fname).is_relative_to(self.coder.root):
rel_fname = self.coder.get_rel_fname(fname)
f.write(f"/read-only {rel_fname}\n")
else:
f.write(f"/read-only {fname}\n")
self.io.tool_output(f"Saved commands to {args.strip()}")
except Exception as e:
self.io.tool_error(f"Error saving commands to file: {e}")
def cmd_multiline_mode(self, args):
"Toggle multiline mode (swaps behavior of Enter and Meta+Enter)"
self.io.toggle_multiline_mode()
def cmd_copy(self, args):
"Copy the last assistant message to the clipboard"
all_messages = self.coder.done_messages + self.coder.cur_messages
assistant_messages = [msg for msg in reversed(all_messages) if msg["role"] == "assistant"]
if not assistant_messages:
self.io.tool_error("No assistant messages found to copy.")
return
last_assistant_message = assistant_messages[0]["content"]
try:
pyperclip.copy(last_assistant_message)
preview = (
last_assistant_message[:50] + "..."
if len(last_assistant_message) > 50
else last_assistant_message
)
self.io.tool_output(f"Copied last assistant message to clipboard. Preview: {preview}")
except pyperclip.PyperclipException as e:
self.io.tool_error(f"Failed to copy to clipboard: {str(e)}")
self.io.tool_output(
"You may need to install xclip or xsel on Linux, or pbcopy on macOS."
)
except Exception as e:
self.io.tool_error(f"An unexpected error occurred while copying to clipboard: {str(e)}")
def cmd_report(self, args):
"Report a problem by opening a GitHub Issue"
@@ -1168,6 +1399,57 @@ class Commands:
report_github_issue(issue_text, title=title, confirm=False)
def cmd_editor(self, initial_content=""):
"Open an editor to write a prompt"
user_input = pipe_editor(initial_content, suffix="md", editor=self.editor)
if user_input.strip():
self.io.set_placeholder(user_input.rstrip())
def cmd_copy_context(self, args=None):
"""Copy the current chat context as markdown, suitable to paste into a web UI"""
chunks = self.coder.format_chat_chunks()
markdown = ""
# Only include specified chunks in order
for messages in [chunks.repo, chunks.readonly_files, chunks.chat_files]:
for msg in messages:
# Only include user messages
if msg["role"] != "user":
continue
content = msg["content"]
# Handle image/multipart content
if isinstance(content, list):
for part in content:
if part.get("type") == "text":
markdown += part["text"] + "\n\n"
else:
markdown += content + "\n\n"
args = args or ""
markdown += f"""
Just tell me how to edit the files to make the changes.
Don't give me back entire files.
Just show me the edits I need to make.
{args}
"""
try:
pyperclip.copy(markdown)
self.io.tool_output("Copied code context to clipboard.")
except pyperclip.PyperclipException as e:
self.io.tool_error(f"Failed to copy to clipboard: {str(e)}")
self.io.tool_output(
"You may need to install xclip or xsel on Linux, or pbcopy on macOS."
)
except Exception as e:
self.io.tool_error(f"An unexpected error occurred while copying to clipboard: {str(e)}")
def expand_subdir(file_path):
if file_path.is_file():

72
aider/copypaste.py Normal file
View File

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

View File

@@ -50,7 +50,6 @@ def diff_partial_update(lines_orig, lines_updated, final=False, fname=None):
# dump(lines_orig)
# dump(lines_updated)
assert_newlines(lines_orig)
assert_newlines(lines_orig)
num_orig_lines = len(lines_orig)

146
aider/editor.py Normal file
View File

@@ -0,0 +1,146 @@
"""
Editor module for handling system text editor interactions.
This module provides functionality to:
- Discover and launch the system's configured text editor
- Create and manage temporary files for editing
- Handle editor preferences from environment variables
- Support cross-platform editor operations
"""
import os
import platform
import shlex
import subprocess
import tempfile
from rich.console import Console
DEFAULT_EDITOR_NIX = "vi"
DEFAULT_EDITOR_OS_X = "vim"
DEFAULT_EDITOR_WINDOWS = "notepad"
console = Console()
def print_status_message(success, message, style=None):
"""
Print a status message with appropriate styling.
:param success: Whether the operation was successful
:param message: The message to display
:param style: Optional style override. If None, uses green for success and red for failure
"""
if style is None:
style = "bold green" if success else "bold red"
console.print(message, style=style)
print("")
def write_temp_file(
input_data="",
suffix=None,
prefix=None,
dir=None,
):
"""
Create a temporary file with the given input data.
:param input_data: Content to write to the temporary file
:param suffix: Optional file extension (without the dot)
:param prefix: Optional prefix for the temporary filename
:param dir: Optional directory to create the file in
:return: Path to the created temporary file
:raises: OSError if file creation or writing fails
"""
kwargs = {"prefix": prefix, "dir": dir}
if suffix:
kwargs["suffix"] = f".{suffix}"
fd, filepath = tempfile.mkstemp(**kwargs)
try:
with os.fdopen(fd, "w") as f:
f.write(input_data)
except Exception:
os.close(fd)
raise
return filepath
def get_environment_editor(default=None):
"""
Fetches the preferred editor from the environment variables.
This function checks the following environment variables in order to
determine the user's preferred editor:
- VISUAL
- EDITOR
:param default: The default editor to return if no environment variable is set.
:type default: str or None
:return: The preferred editor as specified by environment variables or the default value.
:rtype: str or None
"""
editor = os.environ.get("VISUAL", os.environ.get("EDITOR", default))
return editor
def discover_editor(editor_override=None):
"""
Discovers and returns the appropriate editor command as a list of arguments.
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]
"""
system = platform.system()
if system == "Windows":
default_editor = DEFAULT_EDITOR_WINDOWS
elif system == "Darwin":
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}")
def pipe_editor(input_data="", suffix=None, editor=None):
"""
Opens the system editor with optional input data and returns the edited content.
This function creates a temporary file with the provided input data, opens it in
the system editor, waits for the user to make changes and close the editor, then
reads and returns the modified content. The temporary file is deleted afterwards.
:param input_data: Initial content to populate the editor with
:type input_data: str
:param suffix: Optional file extension for the temporary file (e.g. '.txt', '.md')
:type suffix: str or None
:return: The edited content after the editor is closed
:rtype: str
"""
filepath = write_temp_file(input_data, suffix)
command_parts = discover_editor(editor)
command_parts.append(filepath)
subprocess.call(command_parts)
with open(filepath, "r") as f:
output_data = f.read()
try:
os.remove(filepath)
except PermissionError:
print_status_message(
False,
(
f"WARNING: Unable to delete temporary file {filepath!r}. You may need to delete it"
" manually."
),
)
return output_data

90
aider/exceptions.py Normal file
View File

@@ -0,0 +1,90 @@
from dataclasses import dataclass
@dataclass
class ExInfo:
name: str
retry: bool
description: str
EXCEPTIONS = [
ExInfo("APIConnectionError", True, None),
ExInfo("APIError", True, None),
ExInfo("APIResponseValidationError", True, None),
ExInfo(
"AuthenticationError",
False,
"The API provider is not able to authenticate you. Check your API key.",
),
ExInfo("AzureOpenAIError", True, None),
ExInfo("BadRequestError", False, None),
ExInfo("BudgetExceededError", True, None),
ExInfo(
"ContentPolicyViolationError",
True,
"The API provider has refused the request due to a safety policy about the content.",
),
ExInfo("ContextWindowExceededError", False, None), # special case handled in base_coder
ExInfo("InternalServerError", True, "The API provider's servers are down or overloaded."),
ExInfo("InvalidRequestError", True, None),
ExInfo("JSONSchemaValidationError", True, None),
ExInfo("NotFoundError", False, None),
ExInfo("OpenAIError", True, None),
ExInfo(
"RateLimitError",
True,
"The API provider has rate limited you. Try again later or check your quotas.",
),
ExInfo("RouterRateLimitError", True, None),
ExInfo("ServiceUnavailableError", True, "The API provider's servers are down or overloaded."),
ExInfo("UnprocessableEntityError", True, None),
ExInfo("UnsupportedParamsError", True, None),
ExInfo(
"Timeout",
True,
"The API provider timed out without returning a response. They may be down or overloaded.",
),
]
class LiteLLMExceptions:
exceptions = dict()
def __init__(self):
self._load()
def _load(self, strict=False):
import litellm
for var in dir(litellm):
if not var.endswith("Error"):
continue
ex_info = None
for exi in EXCEPTIONS:
if var == exi.name:
ex_info = exi
break
if strict and not ex_info:
raise ValueError(f"{var} is in litellm but not in aider's exceptions list")
ex = getattr(litellm, var)
self.exceptions[ex] = ex_info
def exceptions_tuple(self):
return tuple(self.exceptions)
def get_ex_info(self, ex):
"""Return the ExInfo for a given exception instance"""
import litellm
if ex.__class__ is litellm.APIConnectionError:
if "google.auth" in str(ex):
return ExInfo(
"APIConnectionError", False, "You need to: pip install google-generativeai"
)
if "boto3" in str(ex):
return ExInfo("APIConnectionError", False, "You need to: pip install boto3")
return self.exceptions.get(ex.__class__, ExInfo(None, None, None))

View File

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

View File

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

View File

@@ -1,4 +1,7 @@
# This needs to sync with MANIFEST.in
exclude_website_pats = [
"**/.DS_Store",
"examples/**",
"_posts/**",
"HISTORY.md",

View File

@@ -108,9 +108,7 @@ class ChatSummary:
for model in self.models:
try:
summary = simple_send_with_retries(
model.name, summarize_messages, extra_headers=model.extra_headers
)
summary = simple_send_with_retries(model, summarize_messages)
if summary is not None:
summary = prompts.summary_prefix + summary
return [dict(role="user", content=summary)]

View File

@@ -1,23 +1,33 @@
import base64
import os
import signal
import time
import webbrowser
from collections import defaultdict
from dataclasses import dataclass
from datetime import datetime
from io import StringIO
from pathlib import Path
from prompt_toolkit.completion import Completer, Completion, ThreadedCompleter
from prompt_toolkit.cursor_shapes import ModalCursorShapeConfig
from prompt_toolkit.enums import EditingMode
from prompt_toolkit.filters import Condition, is_searching
from prompt_toolkit.history import FileHistory
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.keys import Keys
from prompt_toolkit.lexers import PygmentsLexer
from prompt_toolkit.output.vt100 import is_dumb_terminal
from prompt_toolkit.shortcuts import CompleteStyle, PromptSession
from prompt_toolkit.styles import Style
from pygments.lexers import MarkdownLexer, guess_lexer_for_filename
from pygments.token import Token
from rich.columns import Columns
from rich.console import Console
from rich.markdown import Markdown
from rich.style import Style as RichStyle
from rich.text import Text
from rich.markdown import Markdown
from aider.mdstream import MarkdownStream
from .dump import dump # noqa: F401
@@ -91,17 +101,16 @@ class AutoCompleter(Completer):
(token[1], f"`{token[1]}`") for token in tokens if token[0] in Token.Name
)
def get_command_completions(self, text, words):
candidates = []
def get_command_completions(self, document, complete_event, text, words):
if len(words) == 1 and not text[-1].isspace():
partial = words[0].lower()
candidates = [cmd for cmd in self.command_names if cmd.startswith(partial)]
return candidates
for candidate in sorted(candidates):
yield Completion(candidate, start_position=-len(words[-1]))
return
if len(words) <= 1:
return []
if text[-1].isspace():
return []
if len(words) <= 1 or text[-1].isspace():
return
cmd = words[0]
partial = words[-1].lower()
@@ -112,6 +121,11 @@ class AutoCompleter(Completer):
elif cmd not in matches:
return
raw_completer = self.commands.get_raw_completions(cmd)
if raw_completer:
yield from raw_completer(document, complete_event)
return
if cmd not in self.command_completions:
candidates = self.commands.get_completions(cmd)
self.command_completions[cmd] = candidates
@@ -122,7 +136,8 @@ class AutoCompleter(Completer):
return
candidates = [word for word in candidates if partial in word.lower()]
return candidates
for candidate in sorted(candidates):
yield Completion(candidate, start_position=-len(words[-1]))
def get_completions(self, document, complete_event):
self.tokenize()
@@ -137,11 +152,8 @@ class AutoCompleter(Completer):
return
if text[0] == "/":
candidates = self.get_command_completions(text, words)
if candidates is not None:
for candidate in sorted(candidates):
yield Completion(candidate, start_position=-len(words[-1]))
return
yield from self.get_command_completions(document, complete_event, text, words)
return
candidates = self.words
candidates.update(set(self.fname_to_rel_fnames))
@@ -165,6 +177,7 @@ class AutoCompleter(Completer):
class InputOutput:
num_error_outputs = 0
num_user_asks = 0
clipboard_watcher = None
def __init__(
self,
@@ -179,13 +192,25 @@ class InputOutput:
tool_error_color="red",
tool_warning_color="#FFA500",
assistant_output_color="blue",
completion_menu_color=None,
completion_menu_bg_color=None,
completion_menu_current_color=None,
completion_menu_current_bg_color=None,
code_theme="default",
encoding="utf-8",
dry_run=False,
llm_history_file=None,
editingmode=EditingMode.EMACS,
fancy_input=True,
file_watcher=None,
multiline_mode=False,
root=".",
):
self.placeholder = None
self.interrupted = False
self.never_prompts = set()
self.editingmode = editingmode
self.multiline_mode = multiline_mode
no_color = os.environ.get("NO_COLOR")
if no_color is not None and no_color != "":
pretty = False
@@ -195,6 +220,11 @@ class InputOutput:
self.tool_error_color = tool_error_color if pretty else None
self.tool_warning_color = tool_warning_color if pretty else None
self.assistant_output_color = assistant_output_color
self.completion_menu_color = completion_menu_color if pretty else None
self.completion_menu_bg_color = completion_menu_bg_color if pretty else None
self.completion_menu_current_color = completion_menu_current_color if pretty else None
self.completion_menu_current_bg_color = completion_menu_current_bg_color if pretty else None
self.code_theme = code_theme
self.input = input
@@ -220,14 +250,22 @@ class InputOutput:
self.append_chat_history(f"\n# aider chat started at {current_time}\n\n")
self.prompt_session = None
if self.pretty:
# Initialize PromptSession
self.is_dumb_terminal = is_dumb_terminal()
if self.is_dumb_terminal:
self.pretty = False
fancy_input = False
if fancy_input:
# Initialize PromptSession only if we have a capable terminal
session_kwargs = {
"input": self.input,
"output": self.output,
"lexer": PygmentsLexer(MarkdownLexer),
"editing_mode": self.editingmode,
}
if self.editingmode == EditingMode.VI:
session_kwargs["cursor"] = ModalCursorShapeConfig()
if self.input_history_file is not None:
session_kwargs["history"] = FileHistory(self.input_history_file)
try:
@@ -238,6 +276,46 @@ class InputOutput:
self.tool_error(f"Can't initialize prompt toolkit: {err}") # non-pretty
else:
self.console = Console(force_terminal=False, no_color=True) # non-pretty
if self.is_dumb_terminal:
self.tool_output("Detected dumb terminal, disabling fancy input and pretty output.")
self.file_watcher = file_watcher
self.root = root
def _get_style(self):
style_dict = {}
if not self.pretty:
return Style.from_dict(style_dict)
if self.user_input_color:
style_dict.setdefault("", self.user_input_color)
style_dict.update(
{
"pygments.literal.string": f"bold italic {self.user_input_color}",
}
)
# Conditionally add 'completion-menu' style
completion_menu_style = []
if self.completion_menu_bg_color:
completion_menu_style.append(f"bg:{self.completion_menu_bg_color}")
if self.completion_menu_color:
completion_menu_style.append(self.completion_menu_color)
if completion_menu_style:
style_dict["completion-menu"] = " ".join(completion_menu_style)
# Conditionally add 'completion-menu.completion.current' style
completion_menu_current_style = []
if self.completion_menu_current_bg_color:
completion_menu_current_style.append(f"bg:{self.completion_menu_current_bg_color}")
if self.completion_menu_current_color:
completion_menu_current_style.append(self.completion_menu_current_color)
if completion_menu_current_style:
style_dict["completion-menu.completion.current"] = " ".join(
completion_menu_current_style
)
return Style.from_dict(style_dict)
def read_image(self, filename):
try:
@@ -257,7 +335,7 @@ class InputOutput:
self.tool_error(f"{filename}: {e}")
return
def read_text(self, filename):
def read_text(self, filename, silent=False):
if is_image_file(filename):
return self.read_image(filename)
@@ -265,27 +343,53 @@ class InputOutput:
with open(str(filename), "r", encoding=self.encoding) as f:
return f.read()
except OSError as err:
self.tool_error(f"{filename}: unable to read: {err}")
if not silent:
self.tool_error(f"{filename}: unable to read: {err}")
return
except FileNotFoundError:
self.tool_error(f"{filename}: file not found error")
if not silent:
self.tool_error(f"{filename}: file not found error")
return
except IsADirectoryError:
self.tool_error(f"{filename}: is a directory")
if not silent:
self.tool_error(f"{filename}: is a directory")
return
except UnicodeError as e:
self.tool_error(f"{filename}: {e}")
self.tool_error("Use --encoding to set the unicode encoding.")
if not silent:
self.tool_error(f"{filename}: {e}")
self.tool_error("Use --encoding to set the unicode encoding.")
return
def write_text(self, filename, content):
def write_text(self, filename, content, max_retries=5, initial_delay=0.1):
"""
Writes content to a file, retrying with progressive backoff if the file is locked.
:param filename: Path to the file to write.
:param content: Content to write to the file.
:param max_retries: Maximum number of retries if a file lock is encountered.
:param initial_delay: Initial delay (in seconds) before the first retry.
"""
if self.dry_run:
return
try:
with open(str(filename), "w", encoding=self.encoding) as f:
f.write(content)
except OSError as err:
self.tool_error(f"Unable to write file {filename}: {err}")
delay = initial_delay
for attempt in range(max_retries):
try:
with open(str(filename), "w", encoding=self.encoding) as f:
f.write(content)
return # Successfully wrote the file
except PermissionError as err:
if attempt < max_retries - 1:
time.sleep(delay)
delay *= 2 # Exponential backoff
else:
self.tool_error(
f"Unable to write file {filename} after {max_retries} attempts: {err}"
)
raise
except OSError as err:
self.tool_error(f"Unable to write file {filename}: {err}")
raise
def rule(self):
if self.pretty:
@@ -294,6 +398,13 @@ class InputOutput:
else:
print()
def interrupt_input(self):
if self.prompt_session and self.prompt_session.app:
# Store any partial input before interrupting
self.placeholder = self.prompt_session.app.current_buffer.text
self.interrupted = True
self.prompt_session.app.exit()
def get_input(
self,
root,
@@ -308,23 +419,20 @@ class InputOutput:
rel_fnames = list(rel_fnames)
show = ""
if rel_fnames:
show = " ".join(rel_fnames) + "\n"
rel_read_only_fnames = [
get_rel_fname(fname, root) for fname in (abs_read_only_fnames or [])
]
show = self.format_files_for_input(rel_fnames, rel_read_only_fnames)
if edit_format:
show += edit_format
if self.multiline_mode:
show += (" " if edit_format else "") + "multi"
show += "> "
inp = ""
multiline_input = False
if self.user_input_color and self.pretty:
style = Style.from_dict(
{
"": self.user_input_color,
"pygments.literal.string": f"bold italic {self.user_input_color}",
}
)
else:
style = None
style = self._get_style()
completer_instance = ThreadedCompleter(
AutoCompleter(
@@ -337,11 +445,51 @@ class InputOutput:
)
)
def suspend_to_bg(event):
"""Suspend currently running application."""
event.app.suspend_to_background()
kb = KeyBindings()
@kb.add("escape", "c-m", eager=True)
@kb.add(Keys.ControlZ, filter=Condition(lambda: hasattr(signal, "SIGTSTP")))
def _(event):
event.current_buffer.insert_text("\n")
"Suspend to background with ctrl-z"
suspend_to_bg(event)
@kb.add("c-space")
def _(event):
"Ignore Ctrl when pressing space bar"
event.current_buffer.insert_text(" ")
@kb.add("c-up")
def _(event):
"Navigate backward through history"
event.current_buffer.history_backward()
@kb.add("c-down")
def _(event):
"Navigate forward through history"
event.current_buffer.history_forward()
@kb.add("enter", eager=True, filter=~is_searching)
def _(event):
"Handle Enter key press"
if self.multiline_mode:
# In multiline mode, Enter adds a newline
event.current_buffer.insert_text("\n")
else:
# In normal mode, Enter submits
event.current_buffer.validate_and_handle()
@kb.add("escape", "enter", eager=True, filter=~is_searching) # This is Alt+Enter
def _(event):
"Handle Alt+Enter key press"
if self.multiline_mode:
# In multiline mode, Alt+Enter submits
event.current_buffer.validate_and_handle()
else:
# In normal mode, Alt+Enter adds a newline
event.current_buffer.insert_text("\n")
while True:
if multiline_input:
@@ -349,27 +497,86 @@ class InputOutput:
try:
if self.prompt_session:
# Use placeholder if set, then clear it
default = self.placeholder or ""
self.placeholder = None
self.interrupted = False
if not multiline_input:
if self.file_watcher:
self.file_watcher.start()
if self.clipboard_watcher:
self.clipboard_watcher.start()
line = self.prompt_session.prompt(
show,
default=default,
completer=completer_instance,
reserve_space_for_menu=4,
complete_style=CompleteStyle.MULTI_COLUMN,
style=style,
key_bindings=kb,
complete_while_typing=True,
)
else:
line = input(show)
# Check if we were interrupted by a file change
if self.interrupted:
line = line or ""
if self.file_watcher:
cmd = self.file_watcher.process_changes()
return cmd
except EOFError:
raise
except Exception as err:
import traceback
self.tool_error(str(err))
self.tool_error(traceback.format_exc())
return ""
except UnicodeEncodeError as err:
self.tool_error(str(err))
return ""
finally:
if self.file_watcher:
self.file_watcher.stop()
if self.clipboard_watcher:
self.clipboard_watcher.stop()
if line and line[0] == "{" and not multiline_input:
multiline_input = True
inp += line[1:] + "\n"
if line.strip("\r\n") and not multiline_input:
stripped = line.strip("\r\n")
if stripped == "{":
multiline_input = True
multiline_tag = None
inp += ""
elif stripped[0] == "{":
# Extract tag if it exists (only alphanumeric chars)
tag = "".join(c for c in stripped[1:] if c.isalnum())
if stripped == "{" + tag:
multiline_input = True
multiline_tag = tag
inp += ""
else:
inp = line
break
else:
inp = line
break
continue
elif line and line[-1] == "}" and multiline_input:
inp += line[:-1] + "\n"
break
elif multiline_input and line.strip():
if multiline_tag:
# Check if line is exactly "tag}"
if line.strip("\r\n") == f"{multiline_tag}}}":
break
else:
inp += line + "\n"
# Check if line is exactly "}"
elif line.strip("\r\n") == "}":
break
else:
inp += line + "\n"
elif multiline_input:
inp += line + "\n"
else:
@@ -383,10 +590,13 @@ class InputOutput:
def add_to_input_history(self, inp):
if not self.input_history_file:
return
FileHistory(self.input_history_file).append_string(inp)
# Also add to the in-memory history if it exists
if hasattr(self, "session") and hasattr(self.session, "history"):
self.session.history.append_string(inp)
try:
FileHistory(self.input_history_file).append_string(inp)
# Also add to the in-memory history if it exists
if self.prompt_session and self.prompt_session.history:
self.prompt_session.history.append_string(inp)
except OSError as err:
self.tool_warning(f"Unable to write to input history file: {err}")
def get_input_history(self):
if not self.input_history_file:
@@ -403,14 +613,17 @@ class InputOutput:
log_file.write(f"{role.upper()} {timestamp}\n")
log_file.write(content + "\n")
def display_user_input(self, inp):
if self.pretty and self.user_input_color:
style = dict(style=self.user_input_color)
else:
style = dict()
self.console.print(Text(inp), **style)
def user_input(self, inp, log_only=True):
if not log_only:
if self.pretty and self.user_input_color:
style = dict(style=self.user_input_color)
else:
style = dict()
self.console.print(Text(inp), **style)
self.display_user_input(inp)
prefix = "####"
if inp:
@@ -430,13 +643,38 @@ class InputOutput:
hist = "\n" + content.strip() + "\n\n"
self.append_chat_history(hist)
def offer_url(self, url, prompt="Open URL for more info?", allow_never=True):
"""Offer to open a URL in the browser, returns True if opened."""
if url in self.never_prompts:
return False
if self.confirm_ask(prompt, subject=url, allow_never=allow_never):
webbrowser.open(url)
return True
return False
def confirm_ask(
self, question, default="y", subject=None, explicit_yes_required=False, group=None
self,
question,
default="y",
subject=None,
explicit_yes_required=False,
group=None,
allow_never=False,
):
# Temporarily disable multiline mode for yes/no prompts
orig_multiline = self.multiline_mode
self.multiline_mode = False
self.num_user_asks += 1
question_id = (question, subject)
if question_id in self.never_prompts:
return False
if group and not group.show_group:
group = None
if group:
allow_never = True
valid_responses = ["yes", "no"]
options = " (Y)es/(N)o"
@@ -446,6 +684,10 @@ class InputOutput:
valid_responses.append("all")
options += "/(S)kip all"
valid_responses.append("skip")
if allow_never:
options += "/(D)on't ask again"
valid_responses.append("don't")
question += options + " [Yes]: "
if subject:
@@ -459,10 +701,7 @@ class InputOutput:
else:
self.tool_output(subject, bold=True)
if self.pretty and self.user_input_color:
style = {"": self.user_input_color}
else:
style = dict()
style = self._get_style()
def is_valid_response(text):
if not text:
@@ -481,7 +720,8 @@ class InputOutput:
if self.prompt_session:
res = self.prompt_session.prompt(
question,
style=Style.from_dict(style),
style=style,
complete_while_typing=False,
)
else:
res = input(question)
@@ -499,6 +739,12 @@ class InputOutput:
res = res.lower()[0]
if res == "d" and allow_never:
self.never_prompts.add(question_id)
hist = f"{question.strip()} {res}"
self.append_chat_history(hist, linebreak=True, blockquote=True)
return False
if explicit_yes_required:
is_yes = res == "y"
else:
@@ -516,19 +762,22 @@ class InputOutput:
hist = f"{question.strip()} {res}"
self.append_chat_history(hist, linebreak=True, blockquote=True)
# Restore original multiline mode
self.multiline_mode = orig_multiline
return is_yes
def prompt_ask(self, question, default="", subject=None):
# Temporarily disable multiline mode for prompts
orig_multiline = self.multiline_mode
self.multiline_mode = False
self.num_user_asks += 1
if subject:
self.tool_output()
self.tool_output(subject, bold=True)
if self.pretty and self.user_input_color:
style = Style.from_dict({"": self.user_input_color})
else:
style = None
style = self._get_style()
if self.yes is True:
res = "yes"
@@ -536,7 +785,12 @@ class InputOutput:
res = "no"
else:
if self.prompt_session:
res = self.prompt_session.prompt(question + " ", default=default, style=style)
res = self.prompt_session.prompt(
question + " ",
default=default,
style=style,
complete_while_typing=True,
)
else:
res = input(question + " ")
@@ -545,6 +799,9 @@ class InputOutput:
if self.yes in (True, False):
self.tool_output(hist)
# Restore original multiline mode
self.multiline_mode = orig_multiline
return res
def _tool_message(self, message="", strip=True, color=None):
@@ -556,9 +813,17 @@ class InputOutput:
hist = message.strip() if strip else message
self.append_chat_history(hist, linebreak=True, blockquote=True)
message = Text(message)
if not isinstance(message, Text):
message = Text(message)
style = dict(style=color) if self.pretty and color else dict()
self.console.print(message, **style)
try:
self.console.print(message, **style)
except UnicodeEncodeError:
# Fallback to ASCII-safe output
if isinstance(message, Text):
message = message.plain
message = str(message).encode("ascii", errors="replace").decode("ascii")
self.console.print(message, **style)
def tool_error(self, message="", strip=True):
self.num_error_outputs += 1
@@ -586,27 +851,46 @@ class InputOutput:
style = RichStyle(**style)
self.console.print(*messages, style=style)
def assistant_output(self, message, stream=False):
mdStream = None
def get_assistant_mdstream(self):
mdargs = dict(style=self.assistant_output_color, code_theme=self.code_theme)
mdStream = MarkdownStream(mdargs=mdargs)
return mdStream
def assistant_output(self, message, pretty=None):
show_resp = message
if self.pretty:
if stream:
mdargs = dict(style=self.assistant_output_color, code_theme=self.code_theme)
mdStream = MarkdownStream(mdargs=mdargs)
else:
show_resp = Markdown(
message, style=self.assistant_output_color, code_theme=self.code_theme
)
# Coder will force pretty off if fence is not triple-backticks
if pretty is None:
pretty = self.pretty
if pretty:
show_resp = Markdown(
message, style=self.assistant_output_color, code_theme=self.code_theme
)
else:
show_resp = Text(message or "<no response>")
self.console.print(show_resp)
return mdStream
def set_placeholder(self, placeholder):
"""Set a one-time placeholder text for the next input prompt."""
self.placeholder = placeholder
def print(self, message=""):
print(message)
def toggle_multiline_mode(self):
"""Toggle between normal and multiline input modes"""
self.multiline_mode = not self.multiline_mode
if self.multiline_mode:
self.tool_output(
"Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text"
)
else:
self.tool_output(
"Multiline mode: Disabled. Alt-Enter inserts newline, Enter submits text"
)
def append_chat_history(self, text, linebreak=False, blockquote=False, strip=True):
if blockquote:
if strip:
@@ -620,11 +904,63 @@ class InputOutput:
text += "\n"
if self.chat_history_file is not None:
try:
with self.chat_history_file.open("a", encoding=self.encoding) as f:
with self.chat_history_file.open("a", encoding=self.encoding, errors="ignore") as f:
f.write(text)
except (PermissionError, OSError):
self.tool_error(
f"Warning: Unable to write to chat history file {self.chat_history_file}."
" Permission denied."
)
except (PermissionError, OSError) as err:
print(f"Warning: Unable to write to chat history file {self.chat_history_file}.")
print(err)
self.chat_history_file = None # Disable further attempts to write
def format_files_for_input(self, rel_fnames, rel_read_only_fnames):
if not self.pretty:
read_only_files = []
for full_path in sorted(rel_read_only_fnames or []):
read_only_files.append(f"{full_path} (read only)")
editable_files = []
for full_path in sorted(rel_fnames):
if full_path in rel_read_only_fnames:
continue
editable_files.append(f"{full_path}")
return "\n".join(read_only_files + editable_files) + "\n"
output = StringIO()
console = Console(file=output, force_terminal=False)
read_only_files = sorted(rel_read_only_fnames or [])
editable_files = [f for f in sorted(rel_fnames) if f not in rel_read_only_fnames]
if read_only_files:
# Use shorter of abs/rel paths for readonly files
ro_paths = []
for rel_path in read_only_files:
abs_path = os.path.abspath(os.path.join(self.root, rel_path))
ro_paths.append(abs_path if len(abs_path) < len(rel_path) else rel_path)
files_with_label = ["Readonly:"] + ro_paths
read_only_output = StringIO()
Console(file=read_only_output, force_terminal=False).print(Columns(files_with_label))
read_only_lines = read_only_output.getvalue().splitlines()
console.print(Columns(files_with_label))
if editable_files:
files_with_label = editable_files
if read_only_files:
files_with_label = ["Editable:"] + editable_files
editable_output = StringIO()
Console(file=editable_output, force_terminal=False).print(Columns(files_with_label))
editable_lines = editable_output.getvalue().splitlines()
if len(read_only_lines) > 1 or len(editable_lines) > 1:
console.print()
console.print(Columns(files_with_label))
return output.getvalue()
def get_rel_fname(fname, root):
try:
return os.path.relpath(fname, root)
except ValueError:
return fname

View File

@@ -11,6 +11,7 @@ from grep_ast import TreeContext, filename_to_lang
from tree_sitter_languages import get_parser # noqa: E402
from aider.dump import dump # noqa: F401
from aider.run_cmd import run_cmd_subprocess # noqa: F401
# tree_sitter is throwing a FutureWarning
warnings.simplefilter("ignore", category=FutureWarning)
@@ -44,26 +45,22 @@ class Linter:
def run_cmd(self, cmd, rel_fname, code):
cmd += " " + rel_fname
cmd = cmd.split()
returncode = 0
stdout = ""
try:
process = subprocess.Popen(
returncode, stdout = run_cmd_subprocess(
cmd,
cwd=self.root,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
encoding=self.encoding,
errors="replace",
)
except OSError as err:
print(f"Unable to execute lint command: {err}")
return
stdout, _ = process.communicate()
errors = stdout
if process.returncode == 0:
if returncode == 0:
return # zero exit status
cmd = " ".join(cmd)
res = f"## Running: {cmd}\n\n"
res += errors
@@ -83,7 +80,11 @@ class Linter:
def lint(self, fname, cmd=None):
rel_fname = self.get_rel_fname(fname)
code = Path(fname).read_text(encoding=self.encoding, errors="replace")
try:
code = Path(fname).read_text(encoding=self.encoding, errors="replace")
except OSError as err:
print(f"Unable to read {fname}: {err}")
return
if cmd:
cmd = cmd.strip()
@@ -148,12 +149,12 @@ class Linter:
try:
result = subprocess.run(
flake8_cmd,
cwd=self.root,
capture_output=True,
text=True,
check=False,
encoding=self.encoding,
errors="replace",
cwd=self.root,
)
errors = result.stdout + result.stderr
except Exception as e:
@@ -211,13 +212,18 @@ def basic_lint(fname, code):
try:
parser = get_parser(lang)
except OSError as err:
except Exception as err:
print(f"Unable to load parser: {err}")
return
tree = parser.parse(bytes(code, "utf-8"))
errors = traverse_tree(tree.root_node)
try:
errors = traverse_tree(tree.root_node)
except RecursionError:
print(f"Unable to lint {fname} due to RecursionError")
return
if not errors:
return

View File

@@ -13,6 +13,8 @@ os.environ["LITELLM_MODE"] = "PRODUCTION"
# `import litellm` takes 1.5 seconds, defer it!
VERBOSE = False
class LazyLiteLLM:
_lazy_module = None
@@ -27,6 +29,9 @@ class LazyLiteLLM:
if self._lazy_module is not None:
return
if VERBOSE:
print("Loading litellm...")
self._lazy_module = importlib.import_module("litellm")
self._lazy_module.suppress_debug_info = True

View File

@@ -5,27 +5,56 @@ import re
import sys
import threading
import traceback
import webbrowser
from dataclasses import fields
from pathlib import Path
import git
try:
import git
except ImportError:
git = None
import importlib_resources
from dotenv import load_dotenv
from prompt_toolkit.enums import EditingMode
from aider import __version__, models, utils
from aider import __version__, models, urls, utils
from aider.analytics import Analytics
from aider.args import get_parser
from aider.coders import Coder
from aider.coders.base_coder import UnknownEditFormat
from aider.commands import Commands, SwitchCoder
from aider.copypaste import ClipboardWatcher
from aider.format_settings import format_settings, scrub_sensitive_info
from aider.history import ChatSummary
from aider.io import InputOutput
from aider.llm import litellm # noqa: F401; properly init litellm on launch
from aider.models import ModelSettings
from aider.repo import ANY_GIT_ERROR, GitRepo
from aider.report import report_uncaught_exceptions
from aider.versioncheck import check_version, install_from_main_branch, install_upgrade
from aider.watch import FileWatcher
from .dump import dump # noqa: F401
def check_config_files_for_yes(config_files):
found = False
for config_file in config_files:
if Path(config_file).exists():
try:
with open(config_file, "r") as f:
for line in f:
if line.strip().startswith("yes:"):
print("Configuration error detected.")
print(f"The file {config_file} contains a line starting with 'yes:'")
print("Please replace 'yes:' with 'yes-always:' in this file.")
found = True
except Exception:
pass
return found
def get_git_root():
"""Try and guess the git repo, since the conf.yml can be at the repo root"""
try:
@@ -40,7 +69,7 @@ def guessed_wrong_repo(io, git_root, fnames, git_dname):
try:
check_repo = Path(GitRepo(io, fnames, git_dname).root).resolve()
except FileNotFoundError:
except (OSError,) + ANY_GIT_ERROR:
return
# we had no guess, rely on the "true" repo result
@@ -68,15 +97,30 @@ def make_new_repo(git_root, io):
def setup_git(git_root, io):
if git is None:
return
try:
cwd = Path.cwd()
except OSError:
cwd = None
repo = None
if git_root:
repo = git.Repo(git_root)
elif Path.cwd() == Path.home():
io.tool_warning("You should probably run aider in a directory, not your home dir.")
try:
repo = git.Repo(git_root)
except ANY_GIT_ERROR:
pass
elif cwd == Path.home():
io.tool_warning(
"You should probably run aider in your project's directory, not your home dir."
)
return
elif io.confirm_ask("No git repo found, create one to track aider's changes (recommended)?"):
git_root = str(Path.cwd().resolve())
elif cwd and io.confirm_ask(
"No git repo found, create one to track aider's changes (recommended)?"
):
git_root = str(cwd.resolve())
repo = make_new_repo(git_root, io)
if not repo:
@@ -114,32 +158,52 @@ def check_gitignore(git_root, io, ask=True):
try:
repo = git.Repo(git_root)
if repo.ignored(".aider"):
if repo.ignored(".aider") and repo.ignored(".env"):
return
except ANY_GIT_ERROR:
pass
pat = ".aider*"
patterns = [".aider*", ".env"]
patterns_to_add = []
gitignore_file = Path(git_root) / ".gitignore"
if gitignore_file.exists():
content = io.read_text(gitignore_file)
if content is None:
return
if pat in content.splitlines():
try:
content = io.read_text(gitignore_file)
if content is None:
return
existing_lines = content.splitlines()
for pat in patterns:
if pat not in existing_lines:
if "*" in pat or (Path(git_root) / pat).exists():
patterns_to_add.append(pat)
except OSError as e:
io.tool_error(f"Error when trying to read {gitignore_file}: {e}")
return
else:
content = ""
patterns_to_add = patterns
if ask and not io.confirm_ask(f"Add {pat} to .gitignore (recommended)?"):
if not patterns_to_add:
return
if ask and not io.confirm_ask(f"Add {', '.join(patterns_to_add)} to .gitignore (recommended)?"):
return
if content and not content.endswith("\n"):
content += "\n"
content += pat + "\n"
io.write_text(gitignore_file, content)
content += "\n".join(patterns_to_add) + "\n"
io.tool_output(f"Added {pat} to .gitignore")
try:
io.write_text(gitignore_file, content)
io.tool_output(f"Added {', '.join(patterns_to_add)} to .gitignore")
except OSError as e:
io.tool_error(f"Error when trying to write to {gitignore_file}: {e}")
io.tool_output(
"Try running with appropriate permissions or manually add these patterns to .gitignore:"
)
for pattern in patterns_to_add:
io.tool_output(f" {pattern}")
def check_streamlit_install(io):
@@ -151,6 +215,22 @@ def check_streamlit_install(io):
)
def write_streamlit_credentials():
from streamlit.file_util import get_streamlit_file_path
# See https://github.com/Aider-AI/aider/issues/772
credential_path = Path(get_streamlit_file_path()) / "credentials.toml"
if not os.path.exists(credential_path):
empty_creds = '[general]\nemail = ""\n'
os.makedirs(os.path.dirname(credential_path), exist_ok=True)
with open(credential_path, "w") as f:
f.write(empty_creds)
else:
print("Streamlit credentials already exist.")
def launch_gui(args):
from streamlit.web import cli
@@ -159,6 +239,9 @@ def launch_gui(args):
print()
print("CONTROL-C to exit...")
# Necessary so streamlit does not prompt the user for an email address.
write_streamlit_credentials()
target = gui.__file__
st_args = ["run", target]
@@ -169,7 +252,10 @@ def launch_gui(args):
"--server.runOnSave=false",
]
if "-dev" in __version__:
# https://github.com/Aider-AI/aider/issues/2193
is_dev = "-dev" in str(__version__)
if is_dev:
print("Watching for file changes.")
else:
st_args += [
@@ -217,16 +303,23 @@ def parse_lint_cmds(lint_cmds, io):
return res
def generate_search_path_list(default_fname, git_root, command_line_file):
def generate_search_path_list(default_file, git_root, command_line_file):
files = []
default_file = Path(default_fname)
files.append(Path.home() / default_file) # homedir
if git_root:
files.append(Path(git_root) / default_file) # git root
files.append(default_file.resolve())
files.append(default_file)
if command_line_file:
files.append(command_line_file)
files = [Path(fn).resolve() for fn in files]
resolved_files = []
for fn in files:
try:
resolved_files.append(Path(fn).resolve())
except OSError:
pass
files = resolved_files
files.reverse()
uniq = []
for fn in files:
@@ -266,7 +359,7 @@ def register_models(git_root, model_settings_fname, io, verbose=False):
return None
def load_dotenv_files(git_root, dotenv_fname):
def load_dotenv_files(git_root, dotenv_fname, encoding="utf-8"):
dotenv_files = generate_search_path_list(
".env",
git_root,
@@ -274,19 +367,30 @@ def load_dotenv_files(git_root, dotenv_fname):
)
loaded = []
for fname in dotenv_files:
if Path(fname).exists():
loaded.append(fname)
load_dotenv(fname, override=True)
try:
if Path(fname).exists():
load_dotenv(fname, override=True, encoding=encoding)
loaded.append(fname)
except OSError as e:
print(f"OSError loading {fname}: {e}")
except Exception as e:
print(f"Error loading {fname}: {e}")
return loaded
def register_litellm_models(git_root, model_metadata_fname, io, verbose=False):
model_metatdata_files = generate_search_path_list(
model_metadata_files = []
# Add the resource file path
resource_metadata = importlib_resources.files("aider.resources").joinpath("model-metadata.json")
model_metadata_files.append(str(resource_metadata))
model_metadata_files += generate_search_path_list(
".aider.model.metadata.json", git_root, model_metadata_fname
)
try:
model_metadata_files_loaded = models.register_litellm_models(model_metatdata_files)
model_metadata_files_loaded = models.register_litellm_models(model_metadata_files)
if len(model_metadata_files_loaded) > 0 and verbose:
io.tool_output("Loaded model metadata from:")
for model_metadata_file in model_metadata_files_loaded:
@@ -304,11 +408,18 @@ def sanity_check_repo(repo, io):
io.tool_error("The git repo does not seem to have a working tree?")
return False
bad_ver = False
try:
repo.get_tracked_files()
if not repo.git_repo_error:
return True
error_msg = str(repo.git_repo_error)
except UnicodeDecodeError as exc:
error_msg = (
"Failed to read the Git repository. This issue is likely caused by a path encoded "
f'in a format different from the expected encoding "{sys.getfilesystemencoding()}".\n'
f"Internal error: {str(exc)}"
)
except ANY_GIT_ERROR as exc:
error_msg = str(exc)
bad_ver = "version in (1, 2)" in error_msg
@@ -320,7 +431,7 @@ def sanity_check_repo(repo, io):
io.tool_error("Aider only works with git repos with version number 1 or 2.")
io.tool_output("You may be able to convert your repo: git update-index --index-version=2")
io.tool_output("Or run aider --no-git to proceed without using git.")
io.tool_output("https://github.com/paul-gauthier/aider/issues/211")
io.offer_url(urls.git_index_version, "Open documentation url for more info?")
return False
io.tool_error("Unable to read git repository, it may be corrupt?")
@@ -334,14 +445,21 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if argv is None:
argv = sys.argv[1:]
if force_git_root:
if git is None:
git_root = None
elif force_git_root:
git_root = force_git_root
else:
git_root = get_git_root()
conf_fname = Path(".aider.conf.yml")
default_config_files = [conf_fname.resolve()] # CWD
default_config_files = []
try:
default_config_files += [conf_fname.resolve()] # CWD
except OSError:
pass
if git_root:
git_conf = Path(git_root) / conf_fname # git root
if git_conf not in default_config_files:
@@ -350,7 +468,13 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
default_config_files = list(map(str, default_config_files))
parser = get_parser(default_config_files, git_root)
args, unknown = parser.parse_known_args(argv)
try:
args, unknown = parser.parse_known_args(argv)
except AttributeError as e:
if all(word in str(e) for word in ["bool", "object", "has", "no", "attribute", "strip"]):
if check_config_files_for_yes(default_config_files):
return 1
raise e
if args.verbose:
print("Config files search order, if no --config:")
@@ -361,19 +485,33 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
default_config_files.reverse()
parser = get_parser(default_config_files, git_root)
args, unknown = parser.parse_known_args(argv)
# Load the .env file specified in the arguments
loaded_dotenvs = load_dotenv_files(git_root, args.env_file)
loaded_dotenvs = load_dotenv_files(git_root, args.env_file, args.encoding)
# Parse again to include any arguments that might have been defined in .env
args = parser.parse_args(argv)
if git is None:
args.git = False
if args.analytics_disable:
analytics = Analytics(permanently_disable=True)
print("Analytics have been permanently disabled.")
if not args.verify_ssl:
import httpx
os.environ["SSL_VERIFY"] = ""
litellm._load_litellm()
litellm._lazy_module.client_session = httpx.Client(verify=False)
litellm._lazy_module.aclient_session = httpx.AsyncClient(verify=False)
if args.timeout:
litellm._load_litellm()
litellm._lazy_module.request_timeout = args.timeout
if args.dark_mode:
args.user_input_color = "#32FF32"
@@ -389,28 +527,35 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
args.assistant_output_color = "blue"
args.code_theme = "default"
if return_coder and args.yes is None:
args.yes = True
if return_coder and args.yes_always is None:
args.yes_always = True
editing_mode = EditingMode.VI if args.vim else EditingMode.EMACS
def get_io(pretty):
return InputOutput(
pretty,
args.yes,
args.yes_always,
args.input_history_file,
args.chat_history_file,
input=input,
output=output,
user_input_color=args.user_input_color,
tool_output_color=args.tool_output_color,
tool_warning_color=args.tool_warning_color,
tool_error_color=args.tool_error_color,
completion_menu_color=args.completion_menu_color,
completion_menu_bg_color=args.completion_menu_bg_color,
completion_menu_current_color=args.completion_menu_current_color,
completion_menu_current_bg_color=args.completion_menu_current_bg_color,
assistant_output_color=args.assistant_output_color,
code_theme=args.code_theme,
dry_run=args.dry_run,
encoding=args.encoding,
llm_history_file=args.llm_history_file,
editingmode=editing_mode,
fancy_input=args.fancy_input,
multiline_mode=args.multiline,
)
io = get_io(args.pretty)
@@ -422,10 +567,82 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
io = get_io(False)
io.tool_warning("Terminal does not support pretty output (UnicodeDecodeError)")
# Process any environment variables set via --set-env
if args.set_env:
for env_setting in args.set_env:
try:
name, value = env_setting.split("=", 1)
os.environ[name.strip()] = value.strip()
except ValueError:
io.tool_error(f"Invalid --set-env format: {env_setting}")
io.tool_output("Format should be: ENV_VAR_NAME=value")
return 1
# Process any API keys set via --api-key
if args.api_key:
for api_setting in args.api_key:
try:
provider, key = api_setting.split("=", 1)
env_var = f"{provider.strip().upper()}_API_KEY"
os.environ[env_var] = key.strip()
except ValueError:
io.tool_error(f"Invalid --api-key format: {api_setting}")
io.tool_output("Format should be: provider=key")
return 1
if args.anthropic_api_key:
os.environ["ANTHROPIC_API_KEY"] = args.anthropic_api_key
if args.openai_api_key:
os.environ["OPENAI_API_KEY"] = args.openai_api_key
if args.openai_api_base:
os.environ["OPENAI_API_BASE"] = args.openai_api_base
if args.openai_api_version:
io.tool_warning(
"--openai-api-version is deprecated, use --set-env OPENAI_API_VERSION=<value>"
)
os.environ["OPENAI_API_VERSION"] = args.openai_api_version
if args.openai_api_type:
io.tool_warning("--openai-api-type is deprecated, use --set-env OPENAI_API_TYPE=<value>")
os.environ["OPENAI_API_TYPE"] = args.openai_api_type
if args.openai_organization_id:
io.tool_warning(
"--openai-organization-id is deprecated, use --set-env OPENAI_ORGANIZATION=<value>"
)
os.environ["OPENAI_ORGANIZATION"] = args.openai_organization_id
analytics = Analytics(logfile=args.analytics_log, permanently_disable=args.analytics_disable)
if args.analytics is not False:
if analytics.need_to_ask(args.analytics):
io.tool_output(
"Aider respects your privacy and never collects your code, chat messages, keys or"
" personal info."
)
io.tool_output(f"For more info: {urls.analytics}")
disable = not io.confirm_ask(
"Allow collection of anonymous analytics to help improve aider?"
)
analytics.asked_opt_in = True
if disable:
analytics.disable(permanently=True)
io.tool_output("Analytics have been permanently disabled.")
analytics.save_data()
io.tool_output()
# This is a no-op if the user has opted out
analytics.enable()
analytics.event("launched")
if args.gui and not return_coder:
if not check_streamlit_install(io):
analytics.event("exit", reason="Streamlit not installed")
return
analytics.event("gui session")
launch_gui(argv)
analytics.event("exit", reason="GUI session ended")
return
if args.verbose:
@@ -434,7 +651,14 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
all_files = args.files + (args.file or [])
fnames = [str(Path(fn).resolve()) for fn in all_files]
read_only_fnames = [str(Path(fn).resolve()) for fn in (args.read or [])]
read_only_fnames = []
for fn in args.read or []:
path = Path(fn).expanduser().resolve()
if path.is_dir():
read_only_fnames.extend(str(f) for f in path.rglob("*") if f.is_file())
else:
read_only_fnames.append(str(path))
if len(all_files) > 1:
good = True
for fname in all_files:
@@ -445,6 +669,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
io.tool_output(
"Provide either a single directory of a git repo, or a list of one or more files."
)
analytics.event("exit", reason="Invalid directory input")
return 1
git_dname = None
@@ -455,26 +680,31 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
fnames = []
else:
io.tool_error(f"{all_files[0]} is a directory, but --no-git selected.")
analytics.event("exit", reason="Directory with --no-git")
return 1
# We can't know the git repo for sure until after parsing the args.
# If we guessed wrong, reparse because that changes things like
# the location of the config.yml and history files.
if args.git and not force_git_root:
if args.git and not force_git_root and git is not None:
right_repo_root = guessed_wrong_repo(io, git_root, fnames, git_dname)
if right_repo_root:
analytics.event("exit", reason="Recursing with correct repo")
return main(argv, input, output, right_repo_root, return_coder=return_coder)
if args.just_check_update:
update_available = check_version(io, just_check=True, verbose=args.verbose)
analytics.event("exit", reason="Just checking update")
return 0 if not update_available else 1
if args.install_main_branch:
success = install_from_main_branch(io)
analytics.event("exit", reason="Installed main branch")
return 0 if success else 1
if args.upgrade:
success = install_upgrade(io)
analytics.event("exit", reason="Upgrade completed")
return 0 if success else 1
if args.check_update:
@@ -482,6 +712,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if args.list_models:
models.print_matching_models(io, args.list_models)
analytics.event("exit", reason="Listed models")
return 0
if args.git:
@@ -497,49 +728,67 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
cmd_line = scrub_sensitive_info(args, cmd_line)
io.tool_output(cmd_line, log_only=True)
check_and_load_imports(io, verbose=args.verbose)
if args.anthropic_api_key:
os.environ["ANTHROPIC_API_KEY"] = args.anthropic_api_key
if args.openai_api_key:
os.environ["OPENAI_API_KEY"] = args.openai_api_key
if args.openai_api_base:
os.environ["OPENAI_API_BASE"] = args.openai_api_base
if args.openai_api_version:
os.environ["OPENAI_API_VERSION"] = args.openai_api_version
if args.openai_api_type:
os.environ["OPENAI_API_TYPE"] = args.openai_api_type
if args.openai_organization_id:
os.environ["OPENAI_ORGANIZATION"] = args.openai_organization_id
is_first_run = is_first_run_of_new_version(io, verbose=args.verbose)
check_and_load_imports(io, is_first_run, verbose=args.verbose)
register_models(git_root, args.model_settings_file, io, verbose=args.verbose)
register_litellm_models(git_root, args.model_metadata_file, io, verbose=args.verbose)
# Process any command line aliases
if args.alias:
for alias_def in args.alias:
# Split on first colon only
parts = alias_def.split(":", 1)
if len(parts) != 2:
io.tool_error(f"Invalid alias format: {alias_def}")
io.tool_output("Format should be: alias:model-name")
analytics.event("exit", reason="Invalid alias format error")
return 1
alias, model = parts
models.MODEL_ALIASES[alias.strip()] = model.strip()
if not args.model:
args.model = "gpt-4o-2024-08-06"
if os.environ.get("ANTHROPIC_API_KEY"):
args.model = "claude-3-5-sonnet-20240620"
args.model = "claude-3-5-sonnet-20241022"
main_model = models.Model(args.model, weak_model=args.weak_model)
main_model = models.Model(
args.model,
weak_model=args.weak_model,
editor_model=args.editor_model,
editor_edit_format=args.editor_edit_format,
)
if args.copy_paste and args.edit_format is None:
if main_model.edit_format in ("diff", "whole"):
main_model.edit_format = "editor-" + main_model.edit_format
if args.verbose:
io.tool_output("Model info:")
io.tool_output("Model metadata:")
io.tool_output(json.dumps(main_model.info, indent=4))
io.tool_output("Model settings:")
for attr in sorted(fields(ModelSettings), key=lambda x: x.name):
val = getattr(main_model, attr.name)
val = json.dumps(val, indent=4)
io.tool_output(f"{attr.name}: {val}")
lint_cmds = parse_lint_cmds(args.lint_cmd, io)
if lint_cmds is None:
analytics.event("exit", reason="Invalid lint command format")
return 1
if args.show_model_warnings:
problem = models.sanity_check_models(io, main_model)
if problem:
analytics.event("model warning", main_model=main_model)
io.tool_output("You can skip this check with --no-show-model-warnings")
io.tool_output()
try:
if not io.confirm_ask("Proceed anyway?"):
return 1
io.offer_url(urls.model_warnings, "Open documentation url for more info?")
io.tool_output()
except KeyboardInterrupt:
analytics.event("exit", reason="Keyboard interrupt during model warnings")
return 1
repo = None
@@ -561,11 +810,27 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
except FileNotFoundError:
pass
if not sanity_check_repo(repo, io):
return 1
if not args.skip_sanity_check_repo:
if not sanity_check_repo(repo, io):
analytics.event("exit", reason="Repository sanity check failed")
return 1
if repo:
analytics.event("repo", num_files=len(repo.get_tracked_files()))
else:
analytics.event("no-repo")
commands = Commands(
io, None, verify_ssl=args.verify_ssl, args=args, parser=parser, verbose=args.verbose
io,
None,
voice_language=args.voice_language,
voice_input_device=args.voice_input_device,
voice_format=args.voice_format,
verify_ssl=args.verify_ssl,
args=args,
parser=parser,
verbose=args.verbose,
editor=args.editor,
)
summarizer = ChatSummary(
@@ -579,10 +844,15 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if not main_model.streaming:
if args.stream:
io.tool_warning(
"Warning: Streaming is not supported by the selected model. Disabling streaming."
f"Warning: Streaming is not supported by {main_model.name}. Disabling streaming."
)
args.stream = False
if args.map_tokens is None:
map_tokens = main_model.get_repo_map_tokens()
else:
map_tokens = args.map_tokens
try:
coder = Coder.create(
main_model=main_model,
@@ -595,7 +865,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
auto_commits=args.auto_commits,
dirty_commits=args.dirty_commits,
dry_run=args.dry_run,
map_tokens=args.map_tokens,
map_tokens=map_tokens,
verbose=args.verbose,
stream=args.stream,
use_git=args.git,
@@ -606,20 +876,50 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
test_cmd=args.test_cmd,
commands=commands,
summarizer=summarizer,
analytics=analytics,
map_refresh=args.map_refresh,
cache_prompts=args.cache_prompts,
map_mul_no_files=args.map_multiplier_no_files,
num_cache_warming_pings=args.cache_keepalive_pings,
suggest_shell_commands=args.suggest_shell_commands,
chat_language=args.chat_language,
detect_urls=args.detect_urls,
auto_copy_context=args.copy_paste,
)
except UnknownEditFormat as err:
io.tool_error(str(err))
io.offer_url(urls.edit_formats, "Open documentation about edit formats?")
analytics.event("exit", reason="Unknown edit format")
return 1
except ValueError as err:
io.tool_error(str(err))
analytics.event("exit", reason="ValueError during coder creation")
return 1
if return_coder:
analytics.event("exit", reason="Returning coder object")
return coder
ignores = []
if git_root:
ignores.append(str(Path(git_root) / ".gitignore"))
if args.aiderignore:
ignores.append(args.aiderignore)
if args.watch_files:
file_watcher = FileWatcher(
coder,
gitignores=ignores,
verbose=args.verbose,
analytics=analytics,
root=str(Path.cwd()) if args.subtree_only else None,
)
coder.file_watcher = file_watcher
if args.copy_paste:
analytics.event("copy-paste mode")
ClipboardWatcher(coder.io, verbose=args.verbose)
coder.show_announcements()
if args.show_prompts:
@@ -628,6 +928,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
]
messages = coder.format_messages().all_messages()
utils.show_messages(messages)
analytics.event("exit", reason="Showed prompts")
return
if args.lint:
@@ -636,10 +937,11 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
if args.test:
if not args.test_cmd:
io.tool_error("No --test-cmd provided.")
analytics.event("exit", reason="No test command provided")
return 1
test_errors = coder.commands.cmd_test(args.test_cmd)
if test_errors:
coder.run(test_errors)
coder.commands.cmd_test(args.test_cmd)
if io.placeholder:
coder.run(io.placeholder)
if args.commit:
if args.dry_run:
@@ -648,27 +950,41 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
coder.commands.cmd_commit()
if args.lint or args.test or args.commit:
analytics.event("exit", reason="Completed lint/test/commit")
return
if args.show_repo_map:
repo_map = coder.get_repo_map()
if repo_map:
io.tool_output(repo_map)
analytics.event("exit", reason="Showed repo map")
return
if args.apply:
content = io.read_text(args.apply)
if content is None:
analytics.event("exit", reason="Failed to read apply content")
return
coder.partial_response_content = content
coder.apply_updates()
analytics.event("exit", reason="Applied updates")
return
if "VSCODE_GIT_IPC_HANDLE" in os.environ:
args.pretty = False
io.tool_output("VSCode terminal detected, pretty output has been disabled.")
if args.apply_clipboard_edits:
args.edit_format = main_model.editor_edit_format
args.message = "/paste"
io.tool_output('Use /help <question> for help, run "aider --help" to see cmd line args')
if args.show_release_notes is True:
io.tool_output(f"Opening release notes: {urls.release_notes}")
io.tool_output()
webbrowser.open(urls.release_notes)
elif args.show_release_notes is None and is_first_run:
io.tool_output()
io.offer_url(
urls.release_notes,
"Would you like to see what's new in this version?",
allow_never=False,
)
if git_root and Path.cwd().resolve() != Path(git_root).resolve():
io.tool_warning(
@@ -679,6 +995,9 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
io.tool_output(f"Cur working dir: {Path.cwd()}")
io.tool_output(f"Git working dir: {git_root}")
if args.load:
commands.cmd_load(args.load)
if args.message:
io.add_to_input_history(args.message)
io.tool_output()
@@ -686,6 +1005,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
coder.run(with_message=args.message)
except SwitchCoder:
pass
analytics.event("exit", reason="Completed --message")
return
if args.message_file:
@@ -695,18 +1015,26 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
coder.run(with_message=message_from_file)
except FileNotFoundError:
io.tool_error(f"Message file not found: {args.message_file}")
analytics.event("exit", reason="Message file not found")
return 1
except IOError as e:
io.tool_error(f"Error reading message file: {e}")
analytics.event("exit", reason="Message file IO error")
return 1
analytics.event("exit", reason="Completed --message-file")
return
if args.exit:
analytics.event("exit", reason="Exit flag set")
return
analytics.event("cli session", main_model=main_model, edit_format=main_model.edit_format)
while True:
try:
coder.run()
analytics.event("exit", reason="Completed main CLI coder.run")
return
except SwitchCoder as switch:
kwargs = dict(io=io, from_coder=coder)
@@ -720,10 +1048,15 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
coder.show_announcements()
def check_and_load_imports(io, verbose=False):
def is_first_run_of_new_version(io, verbose=False):
"""Check if this is the first run of a new version/executable combination"""
installs_file = Path.home() / ".aider" / "installs.json"
key = (__version__, sys.executable)
# Never show notes for .dev versions
if ".dev" in __version__:
return False
if verbose:
io.tool_output(
f"Checking imports for version {__version__} and executable {sys.executable}"
@@ -741,7 +1074,26 @@ def check_and_load_imports(io, verbose=False):
if verbose:
io.tool_output("Installs file does not exist, creating new dictionary")
if str(key) not in installs:
is_first_run = str(key) not in installs
if is_first_run:
installs[str(key)] = True
installs_file.parent.mkdir(parents=True, exist_ok=True)
with open(installs_file, "w") as f:
json.dump(installs, f, indent=4)
return is_first_run
except Exception as e:
io.tool_warning(f"Error checking version: {e}")
if verbose:
io.tool_output(f"Full exception details: {traceback.format_exc()}")
return True # Safer to assume it's a first run if we hit an error
def check_and_load_imports(io, is_first_run, verbose=False):
try:
if is_first_run:
if verbose:
io.tool_output(
"First run for this version and executable, loading imports synchronously"
@@ -751,13 +1103,9 @@ def check_and_load_imports(io, verbose=False):
except Exception as err:
io.tool_error(str(err))
io.tool_output("Error loading required imports. Did you install aider properly?")
io.tool_output("https://aider.chat/docs/install/install.html")
io.offer_url(urls.install_properly, "Open documentation url for more info?")
sys.exit(1)
installs[str(key)] = True
installs_file.parent.mkdir(parents=True, exist_ok=True)
with open(installs_file, "w") as f:
json.dump(installs, f, indent=4)
if verbose:
io.tool_output("Imports loaded and installs file updated")
else:
@@ -766,8 +1114,9 @@ def check_and_load_imports(io, verbose=False):
thread = threading.Thread(target=load_slow_imports)
thread.daemon = True
thread.start()
except Exception as e:
io.tool_warning(f"Error in checking imports: {e}")
io.tool_warning(f"Error in loading imports: {e}")
if verbose:
io.tool_output(f"Full exception details: {traceback.format_exc()}")

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -0,0 +1,91 @@
(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
(enum_declaration
name: (identifier) @name.definition.enum) @definition.enum
(function_signature
name: (identifier) @name.definition.function) @definition.function
(new_expression
(type_identifier) @name.reference.class) @reference.class
(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.call))) @reference.call
(assignment_expression
left: (assignable_expression
(identifier)
(conditional_assignable_selector
"?."
(identifier) @name.reference.call))) @reference.call
((identifier) @name
(selector
"!"?
(conditional_assignable_selector
"?." (identifier) @name.reference.call)?
(unconditional_assignable_selector
"."? (identifier) @name.reference.call)?
(argument_part
(arguments
(argument)*))?)*
(cascade_section
(cascade_selector
(identifier)) @name.reference.call
(argument_part
(arguments
(argument)*))?)?) @reference.call

View File

@@ -2,7 +2,18 @@ import os
import time
from pathlib import Path, PurePosixPath
import git
try:
import git
ANY_GIT_ERROR = [
git.exc.ODBError,
git.exc.GitError,
git.exc.InvalidGitRepositoryError,
]
except ImportError:
git = None
ANY_GIT_ERROR = []
import pathspec
from aider import prompts, utils
@@ -10,7 +21,16 @@ from aider.sendchat import simple_send_with_retries
from .dump import dump # noqa: F401
ANY_GIT_ERROR = (git.exc.ODBError, git.exc.GitError, OSError, IndexError, BufferError)
ANY_GIT_ERROR += [
OSError,
IndexError,
BufferError,
TypeError,
ValueError,
AttributeError,
AssertionError,
]
ANY_GIT_ERROR = tuple(ANY_GIT_ERROR)
class GitRepo:
@@ -161,7 +181,7 @@ class GitRepo:
def get_rel_repo_dir(self):
try:
return os.path.relpath(self.repo.git_dir, os.getcwd())
except ValueError:
except (ValueError, OSError):
return self.repo.git_dir
def get_commit_message(self, diffs, context):
@@ -184,9 +204,7 @@ class GitRepo:
max_tokens = model.info.get("max_input_tokens") or 0
if max_tokens and num_tokens > max_tokens:
continue
commit_message = simple_send_with_retries(
model.name, messages, extra_headers=model.extra_headers
)
commit_message = simple_send_with_retries(model, messages)
if commit_message:
break
@@ -270,9 +288,17 @@ class GitRepo:
files = self.tree_files[commit]
else:
try:
for blob in commit.tree.traverse():
if blob.type == "blob": # blob is a file
files.add(blob.path)
iterator = commit.tree.traverse()
while True:
try:
blob = next(iterator)
if blob.type == "blob": # blob is a file
files.add(blob.path)
except IndexError:
self.io.tool_warning(f"GitRepo: read error skipping {blob.path}")
continue
except StopIteration:
break
except ANY_GIT_ERROR as err:
self.git_repo_error = err
self.io.tool_error(f"Unable to list files in git repo: {err}")
@@ -323,6 +349,15 @@ class GitRepo:
lines,
)
def git_ignored_file(self, path):
if not self.repo:
return
try:
if self.repo.ignored(path):
return True
except ANY_GIT_ERROR:
return False
def ignored_file(self, fname):
self.refresh_aider_ignore()
@@ -335,8 +370,15 @@ class GitRepo:
def ignored_file_raw(self, fname):
if self.subtree_only:
fname_path = Path(self.normalize_path(fname))
cwd_path = Path.cwd().resolve().relative_to(Path(self.root).resolve())
try:
fname_path = Path(self.normalize_path(fname))
cwd_path = Path.cwd().resolve().relative_to(Path(self.root).resolve())
except ValueError:
# Issue #1524
# ValueError: 'C:\\dev\\squid-certbot' is not in the subpath of
# 'C:\\dev\\squid-certbot'
# Clearly, fname is not under cwd... so ignore it
return True
if cwd_path not in fname_path.parents and fname_path != cwd_path:
return True

View File

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

View File

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

View File

@@ -0,0 +1,2 @@
{
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -3,18 +3,28 @@ import os
import queue
import tempfile
import time
import warnings
from prompt_toolkit.shortcuts import prompt
from aider.llm import litellm
from .dump import dump # noqa: F401
warnings.filterwarnings(
"ignore", message="Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work"
)
warnings.filterwarnings("ignore", category=SyntaxWarning)
from pydub import AudioSegment # noqa
from pydub.exceptions import CouldntDecodeError, CouldntEncodeError # noqa
try:
import soundfile as sf
except (OSError, ModuleNotFoundError):
sf = None
from prompt_toolkit.shortcuts import prompt
from .dump import dump # noqa: F401
class SoundDeviceError(Exception):
pass
@@ -27,7 +37,7 @@ class Voice:
threshold = 0.15
def __init__(self):
def __init__(self, audio_format="wav", device_name=None):
if sf is None:
raise SoundDeviceError
try:
@@ -35,8 +45,34 @@ class Voice:
import sounddevice as sd
self.sd = sd
devices = sd.query_devices()
if device_name:
# Find the device with matching name
device_id = None
for i, device in enumerate(devices):
if device_name in device["name"]:
device_id = i
break
if device_id is None:
available_inputs = [d["name"] for d in devices if d["max_input_channels"] > 0]
raise ValueError(
f"Device '{device_name}' not found. Available input devices:"
f" {available_inputs}"
)
print(f"Using input device: {device_name} (ID: {device_id})")
self.device_id = device_id
else:
self.device_id = None
except (OSError, ModuleNotFoundError):
raise SoundDeviceError
if audio_format not in ["wav", "mp3", "webm"]:
raise ValueError(f"Unsupported audio format: {audio_format}")
self.audio_format = audio_format
def callback(self, indata, frames, time, status):
"""This is called (from a separate thread) for each audio block."""
@@ -80,10 +116,10 @@ class Voice:
def raw_record_and_transcribe(self, history, language):
self.q = queue.Queue()
filename = tempfile.mktemp(suffix=".wav")
temp_wav = tempfile.mktemp(suffix=".wav")
try:
sample_rate = int(self.sd.query_devices(None, "input")["default_samplerate"])
sample_rate = int(self.sd.query_devices(self.device_id, "input")["default_samplerate"])
except (TypeError, ValueError):
sample_rate = 16000 # fallback to 16kHz if unable to query device
except self.sd.PortAudioError:
@@ -94,15 +130,40 @@ class Voice:
self.start_time = time.time()
try:
with self.sd.InputStream(samplerate=sample_rate, channels=1, callback=self.callback):
with self.sd.InputStream(
samplerate=sample_rate, channels=1, callback=self.callback, device=self.device_id
):
prompt(self.get_prompt, refresh_interval=0.1)
except self.sd.PortAudioError as err:
raise SoundDeviceError(f"Error accessing audio input device: {err}")
with sf.SoundFile(filename, mode="x", samplerate=sample_rate, channels=1) as file:
with sf.SoundFile(temp_wav, mode="x", samplerate=sample_rate, channels=1) as file:
while not self.q.empty():
file.write(self.q.get())
use_audio_format = self.audio_format
# Check file size and offer to convert to mp3 if too large
file_size = os.path.getsize(temp_wav)
if file_size > 24.9 * 1024 * 1024 and self.audio_format == "wav":
print("\nWarning: {temp_wav} is too large, switching to mp3 format.")
use_audio_format = "mp3"
filename = temp_wav
if use_audio_format != "wav":
try:
new_filename = tempfile.mktemp(suffix=f".{use_audio_format}")
audio = AudioSegment.from_wav(temp_wav)
audio.export(new_filename, format=use_audio_format)
os.remove(temp_wav)
filename = new_filename
except (CouldntDecodeError, CouldntEncodeError) as e:
print(f"Error converting audio: {e}")
except (OSError, FileNotFoundError) as e:
print(f"File system error during conversion: {e}")
except Exception as e:
print(f"Unexpected error during audio conversion: {e}")
with open(filename, "rb") as fh:
try:
transcript = litellm.transcription(
@@ -112,6 +173,9 @@ class Voice:
print(f"Unable to transcribe {filename}: {err}")
return
if filename != temp_wav:
os.remove(filename)
text = transcript.text
return text

281
aider/watch.py Normal file
View File

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

12
aider/watch_prompts.py Normal file
View File

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

View File

@@ -1,20 +1,317 @@
---
title: Release history
parent: More info
nav_order: 999
nav_order: 925
highlight_image: /assets/blame.jpg
description: Release notes and stats on aider writing its own code.
---
# Release history
{% include blame.md %}
The above
[stats are based on the git commit history](/docs/faq.html#how-are-the-aider-wrote-xx-of-code-stats-computed)
of the aider repo.
## Release notes
<!--[[[cog
# This page is a copy of HISTORY.md, adding the front matter above.
text = open("HISTORY.md").read()
text = text.replace("# Release history", "")
cog.out(text)
]]]-->
# Release history
### Aider v0.71.1
- Fix permissions issue in Docker images.
- Added read-only file announcements to chat.
- Bugfix: ASCII fallback for unicode errors.
- Bugfix: integer indices for list slicing in repomap calculations.
- Aider wrote 83% of the code in this release.
### Aider v0.71.0
- Prompts to help DeepSeek work better when alternating between `/ask` and `/code`.
- Streaming pretty LLM responses is smoother and faster for long replies.
- Streaming automatically turns of for model that don't support it
- Can now switch to/from `/model o1` and a streaming model
- Pretty output remains enabled even when editing files with triple-backtick fences
- Bare `/ask`, `/code` and `/architect` commands now switch the chat mode.
- Increased default size of the repomap.
- Increased max chat history tokens limit from 4k to 8k.
- Turn off fancy input and watch files if terminal is dumb.
- Added support for custom voice format and input device settings.
- Disabled Streamlit email prompt, by apaz-cli.
- Docker container runs as non-root user.
- Fixed lint command handling of nested spaced strings, by Aaron Weisberg.
- Added token count feedback when adding command output to chat.
- Improved error handling for large audio files with automatic format conversion.
- Improved handling of git repo index errors, by Krazer.
- Improved unicode handling in console output with ASCII fallback.
- Added AssertionError, AttributeError to git error handling.
- Aider wrote 60% of the code in this release.
### Aider v0.70.0
- Full support for o1 models.
- Watch files now honors `--subtree-only`, and only watches that subtree.
- Improved prompting for watch files, to work more reliably with more models.
- New install methods via uv, including one-liners.
- Support for openrouter/deepseek/deepseek-chat model.
- Better error handling when interactive commands are attempted via `/load` or `--load`.
- Display read-only files with abs path if its shorter than rel path.
- Ask 10% of users to opt-in to analytics.
- Bugfix for auto-suggest.
- Gracefully handle unicode errors in git path names.
- Aider wrote 74% of the code in this release.
### Aider v0.69.1
- Fix for gemini model names in model metadata.
- Show hints about AI! and AI? when user makes AI comments.
- Support for running without git installed.
- Improved environment variable setup messages on Windows.
### Aider v0.69.0
- [Watch files](https://aider.chat/docs/usage/watch.html) improvements:
- Use `# ... AI?` comments to trigger aider and ask questions about your code.
- Now watches *all* files, not just certain source files.
- Use `# AI comments`, `// AI comments`, or `-- AI comments` to give aider instructions in any text file.
- Full support for Gemini Flash 2.0 Exp:
- `aider --model flash` or `aider --model gemini/gemini-2.0-flash-exp`
- [New `--multiline` flag and `/multiline-mode` command](https://aider.chat/docs/usage/commands.html#entering-multi-line-chat-messages) makes ENTER a soft newline and META-ENTER send the message, by @miradnanali.
- `/copy-context <instructions>` now takes optional "instructions" when [copying code context to the clipboard](https://aider.chat/docs/usage/copypaste.html#copy-aiders-code-context-to-your-clipboard-paste-into-the-web-ui).
- Improved clipboard error handling with helpful requirements install info.
- Ask 5% of users if they want to opt-in to analytics.
- `/voice` now lets you edit the transcribed text before sending.
- Disabled auto-complete in Y/N prompts.
- Aider wrote 68% of the code in this release.
### Aider v0.68.0
- [Aider works with LLM web chat UIs](https://aider.chat/docs/usage/copypaste.html).
- New `--copy-paste` mode.
- New `/copy-context` command.
- [Set API keys and other environment variables for all providers from command line or yaml conf file](https://aider.chat/docs/config/aider_conf.html#storing-llm-keys).
- New `--api-key provider=key` setting.
- New `--set-env VAR=value` setting.
- Added bash and zsh support to `--watch-files`.
- Better error messages when missing dependencies for Gemini and Bedrock models.
- Control-D now properly exits the program.
- Don't count token costs when API provider returns a hard error.
- Bugfix so watch files works with files that don't have tree-sitter support.
- Bugfix so o1 models can be used as weak model.
- Updated shell command prompt.
- Added docstrings for all Coders.
- Reorganized command line arguments with improved help messages and grouping.
- Use the exact `sys.python` for self-upgrades.
- Added experimental Gemini models.
- Aider wrote 71% of the code in this release.
### Aider v0.67.0
- [Use aider in your IDE or editor](https://aider.chat/docs/usage/watch.html).
- Run `aider --watch-files` and it will watch for instructions you add to your source files.
- One-liner `# ...` or `// ...` comments that start or end with "AI" are instructions to aider.
- When aider sees "AI!" it reads and follows all the instructions in AI comments.
- Support for new Amazon Bedrock Nova models.
- When `/run` or `/test` have non-zero exit codes, pre-fill "Fix that" into the next message prompt.
- `/diff` now invokes `git diff` to use your preferred diff tool.
- Added Ctrl-Z support for process suspension.
- Spinner now falls back to ASCII art if fancy symbols throw unicode errors.
- `--read` now expands `~` home dirs.
- Enabled exception capture in analytics.
- [Aider wrote 61% of the code in this release.](https://aider.chat/HISTORY.html)
### Aider v0.66.0
- PDF support for Sonnet and Gemini models.
- Added `--voice-input-device` to select audio input device for voice recording, by @preynal.
- Added `--timeout` option to configure API call timeouts.
- Set cwd to repo root when running shell commands.
- Added Ctrl-Up/Down keyboard shortcuts for per-message history navigation.
- Improved error handling for failed .gitignore file operations.
- Improved error handling for input history file permissions.
- Improved error handling for analytics file access.
- Removed spurious warning about disabling pretty in VSCode.
- Removed broken support for Dart.
- Bugfix when scraping URLs found in chat messages.
- Better handling of __version__ import errors.
- Improved `/drop` command to support substring matching for non-glob patterns.
- Aider wrote 82% of the code in this release.
### Aider v0.65.1
- Bugfix to `--alias`.
### Aider v0.65.0
- Added `--alias` config to define [custom model aliases](https://aider.chat/docs/config/model-aliases.html).
- Added `--[no-]detect-urls` flag to disable detecting and offering to scrape URLs found in the chat.
- Ollama models now default to an 8k context window.
- Added [RepoMap support for Dart language](https://aider.chat/docs/languages.html) by @malkoG.
- Ask 2.5% of users if they want to opt-in to [analytics](https://aider.chat/docs/more/analytics.html).
- Skip suggesting files that share names with files already in chat.
- `/editor` returns and prefill the file content into the prompt, so you can use `/editor` to compose messages that start with `/commands`, etc.
- Enhanced error handling for analytics.
- Improved handling of UnknownEditFormat exceptions with helpful documentation links.
- Bumped dependencies to pick up grep-ast 0.4.0 for Dart language support.
- Aider wrote 81% of the code in this release.
### Aider v0.64.1
- Disable streaming for o1 on OpenRouter.
### Aider v0.64.0
- Added [`/editor` command](https://aider.chat/docs/usage/commands.html) to open system editor for writing prompts, by @thehunmonkgroup.
- Full support for `gpt-4o-2024-11-20`.
- Stream o1 models by default.
- `/run` and suggested shell commands are less mysterious and now confirm that they "Added XX lines of output to the chat."
- Ask 1% of users if they want to opt-in to [analytics](https://aider.chat/docs/more/analytics.html).
- Added support for [optional multiline input tags](https://aider.chat/docs/usage/commands.html#entering-multi-line-chat-messages) with matching closing tags.
- Improved [model settings configuration](https://aider.chat/docs/config/adv-model-settings.html#global-extra-params) with support for global `extra_params` for `litellm.completion()`.
- Architect mode now asks to add files suggested by the LLM.
- Fixed bug in fuzzy model name matching.
- Added Timeout exception to handle API provider timeouts.
- Added `--show-release-notes` to control release notes display on first run of new version.
- Save empty dict to cache file on model metadata download failure, to delay retry.
- Improved error handling and code formatting.
- Aider wrote 74% of the code in this release.
### Aider v0.63.2
- Fixed bug in fuzzy model name matching when litellm provider info is missing.
- Modified model metadata file loading to allow override of resource file.
- Allow recursive loading of dirs using `--read`.
- Updated dependency versions to pick up litellm fix for ollama models.
- Added exponential backoff retry when writing files to handle editor file locks.
- Updated Qwen 2.5 Coder 32B model configuration.
### Aider v0.63.1
- Fixed bug in git ignored file handling.
- Improved error handling for git operations.
### Aider v0.63.0
- Support for Qwen 2.5 Coder 32B.
- `/web` command just adds the page to the chat, without triggering an LLM response.
- Improved prompting for the user's preferred chat language.
- Improved handling of LiteLLM exceptions.
- Bugfix for double-counting tokens when reporting cache stats.
- Bugfix for the LLM creating new files.
- Other small bug fixes.
- Aider wrote 55% of the code in this release.
### Aider v0.62.0
- Full support for Claude 3.5 Haiku
- Scored 75% on [aider's code editing leaderboard](https://aider.chat/docs/leaderboards/).
- Almost as good as Sonnet at much lower cost.
- Launch with `--haiku` to use it.
- Easily apply file edits from ChatGPT, Claude or other web apps
- Chat with ChatGPT or Claude via their web app.
- Give it your source files and ask for the changes you want.
- Use the web app's "copy response" button to copy the entire reply from the LLM.
- Run `aider --apply-clipboard-edits file-to-edit.js`.
- Aider will edit your file with the LLM's changes.
- Bugfix for creating new files.
- Aider wrote 84% of the code in this release.
### Aider v0.61.0
- Load and save aider slash-commands to files:
- `/save <fname>` command will make a file of `/add` and `/read-only` commands that recreate the current file context in the chat.
- `/load <fname>` will replay the commands in the file.
- You can use `/load` to run any arbitrary set of slash-commands, not just `/add` and `/read-only`.
- Use `--load <fname>` to run a list of commands on launch, before the interactive chat begins.
- Anonymous, opt-in [analytics](https://aider.chat/docs/more/analytics.html) with no personal data sharing.
- Aider follows litellm's `supports_vision` attribute to enable image support for models.
- Bugfix for when diff mode flexibly handles the model using the wrong filename.
- Displays filenames in sorted order for `/add` and `/read-only`.
- New `--no-fancy-input` switch disables prompt toolkit input, now still available with `--no-pretty`.
- Override browser config with `--no-browser` or `--no-gui`.
- Offer to open documentation URLs when errors occur.
- Properly support all o1 models, regardless of provider.
- Improved layout of filenames above input prompt.
- Better handle corrupted repomap tags cache.
- Improved handling of API errors, especially when accessing the weak model.
- Aider wrote 68% of the code in this release.
### Aider v0.60.1
- Enable image support for Sonnet 10/22.
- Display filenames in sorted order.
### Aider v0.60.0
- Full support for Sonnet 10/22, the new SOTA model on aider's code editing benchmark.
- Aider uses Sonnet 10/22 by default.
- Improved formatting of added and read-only files above chat prompt, by @jbellis.
- Improved support for o1 models by more flexibly parsing their nonconforming code edit replies.
- Corrected diff edit format prompt that only the first match is replaced.
- Stronger whole edit format prompt asking for clean file names.
- Now offers to add `.env` to the `.gitignore` file.
- Ships with a small model metadata json file to handle models not yet updated in litellm.
- Model settings for o1 models on azure.
- Bugfix to properly include URLs in `/help` RAG results.
- Aider wrote 49% of the code in this release.
### Aider v0.59.1
- Check for obsolete `yes: true` in yaml config, show helpful error.
- Model settings for openrouter/anthropic/claude-3.5-sonnet:beta
### Aider v0.59.0
- Improvements to `/read-only`:
- Now supports shell-style auto-complete of the full file system.
- Still auto-completes the full paths of the repo files like `/add`.
- Now supports globs like `src/**/*.py`
- Renamed `--yes` to `--yes-always`.
- Now uses `AIDER_YES_ALWAYS` env var and `yes-always:` yaml key.
- Existing YAML and .env files will need to be updated.
- Can still abbreviate to `--yes` on the command line.
- Config file now uses standard YAML list syntax with ` - list entries`, one per line.
- `/settings` now includes the same announcement lines that would print at launch.
- Sanity checks the `--editor-model` on launch now, same as main and weak models.
- Added `--skip-sanity-check-repo` switch to speedup launch in large repos.
- Bugfix so architect mode handles Control-C properly.
- Repo-map is deterministic now, with improved caching logic.
- Improved commit message prompt.
- Aider wrote 77% of the code in this release.
### Aider v0.58.1
- Fixed bug where cache warming pings caused subsequent user messages to trigger a tight loop of LLM requests.
### Aider v0.58.0
- [Use a pair of Architect/Editor models for improved coding](https://aider.chat/2024/09/26/architect.html)
- Use a strong reasoning model like o1-preview as your Architect.
- Use a cheaper, faster model like gpt-4o as your Editor.
- New `--o1-preview` and `--o1-mini` shortcuts.
- Support for new Gemini 002 models.
- Better support for Qwen 2.5 models.
- Many confirmation questions can be skipped for the rest of the session with "(D)on't ask again" response.
- Autocomplete for `/read-only` supports the entire filesystem.
- New settings for completion menu colors.
- New `/copy` command to copy the last LLM response to the clipboard.
- Renamed `/clipboard` to `/paste`.
- Will now follow HTTP redirects when scraping urls.
- New `--voice-format` switch to send voice audio as wav/mp3/webm, by @mbailey.
- ModelSettings takes `extra_params` dict to specify any extras to pass to `litellm.completion()`.
- Support for cursor shapes when in vim mode.
- Numerous bug fixes.
- Aider wrote 53% of the code in this release.
### Aider v0.57.1
- Fixed dependency conflict between aider-chat[help] and [playwright].
### Aider v0.57.0
@@ -676,7 +973,7 @@ cog.out(text)
### Aider v0.14.0
- [Support for Claude2 and other LLMs via OpenRouter](https://aider.chat/docs/faq.html#accessing-other-llms-with-openrouter) by @joshuavial
- Documentation for [running the aider benchmarking suite](https://github.com/paul-gauthier/aider/tree/main/benchmark)
- Documentation for [running the aider benchmarking suite](https://github.com/Aider-AI/aider/tree/main/benchmark)
- Aider now requires Python >= 3.9

View File

@@ -1,6 +1,12 @@
theme: just-the-docs
url: "https://aider.chat"
# Analytics configuration
analytics:
enabled: false # Single switch to control analytics and cookie consent
posthog_key: 'phc_99T7muzafUMMZX15H8XePbMSreEUzahHbtWjy3l5Qbv'
posthog_host: 'https://us.i.posthog.com'
plugins:
- jekyll-redirect-from
- jekyll-sitemap
@@ -24,7 +30,7 @@ exclude:
aux_links:
"GitHub":
- "https://github.com/paul-gauthier/aider"
- "https://github.com/Aider-AI/aider"
"Discord":
- "https://discord.gg/Tv2uQnR88V"
"Blog":
@@ -32,11 +38,11 @@ aux_links:
nav_external_links:
- title: "GitHub"
url: "https://github.com/paul-gauthier/aider"
url: "https://github.com/Aider-AI/aider"
- title: "Discord"
url: "https://discord.gg/Tv2uQnR88V"
repository: paul-gauthier/aider
repository: Aider-AI/aider
callouts:
tip:
@@ -45,4 +51,4 @@ callouts:
note:
title: Note
color: yellow

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

@@ -0,0 +1,322 @@
- dirname: 2024-11-09-11-09-15--Qwen2.5-Coder-32B-Instruct
test_cases: 133
model: "HuggingFace via GLHF: BF16"
released: 2024-11-12
edit_format: diff
commit_hash: ec9982a
pass_rate_1: 59.4
pass_rate_2: 71.4
percent_cases_well_formed: 94.7
error_outputs: 17
num_malformed_responses: 17
num_with_malformed_responses: 7
user_asks: 1
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model openai/hf:Qwen/Qwen2.5-Coder-32B-Instruct --openai-api-base https://glhf.chat/api/openai/v1
date: 2024-11-09
versions: 0.59.2.dev
seconds_per_case: 22.5
total_cost: 0.0000
- dirname: 2024-11-22-18-56-13--ollama-qwen2.5-coder:32b-instruct-fp16
test_cases: 132
model: "Ollama: fp16"
edit_format: diff
commit_hash: f06452c-dirty, 6a0a97c-dirty, 4e9ae16-dirty, 5506d0f-dirty
pass_rate_1: 58.3
pass_rate_2: 71.4
percent_cases_well_formed: 90.2
error_outputs: 27
num_malformed_responses: 26
num_with_malformed_responses: 13
user_asks: 2
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: aider --model ollama/qwen2.5-coder:32b-instruct-fp16
date: 2024-11-22
versions: 0.64.2.dev
seconds_per_case: 119.6
total_cost: 0.0000
- dirname: 2024-11-22-14-53-26--hyperbolic-qwen25coder32binstruct
test_cases: 133
model: "Hyperbolic: BF16"
edit_format: diff
commit_hash: f9ef161, 17aef7b-dirty
pass_rate_1: 57.9
pass_rate_2: 69.2
percent_cases_well_formed: 91.7
error_outputs: 30
num_malformed_responses: 29
num_with_malformed_responses: 11
user_asks: 9
lazy_comments: 0
syntax_errors: 4
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 2
command: aider --model openai/Qwen/Qwen2.5-Coder-32B-Instruct --openai-api-base https://api.hyperbolic.xyz/v1/
date: 2024-11-22
versions: 0.64.2.dev
seconds_per_case: 33.2
total_cost: 0.0000
- dirname: 2024-11-22-17-53-35--qwen25-coder-32b-Instruct-4bit
test_cases: 133
model: "mlx-community: 4bit"
edit_format: diff
commit_hash: a16dcab-dirty
pass_rate_1: 60.2
pass_rate_2: 72.2
percent_cases_well_formed: 88.7
error_outputs: 31
num_malformed_responses: 30
num_with_malformed_responses: 15
user_asks: 6
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 1
test_timeouts: 0
command: aider --model openai/mlx-community/Qwen2.5-Coder-32B-Instruct-4bit
date: 2024-11-23
versions: 0.64.2.dev
seconds_per_case: 53.4
total_cost: 0.0000
- dirname: 2024-11-23-15-07-20--qwen25-coder-32b-Instruct-8bit
test_cases: 133
model: "mlx-community: 8bit"
edit_format: diff
commit_hash: a16dcab-dirty
pass_rate_1: 59.4
pass_rate_2: 72.2
percent_cases_well_formed: 92.5
error_outputs: 20
num_malformed_responses: 15
num_with_malformed_responses: 10
user_asks: 7
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 5
test_timeouts: 2
command: aider --model openai/mlx-community/Qwen2.5-Coder-32B-Instruct-8bit
date: 2024-11-23
versions: 0.64.2.dev
seconds_per_case: 98.4
total_cost: 0.0000
- dirname: 2024-11-24-22-18-18--or-all-or-fixed-blank-messages2
test_cases: 133
model: "OpenRouter: multiple"
edit_format: diff
commit_hash: 0c59d32
pass_rate_1: 57.1
pass_rate_2: 67.7
percent_cases_well_formed: 95.5
error_outputs: 56
num_malformed_responses: 10
num_with_malformed_responses: 6
user_asks: 14
lazy_comments: 0
syntax_errors: 6
indentation_errors: 0
exhausted_context_windows: 3
test_timeouts: 1
command: aider --model openrouter/qwen/qwen-2.5-coder-32b-instruct
date: 2024-11-24
versions: 0.64.2.dev
seconds_per_case: 21.2
total_cost: 0.1420
- dirname: 2024-11-23-21-08-53--ollama-qwen2.5-coder:32b-instruct-q4_K_M-8kctx
test_cases: 133
model: "Ollama: q4_K_M"
edit_format: diff
commit_hash: baa1335-dirty, e63df83-dirty, ff8c1aa-dirty
pass_rate_1: 54.9
pass_rate_2: 66.9
percent_cases_well_formed: 94.0
error_outputs: 21
num_malformed_responses: 21
num_with_malformed_responses: 8
user_asks: 5
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 3
command: aider --model ollama/qwen2.5-coder:32b-instruct-q4_K_M
date: 2024-11-23
versions: 0.64.2.dev
seconds_per_case: 35.7
total_cost: 0.0000
- dirname: 2024-11-24-02-23-32--deepinfra-qwen-diff
test_cases: 133
model: "Deepinfra: BF16"
edit_format: diff
commit_hash: bb78e2f
pass_rate_1: 58.6
pass_rate_2: 72.2
percent_cases_well_formed: 94.7
error_outputs: 15
num_malformed_responses: 13
num_with_malformed_responses: 7
user_asks: 3
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 2
test_timeouts: 3
command: aider --model deepinfra/Qwen/Qwen2.5-Coder-32B-Instruct
date: 2024-11-24
versions: 0.64.2.dev
seconds_per_case: 17.5
total_cost: 0.0000
- dirname: 2024-11-24-04-12-58--fireworks-qwen-diff
test_cases: 133
model: "Fireworks: unknown"
edit_format: diff
commit_hash: 757eac0
pass_rate_1: 57.9
pass_rate_2: 72.2
percent_cases_well_formed: 94.0
error_outputs: 23
num_malformed_responses: 19
num_with_malformed_responses: 8
user_asks: 8
lazy_comments: 0
syntax_errors: 6
indentation_errors: 0
exhausted_context_windows: 4
test_timeouts: 1
command: aider --model fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct
date: 2024-11-24
versions: 0.64.2.dev
seconds_per_case: 10.4
total_cost: 0.5759
- dirname: 2024-11-24-02-04-59--ollama-qwen2.5-coder:32b-instruct-q2_K-8kctx
test_cases: 133
model: "Ollama: q2_K"
edit_format: diff
commit_hash: 757eac0, bb78e2f, 8d0ba40-dirty, 1d09e96
pass_rate_1: 48.9
pass_rate_2: 61.7
percent_cases_well_formed: 91.7
error_outputs: 32
num_malformed_responses: 32
num_with_malformed_responses: 11
user_asks: 8
lazy_comments: 0
syntax_errors: 0
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 1
command: aider --model ollama/qwen2.5-coder:32b-instruct-q2_K
date: 2024-11-24
versions: 0.64.2.dev
seconds_per_case: 97.8
total_cost: 0.0000
- dirname: 2024-11-24-14-56-49--qwen25-32b-or-fireworks
test_cases: 133
model: "Fireworks via OpenRouter: unknown"
edit_format: diff
commit_hash: c2f184f
pass_rate_1: 55.6
pass_rate_2: 67.7
percent_cases_well_formed: 94.0
error_outputs: 39
num_malformed_responses: 24
num_with_malformed_responses: 8
user_asks: 13
lazy_comments: 0
syntax_errors: 1
indentation_errors: 1
exhausted_context_windows: 7
test_timeouts: 4
command: aider --model openrouter/qwen/qwen-2.5-coder-32b-instruct
date: 2024-11-24
versions: 0.64.2.dev
seconds_per_case: 16.1
total_cost: 0.1391
- dirname: 2024-11-24-22-03-19--or-hyperbolic-or-fixed-blank-messages2
test_cases: 133
model: "Hyperbolic via OpenRouter: BF16"
edit_format: diff
commit_hash: 0c59d32
pass_rate_1: 55.6
pass_rate_2: 68.4
percent_cases_well_formed: 89.5
error_outputs: 28
num_malformed_responses: 24
num_with_malformed_responses: 14
user_asks: 29
lazy_comments: 0
syntax_errors: 1
indentation_errors: 0
exhausted_context_windows: 4
test_timeouts: 1
command: aider --model openrouter/qwen/qwen-2.5-coder-32b-instruct
date: 2024-11-24
versions: 0.64.2.dev
seconds_per_case: 41.5
total_cost: 0.1402
- dirname: 2024-11-24-15-00-50--qwen25-32b-or-deepinfra
test_cases: 133
model: "Deepinfra via OpenRouter: BF16"
edit_format: diff
commit_hash: c2f184f
pass_rate_1: 57.1
pass_rate_2: 69.9
percent_cases_well_formed: 89.5
error_outputs: 35
num_malformed_responses: 31
num_with_malformed_responses: 14
user_asks: 11
lazy_comments: 0
syntax_errors: 1
indentation_errors: 1
exhausted_context_windows: 4
test_timeouts: 1
command: aider --model openrouter/qwen/qwen-2.5-coder-32b-instruct
date: 2024-11-24
versions: 0.64.2.dev
seconds_per_case: 28.5
total_cost: 0.1390
- dirname: 2024-11-26-03-15-06--ollama-qwen2.5-coder:32b-instruct-fp16-2kctx
test_cases: 132
model: "Ollama: fp16, 2k ctx"
edit_format: diff
commit_hash: 68be6c5-dirty, 554d274, 2ff3a23, 2ff3a23-dirty, 61759f9, dd48b74, 3ebd47d-dirty
pass_rate_1: 43.2
pass_rate_2: 51.9
percent_cases_well_formed: 46.2
error_outputs: 171
num_malformed_responses: 165
num_with_malformed_responses: 71
user_asks: 97
lazy_comments: 2
syntax_errors: 4
indentation_errors: 0
exhausted_context_windows: 0
test_timeouts: 0
command: "aider --model ollama/qwen2.5-coder:32b-instruct-fp16 # num_ctx: 2048"
date: 2024-11-26
versions: 0.64.2.dev,0.65.1.dev
seconds_per_case: 188.6
total_cost: 0.0000

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,190 @@
document.addEventListener('DOMContentLoaded', function () {
var ctx = document.getElementById('editChart').getContext('2d');
const blueDiagonalPattern = pattern.draw('diagonal', 'rgba(54, 162, 235, 0.2)');
const redDiagonalPattern = pattern.draw('diagonal', 'rgba(255, 99, 132, 0.2)');
let displayedData = [];
const HIGHLIGHT_MODEL = '{{ highlight_model | default: "no no no" }}';
var leaderboardData = {
labels: [],
datasets: [{
label: 'Percent completed correctly',
data: [],
backgroundColor: function(context) {
const row = allData[context.dataIndex];
if (row && row.edit_format === 'whole') {
return diagonalPattern;
}
const label = leaderboardData.labels[context.dataIndex] || '';
return (label && label.includes(HIGHLIGHT_MODEL)) ? 'rgba(255, 99, 132, 0.2)' : 'rgba(54, 162, 235, 0.2)';
},
borderColor: function(context) {
const label = context.chart.data.labels[context.dataIndex] || '';
return (label && label.includes(HIGHLIGHT_MODEL)) ? 'rgba(255, 99, 132, 1)' : 'rgba(54, 162, 235, 1)';
},
borderWidth: 1
}]
};
var allData = [];
{% for row in data_source %}
allData.push({
model: '{{ row.model }}',
pass_rate: {{ row[pass_rate_field] }},
percent_cases_well_formed: {{ row.percent_cases_well_formed }},
edit_format: '{{ row.edit_format | default: "diff" }}'
});
{% endfor %}
function updateChart() {
var selectedRows = document.querySelectorAll('tr.selected');
var showAll = selectedRows.length === 0;
displayedData = [];
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
allData.forEach(function(row, index) {
var rowElement = document.getElementById('edit-row-' + index);
if (showAll) {
rowElement.classList.remove('selected');
}
if (showAll || rowElement.classList.contains('selected')) {
displayedData.push(row);
leaderboardData.labels.push(row.model);
leaderboardData.datasets[0].data.push(row.pass_rate);
}
});
leaderboardChart.update();
leaderboardChart.render();
}
// Use displayedData in the backgroundColor callback instead of allData
leaderboardData.datasets[0].backgroundColor = function(context) {
const row = displayedData[context.dataIndex];
const label = leaderboardData.labels[context.dataIndex] || '';
if (label && label.includes(HIGHLIGHT_MODEL)) {
if (row && row.edit_format === 'whole') return redDiagonalPattern;
else return 'rgba(255, 99, 132, 0.2)';
} else if (row && row.edit_format === 'whole') {
return blueDiagonalPattern;
} else {
return 'rgba(54, 162, 235, 0.2)';
}
};
var tableBody = document.querySelector('table tbody');
allData.forEach(function(row, index) {
var tr = tableBody.children[index];
if (!tr) {
// If the row doesn't exist, create it
tr = document.createElement('tr');
tableBody.appendChild(tr);
}
tr.id = 'edit-row-' + index;
tr.style.cursor = 'pointer';
tr.onclick = function() {
this.classList.toggle('selected');
updateChart();
};
});
var leaderboardChart = new Chart(ctx, {
type: 'bar',
data: leaderboardData,
options: {
plugins: {
legend: {
display: true,
labels: {
generateLabels: function(chart) {
return [
{
text: 'Diff-like format',
fillStyle: 'rgba(54, 162, 235, 0.2)',
strokeStyle: 'rgba(54, 162, 235, 1)',
lineWidth: 1
},
{
text: 'Whole format',
fillStyle: blueDiagonalPattern,
strokeStyle: 'rgba(54, 162, 235, 1)',
lineWidth: 1
}
];
}
}
}
},
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Percent completed correctly'
}
},
x: {
ticks: {
callback: function(value, index) {
const label = this.getLabelForValue(value);
if (label.length <= "claude-3-5-sonnet".length) {
return label;
}
// Find all possible split positions
const splitPositions = [];
for (let i = 0; i < label.length; i++) {
if (label[i] === '-' || label[i] === ' ') {
splitPositions.push(i);
}
}
if (splitPositions.length === 0) {
return label;
}
// Find split position closest to middle
const middle = label.length / 2;
const splitIndex = splitPositions.reduce((closest, current) => {
return Math.abs(current - middle) < Math.abs(closest - middle) ? current : closest;
});
return [
label.slice(0, splitIndex),
label.slice(splitIndex + 1)
];
}
}
}
}
}
});
updateChart();
// Add search functionality for edit table
document.getElementById('editSearchInput').addEventListener('keyup', function() {
var searchWords = this.value.toLowerCase().split(' ').filter(word => word.length > 0);
var tableBody = document.querySelector('table:first-of-type tbody');
var rows = tableBody.getElementsByTagName('tr');
displayedData = [];
leaderboardData.labels = [];
leaderboardData.datasets[0].data = [];
for (var i = 0; i < rows.length; i++) {
var rowText = rows[i].textContent;
if (searchWords.every(word => rowText.toLowerCase().includes(word))) {
rows[i].style.display = '';
displayedData.push(allData[i]);
leaderboardData.labels.push(allData[i].model);
leaderboardData.datasets[0].data.push(allData[i].pass_rate);
} else {
rows[i].style.display = 'none';
}
}
leaderboardChart.update();
});
});

View File

@@ -1,5 +1,22 @@
You can send long, multi-line messages in the chat in a few ways:
- Paste a multi-line message directly into the chat.
- Enter `{` alone on the first line to start a multiline message and `}` alone on the last line to end it.
- Or, start with `{tag` (where "tag" is any sequence of letters/numbers) and end with `tag}`. This is useful when you need to include closing braces `}` in your message.
- Use Meta-ENTER to start a new line without sending the message (Esc+ENTER in some environments).
- Use `/clipboard` to paste text from the clipboard into the chat.
- Use `/paste` to paste text from the clipboard into the chat.
- Use the `/editor` command to open your editor to create the next chat message. See [editor configuration docs](/docs/config/editor.html) for more info.
- Use multiline-mode, which swaps the function of Meta-Enter and Enter, so that Enter inserts a newline, and Meta-Enter submits your command. To enable multiline mode:
- Use the `/multiline-mode` command to toggle it during a session.
- Use the `--multiline` switch.
Example with a tag:
```
{python
def hello():
print("Hello}") # Note: contains a brace
python}
```
{: .note }
People often ask for SHIFT-ENTER to be a soft-newline.
Unfortunately there is no portable way to detect that keystroke in terminals.

View File

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

View File

@@ -0,0 +1,95 @@
document.addEventListener('DOMContentLoaded', function () {
var ctx = document.getElementById('quantChart').getContext('2d');
var allData = [];
{% for row in site.data.quant %}
allData.push({
model: '{{ row.model }}',
pass_rate_2: {{ row.pass_rate_2 }}
});
{% endfor %}
// Sort data by pass_rate_2 in descending order
allData.sort((a, b) => b.pass_rate_2 - a.pass_rate_2);
var chart;
function updateChart(filterText) {
var filteredData = allData.filter(row =>
row.model.toLowerCase().includes(filterText.toLowerCase())
);
var chartData = {
labels: filteredData.map(row => row.model),
datasets: [{
label: 'Percent completed correctly',
data: filteredData.map(row => row.pass_rate_2),
backgroundColor: 'rgba(54, 162, 235, 0.2)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1
}]
};
if (chart) {
chart.data = chartData;
chart.update();
} else {
chart = new Chart(ctx, {
type: 'bar',
data: chartData,
options: {
plugins: {
legend: {
display: false
},
title: {
display: true,
text: 'Aider code editing benchmark',
font: {
size: 16
}
}
},
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Percent completed correctly',
font: {
size: 14
}
},
ticks: {
font: {
size: 16
}
}
},
x: {
ticks: {
font: {
size: 16
}
},
title: {
display: true,
text: 'Provider: quantization',
font: {
size: 14
}
}
}
}
}
});
}
}
// Initial chart render
updateChart('');
// Connect search input to chart filtering
document.getElementById('quantSearchInput').addEventListener('keyup', function() {
updateChart(this.value);
});
});

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,194 @@
---
title: Details matter with open source models
excerpt: Open source LLMs are becoming very powerful, but pay attention to how you (or your provider) are serving the model. It can affect code editing skill.
highlight_image: /assets/quantization.jpg
draft: false
nav_exclude: true
---
{% if page.date %}
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
{% endif %}
# Details matter with open source models
{: .no_toc }
<canvas id="quantChart" width="800" height="600" style="margin: 20px 0"></canvas>
Open source models like Qwen 2.5 32B Instruct are performing very well on
aider's code editing benchmark, rivaling closed source frontier models.
But pay attention to how your model is being served and quantized,
as it can impact code editing skill.
Open source models are often available at a variety of quantizations,
and can be served with different token limits.
These details matter when working with code.
The graph above and table below compares different versions of the Qwen 2.5 Coder 32B Instruct model,
served both locally and from a variety of cloud providers.
- The [HuggingFace BF16 weights](https://huggingface.co/Qwen/Qwen2.5-Coder-32B-Instruct) served via [glhf.chat](https://glhf.chat).
- [4bit and 8bit quants for mlx](https://t.co/cwX3DYX35D).
- The results from [OpenRouter's mix of providers](https://openrouter.ai/qwen/qwen-2.5-coder-32b-instruct/providers) which serve the model with different levels of quantization.
- Results from OpenRouter's providers, both served via OpenRouter and directly to their own APIs.
- Ollama locally serving different quantizations from the [Ollama model library](https://ollama.com/library/qwen2.5-coder:32b-instruct-q4_K_M) with 8k+
context windows.
- An Ollama fp16 quantization served with Ollama's default 2k context window.
### Pitfalls and details
This benchmarking effort highlighted a number of pitfalls and details specific to open source
models which
can have a significant impact on their ability to correctly edit code:
- **Quantization** -- Open source models are often available at dozens of different quantizations.
Most seem to only modestly decrease code editing skill, but stronger quantizations
do have a real impact.
- **Context window** -- Cloud providers can decide how large a context window to accept,
and they often choose differently. Ollama's local API server
defaults to a tiny 2k context window,
and silently discards data that exceeds it. Such a small window has
catastrophic effects on performance, without throwing obvious hard errors.
- **Output token limits** -- Open source models are often served with wildly
differing output token limits. This has a direct impact on how much code the
model can write or edit in a response.
- **Buggy cloud providers** -- While benchmarking Qwen 2.5 Coder 32B Instruct
and DeepSeek V2.5, I discovered
multiple cloud providers with broken or buggy API endpoints.
They seemed
to be returning results different from expected based on the advertised
quantization and context sizes.
The harm caused to the code editing benchmark varied from serious
to catastrophic.
One provider scored 0.5% on the benchmark with DeepSeek V2.5, a highly capable model.
Closed source, proprietary models don't typically have these issues.
They are owned and operated by the organization that created them,
and typically served with specific, predictable context window and output token limits.
Their quantization level is usually unknown, but fixed and unchanging for all users.
### Conclusions
The best versions of the Qwen model rival GPT-4o, while the worst performing
quantization is more like the older GPT-4 Turbo when served competently.
Even an otherwise excellent fp16 quantization falls to GPT-3.5 Turbo levels of performance
if run with Ollama's default 2k context window.
### Sections
{: .no_toc }
- TOC
{:toc}
## Benchmark results
{: .note :}
These are results from single benchmark runs, so expect normal variance of +/- 1-2%.
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
{% include quant-chart.js %}
</script>
<input type="text" id="quantSearchInput" placeholder="Search..." style="width: 100%; max-width: 800px; margin: 10px auto; padding: 8px; display: block; border: 1px solid #ddd; border-radius: 4px;">
<table style="width: 100%; max-width: 800px; margin: auto; border-collapse: collapse; box-shadow: 0 2px 4px rgba(0,0,0,0.1); font-size: 14px;">
<thead style="background-color: #f2f2f2;">
<tr>
<th style="padding: 8px; text-align: left;">Model</th>
<th style="padding: 8px; text-align: center;">Percent completed correctly</th>
<th style="padding: 8px; text-align: center;">Percent using correct edit format</th>
<th style="padding: 8px; text-align: left;">Command</th>
<th style="padding: 8px; text-align: center;">Edit format</th>
</tr>
</thead>
<tbody>
{% assign quant_sorted = site.data.quant | sort: 'pass_rate_2' | reverse %}
{% for row in quant_sorted %}
<tr style="border-bottom: 1px solid #ddd;">
<td style="padding: 8px;">{{ row.model }}</td>
<td style="padding: 8px; text-align: center;">{{ row.pass_rate_2 }}%</td>
<td style="padding: 8px; text-align: center;">{{ row.percent_cases_well_formed }}%</td>
<td style="padding: 8px;"><code>{{ row.command }}</code></td>
<td style="padding: 8px; text-align: center;">{{ row.edit_format }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<style>
tr.selected {
color: #0056b3;
}
table {
table-layout: fixed;
}
td, th {
word-wrap: break-word;
overflow-wrap: break-word;
}
td:nth-child(3), td:nth-child(4) {
font-size: 12px;
}
</style>
<script>
document.getElementById('quantSearchInput').addEventListener('keyup', function() {
var input = this.value.toLowerCase();
var rows = document.querySelectorAll('tbody tr');
rows.forEach(function(row) {
var text = row.textContent.toLowerCase();
if(text.includes(input)) {
row.style.display = '';
row.classList.add('selected');
} else {
row.style.display = 'none';
row.classList.remove('selected');
}
});
});
</script>
## Setting Ollama's context window size
[Ollama uses a 2k context window by default](https://github.com/ollama/ollama/blob/main/docs/faq.md#how-can-i-specify-the-context-window-size),
which is very small for working with aider.
Unlike most other LLM servers, Ollama does not throw an error if you submit
a request that exceeds the context window.
Instead, it just silently truncates the request by discarding the "oldest" messages
in the chat to make it fit within the context window.
Except for the single 2k context result,
all of the Ollama results above were collected with at least an 8k context window.
An 8k window is large enough to attempt all the coding problems in the benchmark.
Aider sets Ollama's context window to 8k by default, starting in aider v0.65.0.
You can change the Ollama server's context window with a
[`.aider.model.settings.yml` file](https://aider.chat/docs/config/adv-model-settings.html#model-settings)
like this:
```
- name: ollama/qwen2.5-coder:32b-instruct-fp16
extra_params:
num_ctx: 8192
```
## Choosing providers with OpenRouter
OpenRouter allows you to ignore specific providers in your
[preferences](https://openrouter.ai/settings/preferences).
This can be used to limit your OpenRouter requests to be
served by only your preferred providers.
## Notes
This article went through many revisions as I received feedback from
numerous members of the community.
Here are some of the noteworthy learnings and changes:
- The first version of this article included incorrect Ollama models.
- Earlier Ollama results used the too small default 2k context window,
artificially harming the benchmark results.
- The benchmark results appear to have uncovered a problem in the way
OpenRouter was communicating with Hyperbolic.
They fixed the issue 11/24/24, shortly after it was pointed out.

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