mirror of
https://github.com/Aider-AI/aider.git
synced 2025-06-01 18:25:00 +00:00
Merge branch 'main' into help
This commit is contained in:
commit
b3eb1dea49
68 changed files with 1211 additions and 710 deletions
14
.github/workflows/pages.yml
vendored
14
.github/workflows/pages.yml
vendored
|
@ -69,3 +69,17 @@ jobs:
|
|||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v2
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
- name: Install linkchecker
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install linkchecker
|
||||
|
||||
- name: Run linkchecker
|
||||
run: |
|
||||
linkchecker https://aider.chat
|
||||
|
|
5
.github/workflows/ubuntu-tests.yml
vendored
5
.github/workflows/ubuntu-tests.yml
vendored
|
@ -30,11 +30,6 @@ jobs:
|
|||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
- name: Install universal ctags
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y universal-ctags
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
|
|
4
.github/workflows/windows-tests.yml
vendored
4
.github/workflows/windows-tests.yml
vendored
|
@ -30,10 +30,6 @@ jobs:
|
|||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
- name: Install universal ctags
|
||||
run: |
|
||||
choco install universal-ctags
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
|
|
142
HISTORY.md
142
HISTORY.md
|
@ -1,17 +1,39 @@
|
|||
|
||||
# Release history
|
||||
|
||||
### v0.40.5
|
||||
### Aider v0.42.0
|
||||
|
||||
- Performance release:
|
||||
- 5X faster launch!
|
||||
- Faster auto-complete in large git repos (users report ~100X speedup)!
|
||||
|
||||
### Aider v0.41.0
|
||||
|
||||
- [Allow Claude 3.5 Sonnet to stream back >4k tokens!](https://aider.chat/2024/07/01/sonnet-not-lazy.html)
|
||||
- It is the first model capable of writing such large coherent, useful code edits.
|
||||
- Do large refactors or generate multiple files of new code in one go.
|
||||
- Aider now uses `claude-3-5-sonnet-20240620` by default if `ANTHROPIC_API_KEY` is set in the environment.
|
||||
- [Enabled image support](https://aider.chat/docs/images-urls.html) for 3.5 Sonnet and for GPT-4o & 3.5 Sonnet via OpenRouter (by @yamitzky).
|
||||
- Added `--attribute-commit-message` to prefix aider's commit messages with "aider:".
|
||||
- Fixed regression in quality of one-line commit messages.
|
||||
- Automatically retry on Anthropic `overloaded_error`.
|
||||
- Bumped dependency versions.
|
||||
|
||||
### Aider v0.40.6
|
||||
|
||||
- Fixed `/undo` so it works regardless of `--attribute` settings.
|
||||
|
||||
### Aider v0.40.5
|
||||
|
||||
- Bump versions to pickup latest litellm to fix streaming issue with Gemini
|
||||
- https://github.com/BerriAI/litellm/issues/4408
|
||||
|
||||
### v0.40.1
|
||||
### Aider v0.40.1
|
||||
|
||||
- Improved context awareness of repomap.
|
||||
- Restored proper `--help` functionality.
|
||||
|
||||
### v0.40.0
|
||||
### Aider v0.40.0
|
||||
|
||||
- Improved prompting to discourage Sonnet from wasting tokens emitting unchanging code (#705).
|
||||
- Improved error info for token limit errors.
|
||||
|
@ -20,14 +42,14 @@
|
|||
- Improved invocation of flake8 linter for python code.
|
||||
|
||||
|
||||
### v0.39.0
|
||||
### Aider v0.39.0
|
||||
|
||||
- Use `--sonnet` for Claude 3.5 Sonnet, which is the top model on [aider's LLM code editing leaderboard](https://aider.chat/docs/leaderboards/#claude-35-sonnet-takes-the-top-spot).
|
||||
- All `AIDER_xxx` environment variables can now be set in `.env` (by @jpshack-at-palomar).
|
||||
- Use `--llm-history-file` to log raw messages sent to the LLM (by @daniel-vainsencher).
|
||||
- Commit messages are no longer prefixed with "aider:". Instead the git author and committer names have "(aider)" added.
|
||||
|
||||
### v0.38.0
|
||||
### Aider v0.38.0
|
||||
|
||||
- Use `--vim` for [vim keybindings](https://aider.chat/docs/commands.html#vi) in the chat.
|
||||
- [Add LLM metadata](https://aider.chat/docs/llms/warnings.html#specifying-context-window-size-and-token-costs) via `.aider.models.json` file (by @caseymcc).
|
||||
|
@ -38,7 +60,7 @@
|
|||
- Documentation updates, moved into website/ subdir.
|
||||
- Moved tests/ into aider/tests/.
|
||||
|
||||
### v0.37.0
|
||||
### Aider v0.37.0
|
||||
|
||||
- Repo map is now optimized based on text of chat history as well as files added to chat.
|
||||
- Improved prompts when no files have been added to chat to solicit LLM file suggestions.
|
||||
|
@ -49,7 +71,7 @@
|
|||
- Detect supported audio sample rates for `/voice`.
|
||||
- Other small bug fixes.
|
||||
|
||||
### v0.36.0
|
||||
### Aider v0.36.0
|
||||
|
||||
- [Aider can now lint your code and fix any errors](https://aider.chat/2024/05/22/linting.html).
|
||||
- Aider automatically lints and fixes after every LLM edit.
|
||||
|
@ -62,7 +84,7 @@
|
|||
- Aider will automatically attempt to fix any test failures.
|
||||
|
||||
|
||||
### v0.35.0
|
||||
### Aider v0.35.0
|
||||
|
||||
- Aider now uses GPT-4o by default.
|
||||
- GPT-4o tops the [aider LLM code editing leaderboard](https://aider.chat/docs/leaderboards/) at 72.9%, versus 68.4% for Opus.
|
||||
|
@ -71,7 +93,7 @@
|
|||
- Improved reflection feedback to LLMs using the diff edit format.
|
||||
- Improved retries on `httpx` errors.
|
||||
|
||||
### v0.34.0
|
||||
### Aider v0.34.0
|
||||
|
||||
- Updated prompting to use more natural phrasing about files, the git repo, etc. Removed reliance on read-write/read-only terminology.
|
||||
- Refactored prompting to unify some phrasing across edit formats.
|
||||
|
@ -81,11 +103,11 @@
|
|||
- Bugfix: catch and retry on all litellm exceptions.
|
||||
|
||||
|
||||
### v0.33.0
|
||||
### Aider v0.33.0
|
||||
|
||||
- Added native support for [Deepseek models](https://aider.chat/docs/llms.html#deepseek) using `DEEPSEEK_API_KEY` and `deepseek/deepseek-chat`, etc rather than as a generic OpenAI compatible API.
|
||||
|
||||
### v0.32.0
|
||||
### Aider v0.32.0
|
||||
|
||||
- [Aider LLM code editing leaderboards](https://aider.chat/docs/leaderboards/) that rank popular models according to their ability to edit code.
|
||||
- Leaderboards include GPT-3.5/4 Turbo, Opus, Sonnet, Gemini 1.5 Pro, Llama 3, Deepseek Coder & Command-R+.
|
||||
|
@ -94,31 +116,31 @@
|
|||
- Improved retry handling on errors from model APIs.
|
||||
- Benchmark outputs results in YAML, compatible with leaderboard.
|
||||
|
||||
### v0.31.0
|
||||
### Aider v0.31.0
|
||||
|
||||
- [Aider is now also AI pair programming in your browser!](https://aider.chat/2024/05/02/browser.html) Use the `--browser` switch to launch an experimental browser based version of aider.
|
||||
- Switch models during the chat with `/model <name>` and search the list of available models with `/models <query>`.
|
||||
|
||||
### v0.30.1
|
||||
### Aider v0.30.1
|
||||
|
||||
- Adding missing `google-generativeai` dependency
|
||||
|
||||
### v0.30.0
|
||||
### Aider v0.30.0
|
||||
|
||||
- Added [Gemini 1.5 Pro](https://aider.chat/docs/llms.html#free-models) as a recommended free model.
|
||||
- Allow repo map for "whole" edit format.
|
||||
- Added `--models <MODEL-NAME>` to search the available models.
|
||||
- Added `--no-show-model-warnings` to silence model warnings.
|
||||
|
||||
### v0.29.2
|
||||
### Aider v0.29.2
|
||||
|
||||
- Improved [model warnings](https://aider.chat/docs/llms.html#model-warnings) for unknown or unfamiliar models
|
||||
|
||||
### v0.29.1
|
||||
### Aider v0.29.1
|
||||
|
||||
- Added better support for groq/llama3-70b-8192
|
||||
|
||||
### v0.29.0
|
||||
### Aider v0.29.0
|
||||
|
||||
- Added support for [directly connecting to Anthropic, Cohere, Gemini and many other LLM providers](https://aider.chat/docs/llms.html).
|
||||
- Added `--weak-model <model-name>` which allows you to specify which model to use for commit messages and chat history summarization.
|
||||
|
@ -132,32 +154,32 @@
|
|||
- Fixed crash when operating in a repo in a detached HEAD state.
|
||||
- Fix: Use the same default model in CLI and python scripting.
|
||||
|
||||
### v0.28.0
|
||||
### Aider v0.28.0
|
||||
|
||||
- Added support for new `gpt-4-turbo-2024-04-09` and `gpt-4-turbo` models.
|
||||
- Benchmarked at 61.7% on Exercism benchmark, comparable to `gpt-4-0613` and worse than the `gpt-4-preview-XXXX` models. See [recent Exercism benchmark results](https://aider.chat/2024/03/08/claude-3.html).
|
||||
- Benchmarked at 34.1% on the refactoring/laziness benchmark, significantly worse than the `gpt-4-preview-XXXX` models. See [recent refactor bencmark results](https://aider.chat/2024/01/25/benchmarks-0125.html).
|
||||
- Aider continues to default to `gpt-4-1106-preview` as it performs best on both benchmarks, and significantly better on the refactoring/laziness benchmark.
|
||||
|
||||
### v0.27.0
|
||||
### Aider v0.27.0
|
||||
|
||||
- Improved repomap support for typescript, by @ryanfreckleton.
|
||||
- Bugfix: Only /undo the files which were part of the last commit, don't stomp other dirty files
|
||||
- Bugfix: Show clear error message when OpenAI API key is not set.
|
||||
- Bugfix: Catch error for obscure languages without tags.scm file.
|
||||
|
||||
### v0.26.1
|
||||
### Aider v0.26.1
|
||||
|
||||
- Fixed bug affecting parsing of git config in some environments.
|
||||
|
||||
### v0.26.0
|
||||
### Aider v0.26.0
|
||||
|
||||
- Use GPT-4 Turbo by default.
|
||||
- Added `-3` and `-4` switches to use GPT 3.5 or GPT-4 (non-Turbo).
|
||||
- Bug fix to avoid reflecting local git errors back to GPT.
|
||||
- Improved logic for opening git repo on launch.
|
||||
|
||||
### v0.25.0
|
||||
### Aider v0.25.0
|
||||
|
||||
- Issue a warning if user adds too much code to the chat.
|
||||
- https://aider.chat/docs/faq.html#how-can-i-add-all-the-files-to-the-chat
|
||||
|
@ -167,18 +189,18 @@
|
|||
- Show the user a FAQ link if edits fail to apply.
|
||||
- Made past articles part of https://aider.chat/blog/
|
||||
|
||||
### v0.24.1
|
||||
### Aider v0.24.1
|
||||
|
||||
- Fixed bug with cost computations when --no-steam in effect
|
||||
|
||||
### v0.24.0
|
||||
### Aider v0.24.0
|
||||
|
||||
- New `/web <url>` command which scrapes the url, turns it into fairly clean markdown and adds it to the chat.
|
||||
- Updated all OpenAI model names, pricing info
|
||||
- Default GPT 3.5 model is now `gpt-3.5-turbo-0125`.
|
||||
- Bugfix to the `!` alias for `/run`.
|
||||
|
||||
### v0.23.0
|
||||
### Aider v0.23.0
|
||||
|
||||
- Added support for `--model gpt-4-0125-preview` and OpenAI's alias `--model gpt-4-turbo-preview`. The `--4turbo` switch remains an alias for `--model gpt-4-1106-preview` at this time.
|
||||
- New `/test` command that runs a command and adds the output to the chat on non-zero exit status.
|
||||
|
@ -188,25 +210,25 @@
|
|||
- Added `--openrouter` as a shortcut for `--openai-api-base https://openrouter.ai/api/v1`
|
||||
- Fixed bug preventing use of env vars `OPENAI_API_BASE, OPENAI_API_TYPE, OPENAI_API_VERSION, OPENAI_API_DEPLOYMENT_ID`.
|
||||
|
||||
### v0.22.0
|
||||
### Aider v0.22.0
|
||||
|
||||
- Improvements for unified diff editing format.
|
||||
- Added ! as an alias for /run.
|
||||
- Autocomplete for /add and /drop now properly quotes filenames with spaces.
|
||||
- The /undo command asks GPT not to just retry reverted edit.
|
||||
|
||||
### v0.21.1
|
||||
### Aider v0.21.1
|
||||
|
||||
- Bugfix for unified diff editing format.
|
||||
- Added --4turbo and --4 aliases for --4-turbo.
|
||||
|
||||
### v0.21.0
|
||||
### Aider v0.21.0
|
||||
|
||||
- Support for python 3.12.
|
||||
- Improvements to unified diff editing format.
|
||||
- New `--check-update` arg to check if updates are available and exit with status code.
|
||||
|
||||
### v0.20.0
|
||||
### Aider v0.20.0
|
||||
|
||||
- Add images to the chat to automatically use GPT-4 Vision, by @joshuavial
|
||||
|
||||
|
@ -214,22 +236,22 @@
|
|||
- Improved unicode encoding for `/run` command output, by @ctoth
|
||||
- Prevent false auto-commits on Windows, by @ctoth
|
||||
|
||||
### v0.19.1
|
||||
### Aider v0.19.1
|
||||
|
||||
- Removed stray debug output.
|
||||
|
||||
### v0.19.0
|
||||
### Aider v0.19.0
|
||||
|
||||
- [Significantly reduced "lazy" coding from GPT-4 Turbo due to new unified diff edit format](https://aider.chat/docs/unified-diffs.html)
|
||||
- Score improves from 20% to 61% on new "laziness benchmark".
|
||||
- Aider now uses unified diffs by default for `gpt-4-1106-preview`.
|
||||
- New `--4-turbo` command line switch as a shortcut for `--model gpt-4-1106-preview`.
|
||||
|
||||
### v0.18.1
|
||||
### Aider v0.18.1
|
||||
|
||||
- Upgraded to new openai python client v1.3.7.
|
||||
|
||||
### v0.18.0
|
||||
### Aider v0.18.0
|
||||
|
||||
- Improved prompting for both GPT-4 and GPT-4 Turbo.
|
||||
- Far fewer edit errors from GPT-4 Turbo (`gpt-4-1106-preview`).
|
||||
|
@ -237,7 +259,7 @@
|
|||
- Fixed bug where in-chat files were marked as both read-only and ready-write, sometimes confusing GPT.
|
||||
- Fixed bug to properly handle repos with submodules.
|
||||
|
||||
### v0.17.0
|
||||
### Aider v0.17.0
|
||||
|
||||
- Support for OpenAI's new 11/06 models:
|
||||
- gpt-4-1106-preview with 128k context window
|
||||
|
@ -249,19 +271,19 @@
|
|||
- Fixed crash bug when `/add` used on file matching `.gitignore`
|
||||
- Fixed misc bugs to catch and handle unicode decoding errors.
|
||||
|
||||
### v0.16.3
|
||||
### Aider v0.16.3
|
||||
|
||||
- Fixed repo-map support for C#.
|
||||
|
||||
### v0.16.2
|
||||
### Aider v0.16.2
|
||||
|
||||
- Fixed docker image.
|
||||
|
||||
### v0.16.1
|
||||
### Aider v0.16.1
|
||||
|
||||
- Updated tree-sitter dependencies to streamline the pip install process
|
||||
|
||||
### v0.16.0
|
||||
### Aider v0.16.0
|
||||
|
||||
- [Improved repository map using tree-sitter](https://aider.chat/docs/repomap.html)
|
||||
- Switched from "edit block" to "search/replace block", which reduced malformed edit blocks. [Benchmarked](https://aider.chat/docs/benchmarks.html) at 66.2%, no regression.
|
||||
|
@ -269,21 +291,21 @@
|
|||
- Bugfix to properly handle malformed `/add` wildcards.
|
||||
|
||||
|
||||
### v0.15.0
|
||||
### Aider v0.15.0
|
||||
|
||||
- Added support for `.aiderignore` file, which instructs aider to ignore parts of the git repo.
|
||||
- New `--commit` cmd line arg, which just commits all pending changes with a sensible commit message generated by gpt-3.5.
|
||||
- Added universal ctags and multiple architectures to the [aider docker image](https://aider.chat/docs/docker.html)
|
||||
- Added universal ctags and multiple architectures to the [aider docker image](https://aider.chat/docs/install/docker.html)
|
||||
- `/run` and `/git` now accept full shell commands, like: `/run (cd subdir; ls)`
|
||||
- Restored missing `--encoding` cmd line switch.
|
||||
|
||||
### v0.14.2
|
||||
### Aider v0.14.2
|
||||
|
||||
- Easily [run aider from a docker image](https://aider.chat/docs/docker.html)
|
||||
- Easily [run aider from a docker image](https://aider.chat/docs/install/docker.html)
|
||||
- Fixed bug with chat history summarization.
|
||||
- Fixed bug if `soundfile` package not available.
|
||||
|
||||
### v0.14.1
|
||||
### Aider v0.14.1
|
||||
|
||||
- /add and /drop handle absolute filenames and quoted filenames
|
||||
- /add checks to be sure files are within the git repo (or root)
|
||||
|
@ -291,14 +313,14 @@
|
|||
- Fixed /add bug in when aider launched in repo subdir
|
||||
- Show models supported by api/key if requested model isn't available
|
||||
|
||||
### v0.14.0
|
||||
### 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)
|
||||
- Aider now requires Python >= 3.9
|
||||
|
||||
|
||||
### v0.13.0
|
||||
### Aider v0.13.0
|
||||
|
||||
- [Only git commit dirty files that GPT tries to edit](https://aider.chat/docs/faq.html#how-did-v0130-change-git-usage)
|
||||
- Send chat history as prompt/context for Whisper voice transcription
|
||||
|
@ -306,14 +328,14 @@
|
|||
- Late-bind importing `sounddevice`, as it was slowing down aider startup
|
||||
- Improved --foo/--no-foo switch handling for command line and yml config settings
|
||||
|
||||
### v0.12.0
|
||||
### Aider v0.12.0
|
||||
|
||||
- [Voice-to-code](https://aider.chat/docs/voice.html) support, which allows you to code with your voice.
|
||||
- Fixed bug where /diff was causing crash.
|
||||
- Improved prompting for gpt-4, refactor of editblock coder.
|
||||
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 63.2% for gpt-4/diff, no regression.
|
||||
|
||||
### v0.11.1
|
||||
### Aider v0.11.1
|
||||
|
||||
- Added a progress bar when initially creating a repo map.
|
||||
- Fixed bad commit message when adding new file to empty repo.
|
||||
|
@ -322,7 +344,7 @@
|
|||
- Fixed /commit bug from repo refactor, added test coverage.
|
||||
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 53.4% for gpt-3.5/whole (no regression).
|
||||
|
||||
### v0.11.0
|
||||
### Aider v0.11.0
|
||||
|
||||
- Automatically summarize chat history to avoid exhausting context window.
|
||||
- More detail on dollar costs when running with `--no-stream`
|
||||
|
@ -330,12 +352,12 @@
|
|||
- Defend against GPT-3.5 or non-OpenAI models suggesting filenames surrounded by asterisks.
|
||||
- Refactored GitRepo code out of the Coder class.
|
||||
|
||||
### v0.10.1
|
||||
### Aider v0.10.1
|
||||
|
||||
- /add and /drop always use paths relative to the git root
|
||||
- Encourage GPT to use language like "add files to the chat" to ask users for permission to edit them.
|
||||
|
||||
### v0.10.0
|
||||
### Aider v0.10.0
|
||||
|
||||
- Added `/git` command to run git from inside aider chats.
|
||||
- Use Meta-ENTER (Esc+ENTER in some environments) to enter multiline chat messages.
|
||||
|
@ -347,7 +369,7 @@
|
|||
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 64.7% for gpt-4/diff (no regression)
|
||||
|
||||
|
||||
### v0.9.0
|
||||
### Aider v0.9.0
|
||||
|
||||
- Support for the OpenAI models in [Azure](https://aider.chat/docs/faq.html#azure)
|
||||
- Added `--show-repo-map`
|
||||
|
@ -356,7 +378,7 @@
|
|||
- Bugfix: recognize and add files in subdirectories mentioned by user or GPT
|
||||
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 53.8% for gpt-3.5-turbo/whole (no regression)
|
||||
|
||||
### v0.8.3
|
||||
### Aider v0.8.3
|
||||
|
||||
- Added `--dark-mode` and `--light-mode` to select colors optimized for terminal background
|
||||
- Install docs link to [NeoVim plugin](https://github.com/joshuavial/aider.nvim) by @joshuavial
|
||||
|
@ -367,11 +389,11 @@
|
|||
- Bugfix/improvement to /add and /drop to recurse selected directories
|
||||
- Bugfix for live diff output when using "whole" edit format
|
||||
|
||||
### v0.8.2
|
||||
### Aider v0.8.2
|
||||
|
||||
- Disabled general availability of gpt-4 (it's rolling out, not 100% available yet)
|
||||
|
||||
### v0.8.1
|
||||
### Aider v0.8.1
|
||||
|
||||
- Ask to create a git repo if none found, to better track GPT's code changes
|
||||
- Glob wildcards are now supported in `/add` and `/drop` commands
|
||||
|
@ -383,7 +405,7 @@
|
|||
- Bugfix for chats with multiple files
|
||||
- Bugfix in editblock coder prompt
|
||||
|
||||
### v0.8.0
|
||||
### Aider v0.8.0
|
||||
|
||||
- [Benchmark comparing code editing in GPT-3.5 and GPT-4](https://aider.chat/docs/benchmarks.html)
|
||||
- Improved Windows support:
|
||||
|
@ -396,15 +418,15 @@
|
|||
- Added `--code-theme` switch to control the pygments styling of code blocks (by @kwmiebach)
|
||||
- Better status messages explaining the reason when ctags is disabled
|
||||
|
||||
### v0.7.2:
|
||||
### Aider v0.7.2:
|
||||
|
||||
- Fixed a bug to allow aider to edit files that contain triple backtick fences.
|
||||
|
||||
### v0.7.1:
|
||||
### Aider v0.7.1:
|
||||
|
||||
- Fixed a bug in the display of streaming diffs in GPT-3.5 chats
|
||||
|
||||
### v0.7.0:
|
||||
### Aider v0.7.0:
|
||||
|
||||
- Graceful handling of context window exhaustion, including helpful tips.
|
||||
- Added `--message` to give GPT that one instruction and then exit after it replies and any edits are performed.
|
||||
|
@ -418,13 +440,13 @@
|
|||
- Initial experiments show that using functions makes 3.5 less competent at coding.
|
||||
- Limit automatic retries when GPT returns a malformed edit response.
|
||||
|
||||
### v0.6.2
|
||||
### Aider v0.6.2
|
||||
|
||||
* Support for `gpt-3.5-turbo-16k`, and all OpenAI chat models
|
||||
* Improved ability to correct when gpt-4 omits leading whitespace in code edits
|
||||
* Added `--openai-api-base` to support API proxies, etc.
|
||||
|
||||
### v0.5.0
|
||||
### Aider v0.5.0
|
||||
|
||||
- Added support for `gpt-3.5-turbo` and `gpt-4-32k`.
|
||||
- Added `--map-tokens` to set a token budget for the repo map, along with a PageRank based algorithm for prioritizing which files and identifiers to include in the map.
|
||||
|
|
19
README.md
19
README.md
|
@ -31,6 +31,7 @@ and works best with GPT-4o, Claude 3.5 Sonnet, Claude 3 Opus and DeepSeek Coder
|
|||
# Because this page is rendered by GitHub as the repo README
|
||||
cog.out(open("website/_includes/get-started.md").read())
|
||||
]]]-->
|
||||
|
||||
You can get started quickly like this:
|
||||
|
||||
```
|
||||
|
@ -39,18 +40,13 @@ $ 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
|
||||
|
||||
# Or, work with Anthropic's models
|
||||
$ export ANTHROPIC_API_KEY=your-key-goes-here
|
||||
|
||||
# Claude 3 Opus
|
||||
$ aider --opus
|
||||
|
||||
# Claude 3.5 Sonnet
|
||||
$ aider --sonnet
|
||||
```
|
||||
<!--[[[end]]]-->
|
||||
|
||||
|
@ -79,8 +75,8 @@ and can [connect to almost any LLM](https://aider.chat/docs/llms.html).
|
|||
- Edit files in your editor while chatting with aider,
|
||||
and it will always use the latest version.
|
||||
Pair program with AI.
|
||||
- Add images to the chat (GPT-4o, GPT-4 Turbo, etc).
|
||||
- Add URLs to the chat and aider will read their content.
|
||||
- [Add images to the chat](https://aider.chat/docs/images-urls.html) (GPT-4o, Claude 3.5 Sonnet, etc).
|
||||
- [Add URLs to the chat](https://aider.chat/docs/images-urls.html) and aider will read their content.
|
||||
- [Code with your voice](https://aider.chat/docs/voice.html).
|
||||
|
||||
|
||||
|
@ -125,4 +121,5 @@ projects like django, scikitlearn, matplotlib, etc.
|
|||
- *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)
|
||||
- *After wasting $100 on tokens trying to find something better, I'm back to Aider. It blows everything else out of the water hands down, there's no competition whatsoever.* -- [SystemSculpt](https://discord.com/channels/1131200896827654144/1131200896827654149/1178736602797846548)
|
||||
- *Hands down, this is the best AI coding assistant tool so far.* -- [IndyDevDan](https://www.youtube.com/watch?v=MPYFPvxfGZs)
|
||||
- *[Aider] changed my daily coding workflows. It's mind-blowing how a single Python application can change your life.* -- [maledorak](https://discord.com/channels/1131200896827654144/1131200896827654149/1258453375620747264)
|
||||
- *Best agent for actual dev work in existing codebases.* -- [Nick Dobos](https://twitter.com/NickADobos/status/1690408967963652097?s=20)
|
||||
|
|
|
@ -1 +1 @@
|
|||
__version__ = "0.40.6-dev"
|
||||
__version__ = "0.42.1-dev"
|
||||
|
|
|
@ -6,7 +6,7 @@ import sys
|
|||
|
||||
import configargparse
|
||||
|
||||
from aider import __version__, models
|
||||
from aider import __version__
|
||||
from aider.args_formatter import (
|
||||
DotEnvFormatter,
|
||||
MarkdownHelpFormatter,
|
||||
|
@ -25,16 +25,9 @@ def get_parser(default_config_files, git_root):
|
|||
description="aider is GPT powered coding 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.add_argument(
|
||||
"--llm-history-file",
|
||||
metavar="LLM_HISTORY_FILE",
|
||||
default=None,
|
||||
help="Log the conversation with the LLM to this file (for example, .aider.llm.history)",
|
||||
)
|
||||
group.add_argument(
|
||||
"files", metavar="FILE", nargs="*", help="files to edit with an LLM (optional)"
|
||||
)
|
||||
|
@ -50,12 +43,11 @@ def get_parser(default_config_files, git_root):
|
|||
env_var="ANTHROPIC_API_KEY",
|
||||
help="Specify the Anthropic API key",
|
||||
)
|
||||
default_model = models.DEFAULT_MODEL_NAME
|
||||
group.add_argument(
|
||||
"--model",
|
||||
metavar="MODEL",
|
||||
default=default_model,
|
||||
help=f"Specify the model to use for the main chat (default: {default_model})",
|
||||
default=None,
|
||||
help="Specify the model to use for the main chat",
|
||||
)
|
||||
opus_model = "claude-3-opus-20240229"
|
||||
group.add_argument(
|
||||
|
@ -150,13 +142,13 @@ def get_parser(default_config_files, git_root):
|
|||
group.add_argument(
|
||||
"--model-settings-file",
|
||||
metavar="MODEL_SETTINGS_FILE",
|
||||
default=None,
|
||||
default=".aider.model.settings.yml",
|
||||
help="Specify a file with aider model settings for unknown models",
|
||||
)
|
||||
group.add_argument(
|
||||
"--model-metadata-file",
|
||||
metavar="MODEL_METADATA_FILE",
|
||||
default=None,
|
||||
default=".aider.model.metadata.json",
|
||||
help="Specify a file with context window and costs for unknown models",
|
||||
)
|
||||
group.add_argument(
|
||||
|
@ -236,6 +228,12 @@ def get_parser(default_config_files, git_root):
|
|||
default=False,
|
||||
help="Restore the previous chat history messages (default: False)",
|
||||
)
|
||||
group.add_argument(
|
||||
"--llm-history-file",
|
||||
metavar="LLM_HISTORY_FILE",
|
||||
default=None,
|
||||
help="Log the conversation with the LLM to this file (for example, .aider.llm.history)",
|
||||
)
|
||||
|
||||
##########
|
||||
group = parser.add_argument_group("Output Settings")
|
||||
|
@ -345,6 +343,12 @@ def get_parser(default_config_files, git_root):
|
|||
default=True,
|
||||
help="Attribute aider commits in the git committer name (default: True)",
|
||||
)
|
||||
group.add_argument(
|
||||
"--attribute-commit-message",
|
||||
action=argparse.BooleanOptionalAction,
|
||||
default=False,
|
||||
help="Prefix commit messages with 'aider: ' (default: False)",
|
||||
)
|
||||
group.add_argument(
|
||||
"--dry-run",
|
||||
action=argparse.BooleanOptionalAction,
|
||||
|
@ -381,7 +385,6 @@ def get_parser(default_config_files, git_root):
|
|||
)
|
||||
group.add_argument(
|
||||
"--test-cmd",
|
||||
action="append",
|
||||
help="Specify command to run tests",
|
||||
default=[],
|
||||
)
|
||||
|
@ -459,6 +462,12 @@ def get_parser(default_config_files, git_root):
|
|||
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,
|
||||
)
|
||||
group.add_argument(
|
||||
"--message",
|
||||
"--msg",
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
import hashlib
|
||||
import json
|
||||
import mimetypes
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
@ -13,8 +14,6 @@ from json.decoder import JSONDecodeError
|
|||
from pathlib import Path
|
||||
|
||||
import git
|
||||
import openai
|
||||
from jsonschema import Draft7Validator
|
||||
from rich.console import Console, Text
|
||||
from rich.markdown import Markdown
|
||||
|
||||
|
@ -23,7 +22,7 @@ from aider.commands import Commands
|
|||
from aider.history import ChatSummary
|
||||
from aider.io import InputOutput
|
||||
from aider.linter import Linter
|
||||
from aider.litellm import litellm
|
||||
from aider.llm import litellm
|
||||
from aider.mdstream import MarkdownStream
|
||||
from aider.repo import GitRepo
|
||||
from aider.repomap import RepoMap
|
||||
|
@ -37,7 +36,7 @@ class MissingAPIKeyError(ValueError):
|
|||
pass
|
||||
|
||||
|
||||
class ExhaustedContextWindow(Exception):
|
||||
class FinishReasonLength(Exception):
|
||||
pass
|
||||
|
||||
|
||||
|
@ -67,6 +66,7 @@ class Coder:
|
|||
test_cmd = None
|
||||
lint_outcome = None
|
||||
test_outcome = None
|
||||
multi_response_content = ""
|
||||
|
||||
@classmethod
|
||||
def create(
|
||||
|
@ -221,6 +221,7 @@ class Coder:
|
|||
test_cmd=None,
|
||||
attribute_author=True,
|
||||
attribute_committer=True,
|
||||
attribute_commit_message=False,
|
||||
):
|
||||
if not fnames:
|
||||
fnames = []
|
||||
|
@ -280,6 +281,7 @@ class Coder:
|
|||
models=main_model.commit_message_models(),
|
||||
attribute_author=attribute_author,
|
||||
attribute_committer=attribute_committer,
|
||||
attribute_commit_message=attribute_commit_message,
|
||||
)
|
||||
self.root = self.repo.root
|
||||
except FileNotFoundError:
|
||||
|
@ -344,6 +346,8 @@ class Coder:
|
|||
|
||||
# validate the functions jsonschema
|
||||
if self.functions:
|
||||
from jsonschema import Draft7Validator
|
||||
|
||||
for function in self.functions:
|
||||
Draft7Validator.check_schema(function)
|
||||
|
||||
|
@ -572,10 +576,12 @@ class Coder:
|
|||
image_messages = []
|
||||
for fname, content in self.get_abs_fnames_content():
|
||||
if is_image_file(fname):
|
||||
image_url = f"data:image/{Path(fname).suffix.lstrip('.')};base64,{content}"
|
||||
image_messages.append(
|
||||
{"type": "image_url", "image_url": {"url": image_url, "detail": "high"}}
|
||||
)
|
||||
mime_type, _ = mimetypes.guess_type(fname)
|
||||
if mime_type and mime_type.startswith("image/"):
|
||||
image_url = f"data:{mime_type};base64,{content}"
|
||||
image_messages.append(
|
||||
{"type": "image_url", "image_url": {"url": image_url, "detail": "high"}}
|
||||
)
|
||||
|
||||
if not image_messages:
|
||||
return None
|
||||
|
@ -805,33 +811,56 @@ class Coder:
|
|||
|
||||
messages = self.format_messages()
|
||||
|
||||
self.io.log_llm_history("TO LLM", format_messages(messages))
|
||||
|
||||
if self.verbose:
|
||||
utils.show_messages(messages, functions=self.functions)
|
||||
|
||||
self.multi_response_content = ""
|
||||
if self.show_pretty() and self.stream:
|
||||
mdargs = dict(style=self.assistant_output_color, code_theme=self.code_theme)
|
||||
self.mdstream = MarkdownStream(mdargs=mdargs)
|
||||
else:
|
||||
self.mdstream = None
|
||||
|
||||
exhausted = False
|
||||
interrupted = False
|
||||
try:
|
||||
yield from self.send(messages, functions=self.functions)
|
||||
except KeyboardInterrupt:
|
||||
interrupted = True
|
||||
except ExhaustedContextWindow:
|
||||
exhausted = True
|
||||
except litellm.exceptions.BadRequestError as err:
|
||||
if "ContextWindowExceededError" in err.message:
|
||||
exhausted = True
|
||||
else:
|
||||
self.io.tool_error(f"BadRequestError: {err}")
|
||||
return
|
||||
except openai.BadRequestError as err:
|
||||
if "maximum context length" in str(err):
|
||||
exhausted = True
|
||||
else:
|
||||
raise err
|
||||
except Exception as err:
|
||||
self.io.tool_error(f"Unexpected error: {err}")
|
||||
return
|
||||
while True:
|
||||
try:
|
||||
yield from self.send(messages, functions=self.functions)
|
||||
break
|
||||
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 4k output limit!
|
||||
if not self.main_model.can_prefill:
|
||||
exhausted = True
|
||||
break
|
||||
|
||||
self.multi_response_content = self.get_multi_response_content()
|
||||
|
||||
if messages[-1]["role"] == "assistant":
|
||||
messages[-1]["content"] = self.multi_response_content
|
||||
else:
|
||||
messages.append(dict(role="assistant", content=self.multi_response_content))
|
||||
except Exception as err:
|
||||
self.io.tool_error(f"Unexpected error: {err}")
|
||||
traceback.print_exc()
|
||||
return
|
||||
finally:
|
||||
if self.mdstream:
|
||||
self.live_incremental_response(True)
|
||||
self.mdstream = None
|
||||
|
||||
self.partial_response_content = self.get_multi_response_content(True)
|
||||
self.multi_response_content = ""
|
||||
|
||||
if exhausted:
|
||||
self.show_exhausted_error()
|
||||
|
@ -851,8 +880,6 @@ class Coder:
|
|||
|
||||
self.io.tool_output()
|
||||
|
||||
self.io.log_llm_history("LLM RESPONSE", format_content("ASSISTANT", content))
|
||||
|
||||
if interrupted:
|
||||
content += "\n^C KeyboardInterrupt"
|
||||
self.cur_messages += [dict(role="assistant", content=content)]
|
||||
|
@ -1045,6 +1072,8 @@ class Coder:
|
|||
self.partial_response_content = ""
|
||||
self.partial_response_function_call = dict()
|
||||
|
||||
self.io.log_llm_history("TO LLM", format_messages(messages))
|
||||
|
||||
interrupted = False
|
||||
try:
|
||||
hash_object, completion = send_with_retries(
|
||||
|
@ -1060,6 +1089,11 @@ class Coder:
|
|||
self.keyboard_interrupt()
|
||||
interrupted = True
|
||||
finally:
|
||||
self.io.log_llm_history(
|
||||
"LLM RESPONSE",
|
||||
format_content("ASSISTANT", self.partial_response_content),
|
||||
)
|
||||
|
||||
if self.partial_response_content:
|
||||
self.io.ai_output(self.partial_response_content)
|
||||
elif self.partial_response_function_call:
|
||||
|
@ -1101,7 +1135,7 @@ class Coder:
|
|||
if show_func_err and show_content_err:
|
||||
self.io.tool_error(show_func_err)
|
||||
self.io.tool_error(show_content_err)
|
||||
raise Exception("No data found in openai response!")
|
||||
raise Exception("No data found in LLM response!")
|
||||
|
||||
tokens = None
|
||||
if hasattr(completion, "usage") and completion.usage is not None:
|
||||
|
@ -1129,61 +1163,62 @@ class Coder:
|
|||
if tokens is not None:
|
||||
self.io.tool_output(tokens)
|
||||
|
||||
if (
|
||||
hasattr(completion.choices[0], "finish_reason")
|
||||
and completion.choices[0].finish_reason == "length"
|
||||
):
|
||||
raise FinishReasonLength()
|
||||
|
||||
def show_send_output_stream(self, completion):
|
||||
if self.show_pretty():
|
||||
mdargs = dict(style=self.assistant_output_color, code_theme=self.code_theme)
|
||||
mdstream = MarkdownStream(mdargs=mdargs)
|
||||
else:
|
||||
mdstream = None
|
||||
for chunk in completion:
|
||||
if len(chunk.choices) == 0:
|
||||
continue
|
||||
|
||||
try:
|
||||
for chunk in completion:
|
||||
if len(chunk.choices) == 0:
|
||||
continue
|
||||
if (
|
||||
hasattr(chunk.choices[0], "finish_reason")
|
||||
and chunk.choices[0].finish_reason == "length"
|
||||
):
|
||||
raise FinishReasonLength()
|
||||
|
||||
if (
|
||||
hasattr(chunk.choices[0], "finish_reason")
|
||||
and chunk.choices[0].finish_reason == "length"
|
||||
):
|
||||
raise ExhaustedContextWindow()
|
||||
try:
|
||||
func = chunk.choices[0].delta.function_call
|
||||
# dump(func)
|
||||
for k, v in func.items():
|
||||
if k in self.partial_response_function_call:
|
||||
self.partial_response_function_call[k] += v
|
||||
else:
|
||||
self.partial_response_function_call[k] = v
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
try:
|
||||
func = chunk.choices[0].delta.function_call
|
||||
# dump(func)
|
||||
for k, v in func.items():
|
||||
if k in self.partial_response_function_call:
|
||||
self.partial_response_function_call[k] += v
|
||||
else:
|
||||
self.partial_response_function_call[k] = v
|
||||
except AttributeError:
|
||||
pass
|
||||
try:
|
||||
text = chunk.choices[0].delta.content
|
||||
if text:
|
||||
self.partial_response_content += text
|
||||
except AttributeError:
|
||||
text = None
|
||||
|
||||
try:
|
||||
text = chunk.choices[0].delta.content
|
||||
if text:
|
||||
self.partial_response_content += text
|
||||
except AttributeError:
|
||||
text = None
|
||||
if self.show_pretty():
|
||||
self.live_incremental_response(False)
|
||||
elif text:
|
||||
sys.stdout.write(text)
|
||||
sys.stdout.flush()
|
||||
yield text
|
||||
|
||||
if self.show_pretty():
|
||||
self.live_incremental_response(mdstream, False)
|
||||
elif text:
|
||||
sys.stdout.write(text)
|
||||
sys.stdout.flush()
|
||||
yield text
|
||||
finally:
|
||||
if mdstream:
|
||||
self.live_incremental_response(mdstream, True)
|
||||
|
||||
def live_incremental_response(self, mdstream, final):
|
||||
def live_incremental_response(self, final):
|
||||
show_resp = self.render_incremental_response(final)
|
||||
if not show_resp:
|
||||
return
|
||||
|
||||
mdstream.update(show_resp, final=final)
|
||||
self.mdstream.update(show_resp, final=final)
|
||||
|
||||
def render_incremental_response(self, final):
|
||||
return self.partial_response_content
|
||||
return self.get_multi_response_content()
|
||||
|
||||
def get_multi_response_content(self, final=False):
|
||||
cur = self.multi_response_content
|
||||
new = self.partial_response_content
|
||||
|
||||
if new.rstrip() != new and not final:
|
||||
new = new.rstrip()
|
||||
return cur + new
|
||||
|
||||
def get_rel_fname(self, fname):
|
||||
return os.path.relpath(fname, self.root)
|
||||
|
@ -1192,13 +1227,19 @@ class Coder:
|
|||
files = [self.get_rel_fname(fname) for fname in self.abs_fnames]
|
||||
return sorted(set(files))
|
||||
|
||||
def is_file_safe(self, fname):
|
||||
try:
|
||||
return Path(self.abs_root_path(fname)).is_file()
|
||||
except OSError:
|
||||
return
|
||||
|
||||
def get_all_relative_files(self):
|
||||
if self.repo:
|
||||
files = self.repo.get_tracked_files()
|
||||
else:
|
||||
files = self.get_inchat_relative_files()
|
||||
|
||||
files = [fname for fname in files if Path(self.abs_root_path(fname)).is_file()]
|
||||
files = [fname for fname in files if self.is_file_safe(fname)]
|
||||
return sorted(set(files))
|
||||
|
||||
def get_all_abs_files(self):
|
||||
|
@ -1405,8 +1446,8 @@ class Coder:
|
|||
return context
|
||||
|
||||
def auto_commit(self, edited):
|
||||
# context = self.get_context_from_history(self.cur_messages)
|
||||
res = self.repo.commit(fnames=edited, aider_edits=True)
|
||||
context = self.get_context_from_history(self.cur_messages)
|
||||
res = self.repo.commit(fnames=edited, context=context, aider_edits=True)
|
||||
if res:
|
||||
commit_hash, commit_message = res
|
||||
self.last_aider_commit_hash = commit_hash
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from pathlib import Path
|
||||
|
||||
from aider import diffs
|
||||
from pathlib import Path
|
||||
|
||||
from ..dump import dump # noqa: F401
|
||||
from .base_coder import Coder
|
||||
|
@ -26,10 +26,10 @@ class WholeFileCoder(Coder):
|
|||
try:
|
||||
return self.get_edits(mode="diff")
|
||||
except ValueError:
|
||||
return self.partial_response_content
|
||||
return self.get_multi_response_content()
|
||||
|
||||
def get_edits(self, mode="update"):
|
||||
content = self.partial_response_content
|
||||
content = self.get_multi_response_content()
|
||||
|
||||
chat_files = self.get_inchat_relative_files()
|
||||
|
||||
|
|
|
@ -5,11 +5,9 @@ import sys
|
|||
from pathlib import Path
|
||||
|
||||
import git
|
||||
import openai
|
||||
from prompt_toolkit.completion import Completion
|
||||
|
||||
from aider import models, prompts, voice
|
||||
from aider.litellm import litellm
|
||||
from aider.llm import litellm
|
||||
from aider.scrape import Scraper
|
||||
from aider.utils import is_image_file
|
||||
|
||||
|
@ -42,11 +40,9 @@ class Commands:
|
|||
models.sanity_check_models(self.io, model)
|
||||
raise SwitchModel(model)
|
||||
|
||||
def completions_model(self, partial):
|
||||
def completions_model(self):
|
||||
models = litellm.model_cost.keys()
|
||||
for model in models:
|
||||
if partial.lower() in model.lower():
|
||||
yield Completion(model, start_position=-len(partial))
|
||||
return models
|
||||
|
||||
def cmd_models(self, args):
|
||||
"Search the list of available models"
|
||||
|
@ -83,21 +79,25 @@ class Commands:
|
|||
def is_command(self, inp):
|
||||
return inp[0] in "/!"
|
||||
|
||||
def get_completions(self, cmd):
|
||||
assert cmd.startswith("/")
|
||||
cmd = cmd[1:]
|
||||
|
||||
fun = getattr(self, f"completions_{cmd}", None)
|
||||
if not fun:
|
||||
return []
|
||||
return sorted(fun())
|
||||
|
||||
def get_commands(self):
|
||||
commands = []
|
||||
for attr in dir(self):
|
||||
if attr.startswith("cmd_"):
|
||||
commands.append("/" + attr[4:])
|
||||
if not attr.startswith("cmd_"):
|
||||
continue
|
||||
cmd = attr[4:]
|
||||
commands.append("/" + cmd)
|
||||
|
||||
return commands
|
||||
|
||||
def get_command_completions(self, cmd_name, partial):
|
||||
cmd_completions_method_name = f"completions_{cmd_name}"
|
||||
cmd_completions_method = getattr(self, cmd_completions_method_name, None)
|
||||
if cmd_completions_method:
|
||||
for completion in cmd_completions_method(partial):
|
||||
yield completion
|
||||
|
||||
def do_run(self, cmd_name, args):
|
||||
cmd_method_name = f"cmd_{cmd_name}"
|
||||
cmd_method = getattr(self, cmd_method_name, None)
|
||||
|
@ -331,10 +331,7 @@ class Commands:
|
|||
return
|
||||
|
||||
last_commit = self.coder.repo.repo.head.commit
|
||||
if (
|
||||
not last_commit.author.name.endswith(" (aider)")
|
||||
or last_commit.hexsha[:7] != self.coder.last_aider_commit_hash
|
||||
):
|
||||
if last_commit.hexsha[:7] != self.coder.last_aider_commit_hash:
|
||||
self.io.tool_error("The last commit was not made by aider in this chat session.")
|
||||
self.io.tool_error(
|
||||
"You could try `/git reset --hard HEAD^` but be aware that this is a destructive"
|
||||
|
@ -381,12 +378,11 @@ class Commands:
|
|||
fname = f'"{fname}"'
|
||||
return fname
|
||||
|
||||
def completions_add(self, partial):
|
||||
def completions_add(self):
|
||||
files = set(self.coder.get_all_relative_files())
|
||||
files = files - set(self.coder.get_inchat_relative_files())
|
||||
for fname in files:
|
||||
if partial.lower() in fname.lower():
|
||||
yield Completion(self.quote_fname(fname), start_position=-len(partial))
|
||||
files = [self.quote_fname(fn) for fn in files]
|
||||
return files
|
||||
|
||||
def glob_filtered_to_repo(self, pattern):
|
||||
try:
|
||||
|
@ -487,12 +483,10 @@ class Commands:
|
|||
reply = prompts.added_files.format(fnames=", ".join(added_fnames))
|
||||
return reply
|
||||
|
||||
def completions_drop(self, partial):
|
||||
def completions_drop(self):
|
||||
files = self.coder.get_inchat_relative_files()
|
||||
|
||||
for fname in files:
|
||||
if partial.lower() in fname.lower():
|
||||
yield Completion(self.quote_fname(fname), start_position=-len(partial))
|
||||
files = [self.quote_fname(fn) for fn in files]
|
||||
return files
|
||||
|
||||
def cmd_drop(self, args=""):
|
||||
"Remove files from the chat session to free up context space"
|
||||
|
@ -616,14 +610,14 @@ class Commands:
|
|||
self.io.tool_output("\nNo files in chat or git repo.")
|
||||
return
|
||||
|
||||
if chat_files:
|
||||
self.io.tool_output("Files in chat:\n")
|
||||
for file in chat_files:
|
||||
if other_files:
|
||||
self.io.tool_output("Repo files not in the chat:\n")
|
||||
for file in other_files:
|
||||
self.io.tool_output(f" {file}")
|
||||
|
||||
if other_files:
|
||||
self.io.tool_output("\nRepo files not in the chat:\n")
|
||||
for file in other_files:
|
||||
if chat_files:
|
||||
self.io.tool_output("\nFiles in chat:\n")
|
||||
for file in chat_files:
|
||||
self.io.tool_output(f" {file}")
|
||||
|
||||
def cmd_help(self, args):
|
||||
|
@ -688,7 +682,7 @@ class Commands:
|
|||
|
||||
try:
|
||||
text = self.voice.record_and_transcribe(history, language=self.voice_language)
|
||||
except openai.OpenAIError as err:
|
||||
except litellm.OpenAIError as err:
|
||||
self.io.tool_error(f"Unable to use OpenAI whisper model: {err}")
|
||||
return
|
||||
|
||||
|
|
|
@ -17,9 +17,10 @@ from aider.scrape import Scraper
|
|||
class CaptureIO(InputOutput):
|
||||
lines = []
|
||||
|
||||
def tool_output(self, msg):
|
||||
self.lines.append(msg)
|
||||
super().tool_output(msg)
|
||||
def tool_output(self, msg, log_only=False):
|
||||
if not log_only:
|
||||
self.lines.append(msg)
|
||||
super().tool_output(msg, log_only=log_only)
|
||||
|
||||
def tool_error(self, msg):
|
||||
self.lines.append(msg)
|
||||
|
|
|
@ -61,7 +61,11 @@ class ChatSummary:
|
|||
sized.reverse()
|
||||
keep = []
|
||||
total = 0
|
||||
model_max_input_tokens = self.model.info.get("max_input_tokens", 4096) - 512
|
||||
|
||||
# These sometimes come set with value = None
|
||||
model_max_input_tokens = self.model.info.get("max_input_tokens") or 4096
|
||||
model_max_input_tokens -= 512
|
||||
|
||||
for i in range(split_index):
|
||||
total += sized[i][0]
|
||||
if total > model_max_input_tokens:
|
||||
|
|
45
aider/io.py
45
aider/io.py
|
@ -23,7 +23,6 @@ from .utils import is_image_file
|
|||
|
||||
class AutoCompleter(Completer):
|
||||
def __init__(self, root, rel_fnames, addable_rel_fnames, commands, encoding):
|
||||
self.commands = commands
|
||||
self.addable_rel_fnames = addable_rel_fnames
|
||||
self.rel_fnames = rel_fnames
|
||||
self.encoding = encoding
|
||||
|
@ -37,6 +36,11 @@ class AutoCompleter(Completer):
|
|||
|
||||
self.words = set()
|
||||
|
||||
self.commands = commands
|
||||
self.command_completions = dict()
|
||||
if commands:
|
||||
self.command_names = self.commands.get_commands()
|
||||
|
||||
for rel_fname in addable_rel_fnames:
|
||||
self.words.add(rel_fname)
|
||||
|
||||
|
@ -64,16 +68,31 @@ class AutoCompleter(Completer):
|
|||
|
||||
if text[0] == "/":
|
||||
if len(words) == 1 and not text[-1].isspace():
|
||||
candidates = self.commands.get_commands()
|
||||
candidates = [(cmd, cmd) for cmd in candidates]
|
||||
else:
|
||||
for completion in self.commands.get_command_completions(words[0][1:], words[-1]):
|
||||
yield completion
|
||||
return
|
||||
else:
|
||||
candidates = self.words
|
||||
candidates.update(set(self.fname_to_rel_fnames))
|
||||
candidates = [(word, f"`{word}`") for word in candidates]
|
||||
partial = words[0]
|
||||
candidates = self.command_names
|
||||
for cmd in candidates:
|
||||
if cmd.startswith(partial):
|
||||
yield Completion(cmd, start_position=-len(partial))
|
||||
elif len(words) > 1 and not text[-1].isspace():
|
||||
cmd = words[0]
|
||||
partial = words[-1]
|
||||
|
||||
if cmd not in self.command_names:
|
||||
return
|
||||
if cmd not in self.command_completions:
|
||||
candidates = self.commands.get_completions(cmd)
|
||||
self.command_completions[cmd] = candidates
|
||||
else:
|
||||
candidates = self.command_completions[cmd]
|
||||
|
||||
for word in candidates:
|
||||
if partial in word:
|
||||
yield Completion(word, start_position=-len(partial))
|
||||
return
|
||||
|
||||
candidates = self.words
|
||||
candidates.update(set(self.fname_to_rel_fnames))
|
||||
candidates = [(word, f"`{word}`") for word in candidates]
|
||||
|
||||
last_word = words[-1]
|
||||
for word_match, word_insert in candidates:
|
||||
|
@ -277,8 +296,8 @@ class InputOutput:
|
|||
def log_llm_history(self, role, content):
|
||||
if not self.llm_history_file:
|
||||
return
|
||||
timestamp = datetime.now().isoformat(timespec='seconds')
|
||||
with open(self.llm_history_file, 'a', encoding=self.encoding) as log_file:
|
||||
timestamp = datetime.now().isoformat(timespec="seconds")
|
||||
with open(self.llm_history_file, "a", encoding=self.encoding) as log_file:
|
||||
log_file.write(f"{role.upper()} {timestamp}\n")
|
||||
log_file.write(content + "\n")
|
||||
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
import os
|
||||
import warnings
|
||||
|
||||
warnings.filterwarnings("ignore", category=UserWarning, module="pydantic")
|
||||
|
||||
os.environ["OR_SITE_URL"] = "http://aider.chat"
|
||||
os.environ["OR_APP_NAME"] = "Aider"
|
||||
|
||||
import litellm # noqa: E402
|
||||
|
||||
litellm.suppress_debug_info = True
|
||||
litellm.set_verbose = False
|
||||
|
||||
__all__ = [litellm]
|
29
aider/llm.py
Normal file
29
aider/llm.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
import importlib
|
||||
import os
|
||||
import warnings
|
||||
|
||||
warnings.filterwarnings("ignore", category=UserWarning, module="pydantic")
|
||||
|
||||
os.environ["OR_SITE_URL"] = "http://aider.chat"
|
||||
os.environ["OR_APP_NAME"] = "Aider"
|
||||
|
||||
# `import litellm` takes 1.5 seconds, defer it!
|
||||
|
||||
|
||||
class LazyLiteLLM:
|
||||
def __init__(self):
|
||||
self._lazy_module = None
|
||||
|
||||
def __getattr__(self, name):
|
||||
if self._lazy_module is None:
|
||||
self._lazy_module = importlib.import_module("litellm")
|
||||
|
||||
self._lazy_module.suppress_debug_info = True
|
||||
self._lazy_module.set_verbose = False
|
||||
|
||||
return getattr(self._lazy_module, name)
|
||||
|
||||
|
||||
litellm = LazyLiteLLM()
|
||||
|
||||
__all__ = [litellm]
|
|
@ -2,20 +2,19 @@ import configparser
|
|||
import os
|
||||
import re
|
||||
import sys
|
||||
import threading
|
||||
from pathlib import Path
|
||||
|
||||
import git
|
||||
import httpx
|
||||
from dotenv import load_dotenv
|
||||
from prompt_toolkit.enums import EditingMode
|
||||
from streamlit.web import cli
|
||||
|
||||
from aider import __version__, models, utils
|
||||
from aider.args import get_parser
|
||||
from aider.coders import Coder
|
||||
from aider.commands import SwitchModel
|
||||
from aider.io import InputOutput
|
||||
from aider.litellm import litellm # noqa: F401; properly init litellm on launch
|
||||
from aider.llm import litellm # noqa: F401; properly init litellm on launch
|
||||
from aider.repo import GitRepo
|
||||
from aider.versioncheck import check_version
|
||||
|
||||
|
@ -150,6 +149,8 @@ def scrub_sensitive_info(args, text):
|
|||
|
||||
|
||||
def launch_gui(args):
|
||||
from streamlit.web import cli
|
||||
|
||||
from aider import gui
|
||||
|
||||
print()
|
||||
|
@ -222,6 +223,14 @@ def generate_search_path_list(default_fname, git_root, command_line_file):
|
|||
if command_line_file:
|
||||
files.append(command_line_file)
|
||||
files.append(default_file.resolve())
|
||||
files = [Path(fn).resolve() for fn in files]
|
||||
files.reverse()
|
||||
uniq = []
|
||||
for fn in files:
|
||||
if fn not in uniq:
|
||||
uniq.append(fn)
|
||||
uniq.reverse()
|
||||
files = uniq
|
||||
files = list(map(str, files))
|
||||
files = list(dict.fromkeys(files))
|
||||
|
||||
|
@ -230,7 +239,7 @@ def generate_search_path_list(default_fname, git_root, command_line_file):
|
|||
|
||||
def register_models(git_root, model_settings_fname, io):
|
||||
model_settings_files = generate_search_path_list(
|
||||
".aider.models.yml", git_root, model_settings_fname
|
||||
".aider.model.settings.yml", git_root, model_settings_fname
|
||||
)
|
||||
|
||||
try:
|
||||
|
@ -248,17 +257,17 @@ def register_models(git_root, model_settings_fname, io):
|
|||
|
||||
def register_litellm_models(git_root, model_metadata_fname, io):
|
||||
model_metatdata_files = generate_search_path_list(
|
||||
".aider.litellm.models.json", git_root, model_metadata_fname
|
||||
".aider.model.metadata.json", git_root, model_metadata_fname
|
||||
)
|
||||
|
||||
try:
|
||||
model_metadata_files_loaded = models.register_litellm_models(model_metatdata_files)
|
||||
if len(model_metadata_files_loaded) > 0:
|
||||
io.tool_output(f"Loaded {len(model_metadata_files_loaded)} litellm model file(s)")
|
||||
io.tool_output(f"Loaded {len(model_metadata_files_loaded)} model metadata file(s)")
|
||||
for model_metadata_file in model_metadata_files_loaded:
|
||||
io.tool_output(f" - {model_metadata_file}")
|
||||
except Exception as e:
|
||||
io.tool_error(f"Error loading litellm models: {e}")
|
||||
io.tool_error(f"Error loading model metadata models: {e}")
|
||||
return 1
|
||||
|
||||
|
||||
|
@ -292,6 +301,8 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
|
|||
args = parser.parse_args(argv)
|
||||
|
||||
if not args.verify_ssl:
|
||||
import httpx
|
||||
|
||||
litellm.client_session = httpx.Client(verify=False)
|
||||
|
||||
if args.gui and not return_coder:
|
||||
|
@ -403,6 +414,11 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
|
|||
register_models(git_root, args.model_settings_file, io)
|
||||
register_litellm_models(git_root, args.model_metadata_file, io)
|
||||
|
||||
if not args.model:
|
||||
args.model = "gpt-4o"
|
||||
if os.environ.get("ANTHROPIC_API_KEY"):
|
||||
args.model = "claude-3-5-sonnet-20240620"
|
||||
|
||||
main_model = models.Model(args.model, weak_model=args.weak_model)
|
||||
|
||||
lint_cmds = parse_lint_cmds(args.lint_cmd, io)
|
||||
|
@ -441,6 +457,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
|
|||
test_cmd=args.test_cmd,
|
||||
attribute_author=args.attribute_author,
|
||||
attribute_committer=args.attribute_committer,
|
||||
attribute_commit_message=args.attribute_commit_message,
|
||||
)
|
||||
|
||||
except ValueError as err:
|
||||
|
@ -528,6 +545,11 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
|
|||
return 1
|
||||
return
|
||||
|
||||
if args.exit:
|
||||
return
|
||||
|
||||
threading.Thread(target=load_slow_imports).start()
|
||||
|
||||
while True:
|
||||
try:
|
||||
coder.run()
|
||||
|
@ -537,6 +559,20 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
|
|||
coder.show_announcements()
|
||||
|
||||
|
||||
def load_slow_imports():
|
||||
# These imports are deferred in various ways to
|
||||
# improve startup time.
|
||||
# This func is called in a thread to load them in the background
|
||||
# while we wait for the user to type their first message.
|
||||
try:
|
||||
import httpx # noqa: F401
|
||||
import litellm # noqa: F401
|
||||
import networkx # noqa: F401
|
||||
import numpy # noqa: F401
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
status = main()
|
||||
sys.exit(status)
|
||||
|
|
136
aider/models.py
136
aider/models.py
|
@ -1,9 +1,11 @@
|
|||
import difflib
|
||||
import importlib
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
import sys
|
||||
from dataclasses import dataclass, fields
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
import yaml
|
||||
|
@ -11,10 +13,48 @@ from PIL import Image
|
|||
|
||||
from aider import urls
|
||||
from aider.dump import dump # noqa: F401
|
||||
from aider.litellm import litellm
|
||||
from aider.llm import litellm
|
||||
|
||||
DEFAULT_MODEL_NAME = "gpt-4o"
|
||||
|
||||
OPENAI_MODELS = """
|
||||
gpt-4
|
||||
gpt-4o
|
||||
gpt-4o-2024-05-13
|
||||
gpt-4-turbo-preview
|
||||
gpt-4-0314
|
||||
gpt-4-0613
|
||||
gpt-4-32k
|
||||
gpt-4-32k-0314
|
||||
gpt-4-32k-0613
|
||||
gpt-4-turbo
|
||||
gpt-4-turbo-2024-04-09
|
||||
gpt-4-1106-preview
|
||||
gpt-4-0125-preview
|
||||
gpt-4-vision-preview
|
||||
gpt-4-1106-vision-preview
|
||||
gpt-3.5-turbo
|
||||
gpt-3.5-turbo-0301
|
||||
gpt-3.5-turbo-0613
|
||||
gpt-3.5-turbo-1106
|
||||
gpt-3.5-turbo-0125
|
||||
gpt-3.5-turbo-16k
|
||||
gpt-3.5-turbo-16k-0613
|
||||
"""
|
||||
|
||||
OPENAI_MODELS = [ln.strip() for ln in OPENAI_MODELS.splitlines() if ln.strip()]
|
||||
|
||||
ANTHROPIC_MODELS = """
|
||||
claude-2
|
||||
claude-2.1
|
||||
claude-3-haiku-20240307
|
||||
claude-3-opus-20240229
|
||||
claude-3-sonnet-20240229
|
||||
claude-3-5-sonnet-20240620
|
||||
"""
|
||||
|
||||
ANTHROPIC_MODELS = [ln.strip() for ln in ANTHROPIC_MODELS.splitlines() if ln.strip()]
|
||||
|
||||
|
||||
@dataclass
|
||||
class ModelSettings:
|
||||
|
@ -27,6 +67,7 @@ class ModelSettings:
|
|||
lazy: bool = False
|
||||
reminder_as_sys_msg: bool = False
|
||||
examples_as_sys_msg: bool = False
|
||||
can_prefill: bool = False
|
||||
|
||||
|
||||
# https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo
|
||||
|
@ -166,6 +207,7 @@ MODEL_SETTINGS = [
|
|||
weak_model_name="claude-3-haiku-20240307",
|
||||
use_repo_map=True,
|
||||
send_undo_reply=True,
|
||||
can_prefill=True,
|
||||
),
|
||||
ModelSettings(
|
||||
"openrouter/anthropic/claude-3-opus",
|
||||
|
@ -173,11 +215,13 @@ MODEL_SETTINGS = [
|
|||
weak_model_name="openrouter/anthropic/claude-3-haiku",
|
||||
use_repo_map=True,
|
||||
send_undo_reply=True,
|
||||
can_prefill=True,
|
||||
),
|
||||
ModelSettings(
|
||||
"claude-3-sonnet-20240229",
|
||||
"whole",
|
||||
weak_model_name="claude-3-haiku-20240307",
|
||||
can_prefill=True,
|
||||
),
|
||||
ModelSettings(
|
||||
"claude-3-5-sonnet-20240620",
|
||||
|
@ -185,6 +229,8 @@ MODEL_SETTINGS = [
|
|||
weak_model_name="claude-3-haiku-20240307",
|
||||
use_repo_map=True,
|
||||
examples_as_sys_msg=True,
|
||||
can_prefill=True,
|
||||
accepts_images=True,
|
||||
),
|
||||
ModelSettings(
|
||||
"anthropic/claude-3-5-sonnet-20240620",
|
||||
|
@ -192,6 +238,7 @@ MODEL_SETTINGS = [
|
|||
weak_model_name="claude-3-haiku-20240307",
|
||||
use_repo_map=True,
|
||||
examples_as_sys_msg=True,
|
||||
can_prefill=True,
|
||||
),
|
||||
ModelSettings(
|
||||
"openrouter/anthropic/claude-3.5-sonnet",
|
||||
|
@ -199,6 +246,8 @@ MODEL_SETTINGS = [
|
|||
weak_model_name="openrouter/anthropic/claude-3-haiku-20240307",
|
||||
use_repo_map=True,
|
||||
examples_as_sys_msg=True,
|
||||
can_prefill=True,
|
||||
accepts_images=True,
|
||||
),
|
||||
# Vertex AI Claude models
|
||||
ModelSettings(
|
||||
|
@ -206,6 +255,9 @@ MODEL_SETTINGS = [
|
|||
"diff",
|
||||
weak_model_name="vertex_ai/claude-3-haiku@20240307",
|
||||
use_repo_map=True,
|
||||
examples_as_sys_msg=True,
|
||||
can_prefill=True,
|
||||
accepts_images=True,
|
||||
),
|
||||
ModelSettings(
|
||||
"vertex_ai/claude-3-opus@20240229",
|
||||
|
@ -213,11 +265,13 @@ MODEL_SETTINGS = [
|
|||
weak_model_name="vertex_ai/claude-3-haiku@20240307",
|
||||
use_repo_map=True,
|
||||
send_undo_reply=True,
|
||||
can_prefill=True,
|
||||
),
|
||||
ModelSettings(
|
||||
"vertex_ai/claude-3-sonnet@20240229",
|
||||
"whole",
|
||||
weak_model_name="vertex_ai/claude-3-haiku@20240307",
|
||||
can_prefill=True,
|
||||
),
|
||||
# Cohere
|
||||
ModelSettings(
|
||||
|
@ -282,6 +336,16 @@ MODEL_SETTINGS = [
|
|||
examples_as_sys_msg=True,
|
||||
reminder_as_sys_msg=True,
|
||||
),
|
||||
ModelSettings(
|
||||
"openrouter/openai/gpt-4o",
|
||||
"diff",
|
||||
weak_model_name="openrouter/openai/gpt-3.5-turbo",
|
||||
use_repo_map=True,
|
||||
send_undo_reply=True,
|
||||
accepts_images=True,
|
||||
lazy=True,
|
||||
reminder_as_sys_msg=True,
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
|
@ -303,32 +367,17 @@ class Model:
|
|||
def __init__(self, model, weak_model=None):
|
||||
self.name = model
|
||||
|
||||
# Do we have the model_info?
|
||||
try:
|
||||
self.info = litellm.get_model_info(model)
|
||||
except Exception:
|
||||
self.info = dict()
|
||||
|
||||
if not self.info and "gpt-4o" in self.name:
|
||||
self.info = {
|
||||
"max_tokens": 4096,
|
||||
"max_input_tokens": 128000,
|
||||
"max_output_tokens": 4096,
|
||||
"input_cost_per_token": 5e-06,
|
||||
"output_cost_per_token": 1.5e-5,
|
||||
"litellm_provider": "openai",
|
||||
"mode": "chat",
|
||||
"supports_function_calling": True,
|
||||
"supports_parallel_function_calling": True,
|
||||
"supports_vision": True,
|
||||
}
|
||||
self.info = self.get_model_info(model)
|
||||
|
||||
# Are all needed keys/params available?
|
||||
res = self.validate_environment()
|
||||
self.missing_keys = res.get("missing_keys")
|
||||
self.keys_in_environment = res.get("keys_in_environment")
|
||||
|
||||
if self.info.get("max_input_tokens", 0) < 32 * 1024:
|
||||
max_input_tokens = self.info.get("max_input_tokens")
|
||||
if not max_input_tokens:
|
||||
max_input_tokens = 0
|
||||
if max_input_tokens < 32 * 1024:
|
||||
self.max_chat_history_tokens = 1024
|
||||
else:
|
||||
self.max_chat_history_tokens = 2 * 1024
|
||||
|
@ -339,6 +388,24 @@ class Model:
|
|||
else:
|
||||
self.get_weak_model(weak_model)
|
||||
|
||||
def get_model_info(self, model):
|
||||
# Try and do this quickly, without triggering the litellm import
|
||||
spec = importlib.util.find_spec("litellm")
|
||||
if spec:
|
||||
origin = Path(spec.origin)
|
||||
fname = origin.parent / "model_prices_and_context_window_backup.json"
|
||||
if fname.exists():
|
||||
data = json.loads(fname.read_text())
|
||||
info = data.get(model)
|
||||
if info:
|
||||
return info
|
||||
|
||||
# Do it the slow way...
|
||||
try:
|
||||
return litellm.get_model_info(model)
|
||||
except Exception:
|
||||
return dict()
|
||||
|
||||
def configure_model_settings(self, model):
|
||||
for ms in MODEL_SETTINGS:
|
||||
# direct match, or match "provider/<model>"
|
||||
|
@ -372,6 +439,15 @@ class Model:
|
|||
if "gpt-3.5" in model or "gpt-4" in model:
|
||||
self.reminder_as_sys_msg = True
|
||||
|
||||
if "anthropic" in model:
|
||||
self.can_prefill = True
|
||||
|
||||
if "3.5-sonnet" in model or "3-5-sonnet" in model:
|
||||
self.edit_format = "diff"
|
||||
self.use_repo_map = True
|
||||
self.examples_as_sys_msg = True
|
||||
self.can_prefill = True
|
||||
|
||||
# use the defaults
|
||||
if self.edit_format == "diff":
|
||||
self.use_repo_map = True
|
||||
|
@ -455,7 +531,25 @@ class Model:
|
|||
with Image.open(fname) as img:
|
||||
return img.size
|
||||
|
||||
def fast_validate_environment(self):
|
||||
"""Fast path for common models. Avoids forcing litellm import."""
|
||||
|
||||
model = self.name
|
||||
if model in OPENAI_MODELS:
|
||||
var = "OPENAI_API_KEY"
|
||||
elif model in ANTHROPIC_MODELS:
|
||||
var = "ANTHROPIC_API_KEY"
|
||||
else:
|
||||
return
|
||||
|
||||
if os.environ.get(var):
|
||||
return dict(keys_in_environment=[var], missing_keys=[])
|
||||
|
||||
def validate_environment(self):
|
||||
res = self.fast_validate_environment()
|
||||
if res:
|
||||
return res
|
||||
|
||||
# https://github.com/BerriAI/litellm/issues/3190
|
||||
|
||||
model = self.name
|
||||
|
|
|
@ -25,12 +25,14 @@ class GitRepo:
|
|||
models=None,
|
||||
attribute_author=True,
|
||||
attribute_committer=True,
|
||||
attribute_commit_message=False,
|
||||
):
|
||||
self.io = io
|
||||
self.models = models
|
||||
|
||||
self.attribute_author = attribute_author
|
||||
self.attribute_committer = attribute_committer
|
||||
self.attribute_commit_message = attribute_commit_message
|
||||
|
||||
if git_dname:
|
||||
check_fnames = [git_dname]
|
||||
|
@ -84,12 +86,15 @@ class GitRepo:
|
|||
else:
|
||||
commit_message = self.get_commit_message(diffs, context)
|
||||
|
||||
if aider_edits and self.attribute_commit_message:
|
||||
commit_message = "aider: " + commit_message
|
||||
|
||||
if not commit_message:
|
||||
commit_message = "(no commit message provided)"
|
||||
|
||||
full_commit_message = commit_message
|
||||
if context:
|
||||
full_commit_message += "\n\n# Aider chat conversation:\n\n" + context
|
||||
# if context:
|
||||
# full_commit_message += "\n\n# Aider chat conversation:\n\n" + context
|
||||
|
||||
cmd = ["-m", full_commit_message, "--no-verify"]
|
||||
if fnames:
|
||||
|
|
|
@ -8,7 +8,6 @@ from collections import Counter, defaultdict, namedtuple
|
|||
from importlib import resources
|
||||
from pathlib import Path
|
||||
|
||||
import networkx as nx
|
||||
from diskcache import Cache
|
||||
from grep_ast import TreeContext, filename_to_lang
|
||||
from pygments.lexers import guess_lexer_for_filename
|
||||
|
@ -71,7 +70,7 @@ class RepoMap:
|
|||
max_map_tokens = self.max_map_tokens
|
||||
|
||||
# With no files in the chat, give a bigger view of the entire repo
|
||||
MUL = 16
|
||||
MUL = 8
|
||||
padding = 4096
|
||||
if max_map_tokens and self.max_context_window:
|
||||
target = min(max_map_tokens * MUL, self.max_context_window - padding)
|
||||
|
@ -230,6 +229,8 @@ class RepoMap:
|
|||
)
|
||||
|
||||
def get_ranked_tags(self, chat_fnames, other_fnames, mentioned_fnames, mentioned_idents):
|
||||
import networkx as nx
|
||||
|
||||
defines = defaultdict(set)
|
||||
references = defaultdict(list)
|
||||
definitions = defaultdict(set)
|
||||
|
|
|
@ -3,10 +3,8 @@
|
|||
import re
|
||||
import sys
|
||||
|
||||
import httpx
|
||||
import playwright
|
||||
import pypandoc
|
||||
from bs4 import BeautifulSoup
|
||||
from playwright.sync_api import sync_playwright
|
||||
|
||||
from aider import __version__, urls
|
||||
|
@ -59,7 +57,6 @@ class Scraper:
|
|||
self.try_pandoc()
|
||||
|
||||
content = self.html_to_markdown(content)
|
||||
# content = html_to_text(content)
|
||||
|
||||
return content
|
||||
|
||||
|
@ -94,12 +91,12 @@ class Scraper:
|
|||
if self.playwright_available is not None:
|
||||
return
|
||||
|
||||
with sync_playwright() as p:
|
||||
try:
|
||||
try:
|
||||
with sync_playwright() as p:
|
||||
p.chromium.launch()
|
||||
self.playwright_available = True
|
||||
except Exception:
|
||||
self.playwright_available = False
|
||||
except Exception:
|
||||
self.playwright_available = False
|
||||
|
||||
def get_playwright_instructions(self):
|
||||
if self.playwright_available in (True, None):
|
||||
|
@ -111,6 +108,8 @@ class Scraper:
|
|||
return PLAYWRIGHT_INFO
|
||||
|
||||
def scrape_with_httpx(self, url):
|
||||
import httpx
|
||||
|
||||
headers = {"User-Agent": f"Mozilla./5.0 ({aider_user_agent})"}
|
||||
try:
|
||||
with httpx.Client(headers=headers) as client:
|
||||
|
@ -138,6 +137,8 @@ class Scraper:
|
|||
self.pandoc_available = True
|
||||
|
||||
def html_to_markdown(self, page_source):
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
soup = BeautifulSoup(page_source, "html.parser")
|
||||
soup = slimdown_html(soup)
|
||||
page_source = str(soup)
|
||||
|
@ -173,24 +174,6 @@ def slimdown_html(soup):
|
|||
return soup
|
||||
|
||||
|
||||
# Adapted from AutoGPT, MIT License
|
||||
#
|
||||
# https://github.com/Significant-Gravitas/AutoGPT/blob/fe0923ba6c9abb42ac4df79da580e8a4391e0418/autogpts/autogpt/autogpt/commands/web_selenium.py#L173
|
||||
|
||||
|
||||
def html_to_text(page_source: str) -> str:
|
||||
soup = BeautifulSoup(page_source, "html.parser")
|
||||
|
||||
for script in soup(["script", "style"]):
|
||||
script.extract()
|
||||
|
||||
text = soup.get_text()
|
||||
lines = (line.strip() for line in text.splitlines())
|
||||
chunks = (phrase.strip() for line in lines for phrase in line.split(" "))
|
||||
text = "\n".join(chunk for chunk in chunks if chunk)
|
||||
return text
|
||||
|
||||
|
||||
def main(url):
|
||||
scraper = Scraper()
|
||||
content = scraper.scrape(url)
|
||||
|
|
|
@ -2,11 +2,9 @@ import hashlib
|
|||
import json
|
||||
|
||||
import backoff
|
||||
import httpx
|
||||
import openai
|
||||
|
||||
from aider.dump import dump # noqa: F401
|
||||
from aider.litellm import litellm
|
||||
from aider.llm import litellm
|
||||
|
||||
# from diskcache import Cache
|
||||
|
||||
|
@ -16,39 +14,51 @@ CACHE = None
|
|||
# CACHE = Cache(CACHE_PATH)
|
||||
|
||||
|
||||
def should_giveup(e):
|
||||
if not hasattr(e, "status_code"):
|
||||
return False
|
||||
def lazy_litellm_retry_decorator(func):
|
||||
def wrapper(*args, **kwargs):
|
||||
import httpx
|
||||
|
||||
if type(e) in (
|
||||
httpx.ConnectError,
|
||||
httpx.RemoteProtocolError,
|
||||
httpx.ReadTimeout,
|
||||
):
|
||||
return False
|
||||
def should_giveup(e):
|
||||
if not hasattr(e, "status_code"):
|
||||
return False
|
||||
|
||||
return not litellm._should_retry(e.status_code)
|
||||
if type(e) in (
|
||||
httpx.ConnectError,
|
||||
httpx.RemoteProtocolError,
|
||||
httpx.ReadTimeout,
|
||||
):
|
||||
return False
|
||||
|
||||
return not litellm._should_retry(e.status_code)
|
||||
|
||||
decorated_func = backoff.on_exception(
|
||||
backoff.expo,
|
||||
(
|
||||
httpx.ConnectError,
|
||||
httpx.RemoteProtocolError,
|
||||
httpx.ReadTimeout,
|
||||
litellm.exceptions.APIConnectionError,
|
||||
litellm.exceptions.APIError,
|
||||
litellm.exceptions.RateLimitError,
|
||||
litellm.exceptions.ServiceUnavailableError,
|
||||
litellm.exceptions.Timeout,
|
||||
litellm.llms.anthropic.AnthropicError,
|
||||
),
|
||||
giveup=should_giveup,
|
||||
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
|
||||
|
||||
|
||||
@backoff.on_exception(
|
||||
backoff.expo,
|
||||
(
|
||||
httpx.ConnectError,
|
||||
httpx.RemoteProtocolError,
|
||||
httpx.ReadTimeout,
|
||||
litellm.exceptions.APIConnectionError,
|
||||
litellm.exceptions.APIError,
|
||||
litellm.exceptions.RateLimitError,
|
||||
litellm.exceptions.ServiceUnavailableError,
|
||||
litellm.exceptions.Timeout,
|
||||
),
|
||||
giveup=should_giveup,
|
||||
max_time=60,
|
||||
on_backoff=lambda details: print(
|
||||
f"{details.get('exception','Exception')}\nRetry in {details['wait']:.1f} seconds."
|
||||
),
|
||||
)
|
||||
@lazy_litellm_retry_decorator
|
||||
def send_with_retries(model_name, messages, functions, stream, temperature=0):
|
||||
from aider.llm import litellm
|
||||
|
||||
kwargs = dict(
|
||||
model=model_name,
|
||||
messages=messages,
|
||||
|
@ -85,5 +95,5 @@ def simple_send_with_retries(model_name, messages):
|
|||
stream=False,
|
||||
)
|
||||
return response.choices[0].message.content
|
||||
except (AttributeError, openai.BadRequestError):
|
||||
except (AttributeError, litellm.exceptions.BadRequestError):
|
||||
return
|
||||
|
|
|
@ -1,16 +1,15 @@
|
|||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from unittest.mock import MagicMock, patch
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import git
|
||||
import openai
|
||||
|
||||
from aider.coders import Coder
|
||||
from aider.dump import dump # noqa: F401
|
||||
from aider.io import InputOutput
|
||||
from aider.models import Model
|
||||
from aider.utils import ChdirTemporaryDirectory, GitTemporaryDirectory
|
||||
from aider.utils import GitTemporaryDirectory
|
||||
|
||||
|
||||
class TestCoder(unittest.TestCase):
|
||||
|
@ -220,7 +219,7 @@ class TestCoder(unittest.TestCase):
|
|||
files = [file1, file2]
|
||||
|
||||
# Initialize the Coder object with the mocked IO and mocked repo
|
||||
coder = Coder.create(self.GPT35, None, io=InputOutput(), fnames=files)
|
||||
coder = Coder.create(self.GPT35, None, io=InputOutput(), fnames=files, pretty=False)
|
||||
|
||||
def mock_send(*args, **kwargs):
|
||||
coder.partial_response_content = "ok"
|
||||
|
@ -247,7 +246,7 @@ class TestCoder(unittest.TestCase):
|
|||
files = [file1, file2]
|
||||
|
||||
# Initialize the Coder object with the mocked IO and mocked repo
|
||||
coder = Coder.create(self.GPT35, None, io=InputOutput(), fnames=files)
|
||||
coder = Coder.create(self.GPT35, None, io=InputOutput(), fnames=files, pretty=False)
|
||||
|
||||
def mock_send(*args, **kwargs):
|
||||
coder.partial_response_content = "ok"
|
||||
|
@ -330,25 +329,6 @@ class TestCoder(unittest.TestCase):
|
|||
# both files should still be here
|
||||
self.assertEqual(len(coder.abs_fnames), 2)
|
||||
|
||||
def test_run_with_invalid_request_error(self):
|
||||
with ChdirTemporaryDirectory():
|
||||
# Mock the IO object
|
||||
mock_io = MagicMock()
|
||||
|
||||
# Initialize the Coder object with the mocked IO and mocked repo
|
||||
coder = Coder.create(self.GPT35, None, mock_io)
|
||||
|
||||
# Call the run method and assert that InvalidRequestError is raised
|
||||
with self.assertRaises(openai.BadRequestError):
|
||||
with patch("litellm.completion") as Mock:
|
||||
Mock.side_effect = openai.BadRequestError(
|
||||
message="Invalid request",
|
||||
response=MagicMock(),
|
||||
body=None,
|
||||
)
|
||||
|
||||
coder.run(with_message="hi")
|
||||
|
||||
def test_new_file_edit_one_commit(self):
|
||||
"""A new file shouldn't get pre-committed before the GPT edit commit"""
|
||||
with GitTemporaryDirectory():
|
||||
|
@ -357,7 +337,7 @@ class TestCoder(unittest.TestCase):
|
|||
fname = Path("file.txt")
|
||||
|
||||
io = InputOutput(yes=True)
|
||||
coder = Coder.create(self.GPT35, "diff", io=io, fnames=[str(fname)])
|
||||
coder = Coder.create(self.GPT35, "diff", io=io, fnames=[str(fname)], pretty=False)
|
||||
|
||||
self.assertTrue(fname.exists())
|
||||
|
||||
|
@ -414,7 +394,9 @@ new
|
|||
fname1.write_text("ONE\n")
|
||||
|
||||
io = InputOutput(yes=True)
|
||||
coder = Coder.create(self.GPT35, "diff", io=io, fnames=[str(fname1), str(fname2)])
|
||||
coder = Coder.create(
|
||||
self.GPT35, "diff", io=io, fnames=[str(fname1), str(fname2)], pretty=False
|
||||
)
|
||||
|
||||
def mock_send(*args, **kwargs):
|
||||
coder.partial_response_content = f"""
|
||||
|
@ -467,7 +449,7 @@ TWO
|
|||
fname2.write_text("OTHER\n")
|
||||
|
||||
io = InputOutput(yes=True)
|
||||
coder = Coder.create(self.GPT35, "diff", io=io, fnames=[str(fname)])
|
||||
coder = Coder.create(self.GPT35, "diff", io=io, fnames=[str(fname)], pretty=False)
|
||||
|
||||
def mock_send(*args, **kwargs):
|
||||
coder.partial_response_content = f"""
|
||||
|
@ -545,7 +527,7 @@ three
|
|||
repo.git.commit("-m", "initial")
|
||||
|
||||
io = InputOutput(yes=True)
|
||||
coder = Coder.create(self.GPT35, "diff", io=io, fnames=[str(fname)])
|
||||
coder = Coder.create(self.GPT35, "diff", io=io, fnames=[str(fname)], pretty=False)
|
||||
|
||||
def mock_send(*args, **kwargs):
|
||||
coder.partial_response_content = f"""
|
||||
|
|
|
@ -523,8 +523,6 @@ class TestCommands(TestCase):
|
|||
other_path.write_text("other content")
|
||||
repo.git.add(str(other_path))
|
||||
|
||||
os.environ["GIT_AUTHOR_NAME"] = "Foo (aider)"
|
||||
|
||||
# Create and commit a file
|
||||
filename = "test_file.txt"
|
||||
file_path = Path(repo_dir) / filename
|
||||
|
@ -536,8 +534,6 @@ class TestCommands(TestCase):
|
|||
repo.git.add(filename)
|
||||
repo.git.commit("-m", "second commit")
|
||||
|
||||
del os.environ["GIT_AUTHOR_NAME"]
|
||||
|
||||
# Store the commit hash
|
||||
last_commit_hash = repo.head.commit.hexsha[:7]
|
||||
coder.last_aider_commit_hash = last_commit_hash
|
||||
|
|
|
@ -297,7 +297,7 @@ These changes replace the `subprocess.run` patches with `subprocess.check_output
|
|||
files = [file1]
|
||||
|
||||
# Initialize the Coder object with the mocked IO and mocked repo
|
||||
coder = Coder.create(self.GPT35, "diff", io=InputOutput(), fnames=files)
|
||||
coder = Coder.create(self.GPT35, "diff", io=InputOutput(), fnames=files, pretty=False)
|
||||
|
||||
def mock_send(*args, **kwargs):
|
||||
coder.partial_response_content = f"""
|
||||
|
@ -340,6 +340,7 @@ new
|
|||
io=InputOutput(dry_run=True),
|
||||
fnames=files,
|
||||
dry_run=True,
|
||||
pretty=False,
|
||||
)
|
||||
|
||||
def mock_send(*args, **kwargs):
|
||||
|
|
|
@ -3,7 +3,7 @@ from unittest.mock import MagicMock, patch
|
|||
|
||||
import httpx
|
||||
|
||||
from aider.litellm import litellm
|
||||
from aider.llm import litellm
|
||||
from aider.sendchat import send_with_retries
|
||||
|
||||
|
||||
|
|
|
@ -288,7 +288,9 @@ after b
|
|||
files = [file1]
|
||||
|
||||
# Initialize the Coder object with the mocked IO and mocked repo
|
||||
coder = Coder.create(self.GPT35, "whole", io=InputOutput(), fnames=files)
|
||||
coder = Coder.create(
|
||||
self.GPT35, "whole", io=InputOutput(), fnames=files, stream=False, pretty=False
|
||||
)
|
||||
|
||||
# no trailing newline so the response content below doesn't add ANOTHER newline
|
||||
new_content = "new\ntwo\nthree"
|
||||
|
|
|
@ -1,12 +1,20 @@
|
|||
import sys
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
import packaging.version
|
||||
import requests
|
||||
|
||||
import aider
|
||||
|
||||
|
||||
def check_version(print_cmd):
|
||||
fname = Path.home() / ".aider/versioncheck"
|
||||
day = 60 * 60 * 24
|
||||
if fname.exists() and time.time() - fname.stat().st_mtime < day:
|
||||
return
|
||||
|
||||
import requests
|
||||
|
||||
try:
|
||||
response = requests.get("https://pypi.org/pypi/aider-chat/json")
|
||||
data = response.json()
|
||||
|
@ -27,6 +35,9 @@ def check_version(print_cmd):
|
|||
else:
|
||||
print_cmd(f"{py} -m pip install --upgrade aider-chat")
|
||||
|
||||
if not fname.parent.exists():
|
||||
fname.parent.mkdir()
|
||||
fname.touch()
|
||||
return is_update_available
|
||||
except Exception as err:
|
||||
print_cmd(f"Error checking pypi for new version: {err}")
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
import math
|
||||
import os
|
||||
import queue
|
||||
import tempfile
|
||||
import time
|
||||
|
||||
import numpy as np
|
||||
|
||||
from aider.litellm import litellm
|
||||
from aider.llm import litellm
|
||||
|
||||
try:
|
||||
import soundfile as sf
|
||||
|
@ -41,6 +40,8 @@ class Voice:
|
|||
|
||||
def callback(self, indata, frames, time, status):
|
||||
"""This is called (from a separate thread) for each audio block."""
|
||||
import numpy as np
|
||||
|
||||
rms = np.sqrt(np.mean(indata**2))
|
||||
self.max_rms = max(self.max_rms, rms)
|
||||
self.min_rms = min(self.min_rms, rms)
|
||||
|
@ -55,7 +56,7 @@ class Voice:
|
|||
|
||||
def get_prompt(self):
|
||||
num = 10
|
||||
if np.isnan(self.pct) or self.pct < self.threshold:
|
||||
if math.isnan(self.pct) or self.pct < self.threshold:
|
||||
cnt = 0
|
||||
else:
|
||||
cnt = int(self.pct * 10)
|
||||
|
@ -78,7 +79,7 @@ class Voice:
|
|||
filename = tempfile.mktemp(suffix=".wav")
|
||||
|
||||
try:
|
||||
sample_rate = int(self.sd.query_devices(None, 'input')['default_samplerate'])
|
||||
sample_rate = int(self.sd.query_devices(None, "input")["default_samplerate"])
|
||||
except (TypeError, ValueError):
|
||||
sample_rate = 16000 # fallback to 16kHz if unable to query device
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# pip-compile --output-file=dev-requirements.txt dev-requirements.in
|
||||
# pip-compile --output-file=dev-requirements.txt dev-requirements.in --upgrade
|
||||
#
|
||||
pytest
|
||||
pip-tools
|
||||
|
|
|
@ -10,7 +10,7 @@ babel==2.15.0
|
|||
# via sphinx
|
||||
build==1.2.1
|
||||
# via pip-tools
|
||||
certifi==2024.2.2
|
||||
certifi==2024.6.2
|
||||
# via requests
|
||||
cfgv==3.4.0
|
||||
# via pre-commit
|
||||
|
@ -36,9 +36,9 @@ docutils==0.20.1
|
|||
# via
|
||||
# sphinx
|
||||
# sphinx-rtd-theme
|
||||
filelock==3.14.0
|
||||
filelock==3.15.4
|
||||
# via virtualenv
|
||||
fonttools==4.51.0
|
||||
fonttools==4.53.0
|
||||
# via matplotlib
|
||||
identify==2.5.36
|
||||
# via pre-commit
|
||||
|
@ -54,7 +54,7 @@ jinja2==3.1.4
|
|||
# via sphinx
|
||||
kiwisolver==1.4.5
|
||||
# via matplotlib
|
||||
lox==0.11.0
|
||||
lox==0.12.0
|
||||
# via -r dev-requirements.in
|
||||
markdown-it-py==3.0.0
|
||||
# via rich
|
||||
|
@ -66,14 +66,14 @@ mdurl==0.1.2
|
|||
# via markdown-it-py
|
||||
multiprocess==0.70.16
|
||||
# via pathos
|
||||
nodeenv==1.8.0
|
||||
nodeenv==1.9.1
|
||||
# via pre-commit
|
||||
numpy==1.26.4
|
||||
numpy==2.0.0
|
||||
# via
|
||||
# contourpy
|
||||
# matplotlib
|
||||
# pandas
|
||||
packaging==24.0
|
||||
packaging==24.1
|
||||
# via
|
||||
# build
|
||||
# matplotlib
|
||||
|
@ -107,7 +107,7 @@ pyproject-hooks==1.1.0
|
|||
# via
|
||||
# build
|
||||
# pip-tools
|
||||
pytest==8.2.1
|
||||
pytest==8.2.2
|
||||
# via -r dev-requirements.in
|
||||
python-dateutil==2.9.0.post0
|
||||
# via
|
||||
|
@ -117,7 +117,7 @@ pytz==2024.1
|
|||
# via pandas
|
||||
pyyaml==6.0.1
|
||||
# via pre-commit
|
||||
requests==2.32.0
|
||||
requests==2.32.3
|
||||
# via sphinx
|
||||
rich==13.7.1
|
||||
# via typer
|
||||
|
@ -149,13 +149,13 @@ sphinxcontrib-serializinghtml==1.1.10
|
|||
# via sphinx
|
||||
typer==0.12.3
|
||||
# via -r dev-requirements.in
|
||||
typing-extensions==4.11.0
|
||||
typing-extensions==4.12.2
|
||||
# via typer
|
||||
tzdata==2024.1
|
||||
# via pandas
|
||||
urllib3==2.2.1
|
||||
urllib3==2.2.2
|
||||
# via requests
|
||||
virtualenv==20.26.2
|
||||
virtualenv==20.26.3
|
||||
# via pre-commit
|
||||
wheel==0.43.0
|
||||
# via pip-tools
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# pip-compile requirements.in
|
||||
# pip-compile requirements.in --upgrade
|
||||
#
|
||||
configargparse
|
||||
GitPython
|
||||
|
|
|
@ -62,7 +62,7 @@ frozenlist==1.4.1
|
|||
# via
|
||||
# aiohttp
|
||||
# aiosignal
|
||||
fsspec==2024.6.0
|
||||
fsspec==2024.6.1
|
||||
# via huggingface-hub
|
||||
gitdb==4.0.11
|
||||
# via gitpython
|
||||
|
@ -70,14 +70,14 @@ gitpython==3.1.43
|
|||
# via
|
||||
# -r requirements.in
|
||||
# streamlit
|
||||
google-ai-generativelanguage==0.6.5
|
||||
google-ai-generativelanguage==0.6.6
|
||||
# via google-generativeai
|
||||
google-api-core[grpc]==2.19.1
|
||||
# via
|
||||
# google-ai-generativelanguage
|
||||
# google-api-python-client
|
||||
# google-generativeai
|
||||
google-api-python-client==2.134.0
|
||||
google-api-python-client==2.135.0
|
||||
# via google-generativeai
|
||||
google-auth==2.30.0
|
||||
# via
|
||||
|
@ -88,7 +88,7 @@ google-auth==2.30.0
|
|||
# google-generativeai
|
||||
google-auth-httplib2==0.2.0
|
||||
# via google-api-python-client
|
||||
google-generativeai==0.7.0
|
||||
google-generativeai==0.7.1
|
||||
# via -r requirements.in
|
||||
googleapis-common-protos==1.63.2
|
||||
# via
|
||||
|
@ -139,7 +139,7 @@ jsonschema==4.22.0
|
|||
# altair
|
||||
jsonschema-specifications==2023.12.1
|
||||
# via jsonschema
|
||||
litellm==1.40.26
|
||||
litellm==1.41.0
|
||||
# via -r requirements.in
|
||||
markdown-it-py==3.0.0
|
||||
# via rich
|
||||
|
@ -164,7 +164,7 @@ numpy==2.0.0
|
|||
# pydeck
|
||||
# scipy
|
||||
# streamlit
|
||||
openai==1.35.3
|
||||
openai==1.35.7
|
||||
# via
|
||||
# -r requirements.in
|
||||
# litellm
|
||||
|
|
|
@ -6,7 +6,8 @@ docker run \
|
|||
-v "$PWD/website:/site" \
|
||||
-p 4000:4000 \
|
||||
-e HISTFILE=/site/.bash_history \
|
||||
--entrypoint /bin/bash \
|
||||
-it \
|
||||
my-jekyll-site
|
||||
|
||||
# --entrypoint /bin/bash \
|
||||
|
||||
|
|
|
@ -14,8 +14,8 @@ cog $ARG \
|
|||
README.md \
|
||||
website/index.md \
|
||||
website/HISTORY.md \
|
||||
website/docs/dotenv.md \
|
||||
website/docs/commands.md \
|
||||
website/docs/languages.md \
|
||||
website/docs/options.md \
|
||||
website/docs/aider_conf.md
|
||||
website/docs/config/dotenv.md \
|
||||
website/docs/config/options.md \
|
||||
website/docs/config/aider_conf.md
|
||||
|
|
|
@ -12,17 +12,39 @@ cog.out(text)
|
|||
|
||||
# Release history
|
||||
|
||||
### v0.40.5
|
||||
### Aider v0.42.0
|
||||
|
||||
- Performance release:
|
||||
- 5X faster launch!
|
||||
- Faster auto-complete in large git repos (users report ~100X speedup)!
|
||||
|
||||
### Aider v0.41.0
|
||||
|
||||
- [Allow Claude 3.5 Sonnet to stream back >4k tokens!](https://aider.chat/2024/07/01/sonnet-not-lazy.html)
|
||||
- It is the first model capable of writing such large coherent, useful code edits.
|
||||
- Do large refactors or generate multiple files of new code in one go.
|
||||
- Aider now uses `claude-3-5-sonnet-20240620` by default if `ANTHROPIC_API_KEY` is set in the environment.
|
||||
- [Enabled image support](https://aider.chat/docs/images-urls.html) for 3.5 Sonnet and for GPT-4o & 3.5 Sonnet via OpenRouter (by @yamitzky).
|
||||
- Added `--attribute-commit-message` to prefix aider's commit messages with "aider:".
|
||||
- Fixed regression in quality of one-line commit messages.
|
||||
- Automatically retry on Anthropic `overloaded_error`.
|
||||
- Bumped dependency versions.
|
||||
|
||||
### Aider v0.40.6
|
||||
|
||||
- Fixed `/undo` so it works regardless of `--attribute` settings.
|
||||
|
||||
### Aider v0.40.5
|
||||
|
||||
- Bump versions to pickup latest litellm to fix streaming issue with Gemini
|
||||
- https://github.com/BerriAI/litellm/issues/4408
|
||||
|
||||
### v0.40.1
|
||||
### Aider v0.40.1
|
||||
|
||||
- Improved context awareness of repomap.
|
||||
- Restored proper `--help` functionality.
|
||||
|
||||
### v0.40.0
|
||||
### Aider v0.40.0
|
||||
|
||||
- Improved prompting to discourage Sonnet from wasting tokens emitting unchanging code (#705).
|
||||
- Improved error info for token limit errors.
|
||||
|
@ -31,14 +53,14 @@ cog.out(text)
|
|||
- Improved invocation of flake8 linter for python code.
|
||||
|
||||
|
||||
### v0.39.0
|
||||
### Aider v0.39.0
|
||||
|
||||
- Use `--sonnet` for Claude 3.5 Sonnet, which is the top model on [aider's LLM code editing leaderboard](https://aider.chat/docs/leaderboards/#claude-35-sonnet-takes-the-top-spot).
|
||||
- All `AIDER_xxx` environment variables can now be set in `.env` (by @jpshack-at-palomar).
|
||||
- Use `--llm-history-file` to log raw messages sent to the LLM (by @daniel-vainsencher).
|
||||
- Commit messages are no longer prefixed with "aider:". Instead the git author and committer names have "(aider)" added.
|
||||
|
||||
### v0.38.0
|
||||
### Aider v0.38.0
|
||||
|
||||
- Use `--vim` for [vim keybindings](https://aider.chat/docs/commands.html#vi) in the chat.
|
||||
- [Add LLM metadata](https://aider.chat/docs/llms/warnings.html#specifying-context-window-size-and-token-costs) via `.aider.models.json` file (by @caseymcc).
|
||||
|
@ -49,7 +71,7 @@ cog.out(text)
|
|||
- Documentation updates, moved into website/ subdir.
|
||||
- Moved tests/ into aider/tests/.
|
||||
|
||||
### v0.37.0
|
||||
### Aider v0.37.0
|
||||
|
||||
- Repo map is now optimized based on text of chat history as well as files added to chat.
|
||||
- Improved prompts when no files have been added to chat to solicit LLM file suggestions.
|
||||
|
@ -60,7 +82,7 @@ cog.out(text)
|
|||
- Detect supported audio sample rates for `/voice`.
|
||||
- Other small bug fixes.
|
||||
|
||||
### v0.36.0
|
||||
### Aider v0.36.0
|
||||
|
||||
- [Aider can now lint your code and fix any errors](https://aider.chat/2024/05/22/linting.html).
|
||||
- Aider automatically lints and fixes after every LLM edit.
|
||||
|
@ -73,7 +95,7 @@ cog.out(text)
|
|||
- Aider will automatically attempt to fix any test failures.
|
||||
|
||||
|
||||
### v0.35.0
|
||||
### Aider v0.35.0
|
||||
|
||||
- Aider now uses GPT-4o by default.
|
||||
- GPT-4o tops the [aider LLM code editing leaderboard](https://aider.chat/docs/leaderboards/) at 72.9%, versus 68.4% for Opus.
|
||||
|
@ -82,7 +104,7 @@ cog.out(text)
|
|||
- Improved reflection feedback to LLMs using the diff edit format.
|
||||
- Improved retries on `httpx` errors.
|
||||
|
||||
### v0.34.0
|
||||
### Aider v0.34.0
|
||||
|
||||
- Updated prompting to use more natural phrasing about files, the git repo, etc. Removed reliance on read-write/read-only terminology.
|
||||
- Refactored prompting to unify some phrasing across edit formats.
|
||||
|
@ -92,11 +114,11 @@ cog.out(text)
|
|||
- Bugfix: catch and retry on all litellm exceptions.
|
||||
|
||||
|
||||
### v0.33.0
|
||||
### Aider v0.33.0
|
||||
|
||||
- Added native support for [Deepseek models](https://aider.chat/docs/llms.html#deepseek) using `DEEPSEEK_API_KEY` and `deepseek/deepseek-chat`, etc rather than as a generic OpenAI compatible API.
|
||||
|
||||
### v0.32.0
|
||||
### Aider v0.32.0
|
||||
|
||||
- [Aider LLM code editing leaderboards](https://aider.chat/docs/leaderboards/) that rank popular models according to their ability to edit code.
|
||||
- Leaderboards include GPT-3.5/4 Turbo, Opus, Sonnet, Gemini 1.5 Pro, Llama 3, Deepseek Coder & Command-R+.
|
||||
|
@ -105,31 +127,31 @@ cog.out(text)
|
|||
- Improved retry handling on errors from model APIs.
|
||||
- Benchmark outputs results in YAML, compatible with leaderboard.
|
||||
|
||||
### v0.31.0
|
||||
### Aider v0.31.0
|
||||
|
||||
- [Aider is now also AI pair programming in your browser!](https://aider.chat/2024/05/02/browser.html) Use the `--browser` switch to launch an experimental browser based version of aider.
|
||||
- Switch models during the chat with `/model <name>` and search the list of available models with `/models <query>`.
|
||||
|
||||
### v0.30.1
|
||||
### Aider v0.30.1
|
||||
|
||||
- Adding missing `google-generativeai` dependency
|
||||
|
||||
### v0.30.0
|
||||
### Aider v0.30.0
|
||||
|
||||
- Added [Gemini 1.5 Pro](https://aider.chat/docs/llms.html#free-models) as a recommended free model.
|
||||
- Allow repo map for "whole" edit format.
|
||||
- Added `--models <MODEL-NAME>` to search the available models.
|
||||
- Added `--no-show-model-warnings` to silence model warnings.
|
||||
|
||||
### v0.29.2
|
||||
### Aider v0.29.2
|
||||
|
||||
- Improved [model warnings](https://aider.chat/docs/llms.html#model-warnings) for unknown or unfamiliar models
|
||||
|
||||
### v0.29.1
|
||||
### Aider v0.29.1
|
||||
|
||||
- Added better support for groq/llama3-70b-8192
|
||||
|
||||
### v0.29.0
|
||||
### Aider v0.29.0
|
||||
|
||||
- Added support for [directly connecting to Anthropic, Cohere, Gemini and many other LLM providers](https://aider.chat/docs/llms.html).
|
||||
- Added `--weak-model <model-name>` which allows you to specify which model to use for commit messages and chat history summarization.
|
||||
|
@ -143,32 +165,32 @@ cog.out(text)
|
|||
- Fixed crash when operating in a repo in a detached HEAD state.
|
||||
- Fix: Use the same default model in CLI and python scripting.
|
||||
|
||||
### v0.28.0
|
||||
### Aider v0.28.0
|
||||
|
||||
- Added support for new `gpt-4-turbo-2024-04-09` and `gpt-4-turbo` models.
|
||||
- Benchmarked at 61.7% on Exercism benchmark, comparable to `gpt-4-0613` and worse than the `gpt-4-preview-XXXX` models. See [recent Exercism benchmark results](https://aider.chat/2024/03/08/claude-3.html).
|
||||
- Benchmarked at 34.1% on the refactoring/laziness benchmark, significantly worse than the `gpt-4-preview-XXXX` models. See [recent refactor bencmark results](https://aider.chat/2024/01/25/benchmarks-0125.html).
|
||||
- Aider continues to default to `gpt-4-1106-preview` as it performs best on both benchmarks, and significantly better on the refactoring/laziness benchmark.
|
||||
|
||||
### v0.27.0
|
||||
### Aider v0.27.0
|
||||
|
||||
- Improved repomap support for typescript, by @ryanfreckleton.
|
||||
- Bugfix: Only /undo the files which were part of the last commit, don't stomp other dirty files
|
||||
- Bugfix: Show clear error message when OpenAI API key is not set.
|
||||
- Bugfix: Catch error for obscure languages without tags.scm file.
|
||||
|
||||
### v0.26.1
|
||||
### Aider v0.26.1
|
||||
|
||||
- Fixed bug affecting parsing of git config in some environments.
|
||||
|
||||
### v0.26.0
|
||||
### Aider v0.26.0
|
||||
|
||||
- Use GPT-4 Turbo by default.
|
||||
- Added `-3` and `-4` switches to use GPT 3.5 or GPT-4 (non-Turbo).
|
||||
- Bug fix to avoid reflecting local git errors back to GPT.
|
||||
- Improved logic for opening git repo on launch.
|
||||
|
||||
### v0.25.0
|
||||
### Aider v0.25.0
|
||||
|
||||
- Issue a warning if user adds too much code to the chat.
|
||||
- https://aider.chat/docs/faq.html#how-can-i-add-all-the-files-to-the-chat
|
||||
|
@ -178,18 +200,18 @@ cog.out(text)
|
|||
- Show the user a FAQ link if edits fail to apply.
|
||||
- Made past articles part of https://aider.chat/blog/
|
||||
|
||||
### v0.24.1
|
||||
### Aider v0.24.1
|
||||
|
||||
- Fixed bug with cost computations when --no-steam in effect
|
||||
|
||||
### v0.24.0
|
||||
### Aider v0.24.0
|
||||
|
||||
- New `/web <url>` command which scrapes the url, turns it into fairly clean markdown and adds it to the chat.
|
||||
- Updated all OpenAI model names, pricing info
|
||||
- Default GPT 3.5 model is now `gpt-3.5-turbo-0125`.
|
||||
- Bugfix to the `!` alias for `/run`.
|
||||
|
||||
### v0.23.0
|
||||
### Aider v0.23.0
|
||||
|
||||
- Added support for `--model gpt-4-0125-preview` and OpenAI's alias `--model gpt-4-turbo-preview`. The `--4turbo` switch remains an alias for `--model gpt-4-1106-preview` at this time.
|
||||
- New `/test` command that runs a command and adds the output to the chat on non-zero exit status.
|
||||
|
@ -199,25 +221,25 @@ cog.out(text)
|
|||
- Added `--openrouter` as a shortcut for `--openai-api-base https://openrouter.ai/api/v1`
|
||||
- Fixed bug preventing use of env vars `OPENAI_API_BASE, OPENAI_API_TYPE, OPENAI_API_VERSION, OPENAI_API_DEPLOYMENT_ID`.
|
||||
|
||||
### v0.22.0
|
||||
### Aider v0.22.0
|
||||
|
||||
- Improvements for unified diff editing format.
|
||||
- Added ! as an alias for /run.
|
||||
- Autocomplete for /add and /drop now properly quotes filenames with spaces.
|
||||
- The /undo command asks GPT not to just retry reverted edit.
|
||||
|
||||
### v0.21.1
|
||||
### Aider v0.21.1
|
||||
|
||||
- Bugfix for unified diff editing format.
|
||||
- Added --4turbo and --4 aliases for --4-turbo.
|
||||
|
||||
### v0.21.0
|
||||
### Aider v0.21.0
|
||||
|
||||
- Support for python 3.12.
|
||||
- Improvements to unified diff editing format.
|
||||
- New `--check-update` arg to check if updates are available and exit with status code.
|
||||
|
||||
### v0.20.0
|
||||
### Aider v0.20.0
|
||||
|
||||
- Add images to the chat to automatically use GPT-4 Vision, by @joshuavial
|
||||
|
||||
|
@ -225,22 +247,22 @@ cog.out(text)
|
|||
- Improved unicode encoding for `/run` command output, by @ctoth
|
||||
- Prevent false auto-commits on Windows, by @ctoth
|
||||
|
||||
### v0.19.1
|
||||
### Aider v0.19.1
|
||||
|
||||
- Removed stray debug output.
|
||||
|
||||
### v0.19.0
|
||||
### Aider v0.19.0
|
||||
|
||||
- [Significantly reduced "lazy" coding from GPT-4 Turbo due to new unified diff edit format](https://aider.chat/docs/unified-diffs.html)
|
||||
- Score improves from 20% to 61% on new "laziness benchmark".
|
||||
- Aider now uses unified diffs by default for `gpt-4-1106-preview`.
|
||||
- New `--4-turbo` command line switch as a shortcut for `--model gpt-4-1106-preview`.
|
||||
|
||||
### v0.18.1
|
||||
### Aider v0.18.1
|
||||
|
||||
- Upgraded to new openai python client v1.3.7.
|
||||
|
||||
### v0.18.0
|
||||
### Aider v0.18.0
|
||||
|
||||
- Improved prompting for both GPT-4 and GPT-4 Turbo.
|
||||
- Far fewer edit errors from GPT-4 Turbo (`gpt-4-1106-preview`).
|
||||
|
@ -248,7 +270,7 @@ cog.out(text)
|
|||
- Fixed bug where in-chat files were marked as both read-only and ready-write, sometimes confusing GPT.
|
||||
- Fixed bug to properly handle repos with submodules.
|
||||
|
||||
### v0.17.0
|
||||
### Aider v0.17.0
|
||||
|
||||
- Support for OpenAI's new 11/06 models:
|
||||
- gpt-4-1106-preview with 128k context window
|
||||
|
@ -260,19 +282,19 @@ cog.out(text)
|
|||
- Fixed crash bug when `/add` used on file matching `.gitignore`
|
||||
- Fixed misc bugs to catch and handle unicode decoding errors.
|
||||
|
||||
### v0.16.3
|
||||
### Aider v0.16.3
|
||||
|
||||
- Fixed repo-map support for C#.
|
||||
|
||||
### v0.16.2
|
||||
### Aider v0.16.2
|
||||
|
||||
- Fixed docker image.
|
||||
|
||||
### v0.16.1
|
||||
### Aider v0.16.1
|
||||
|
||||
- Updated tree-sitter dependencies to streamline the pip install process
|
||||
|
||||
### v0.16.0
|
||||
### Aider v0.16.0
|
||||
|
||||
- [Improved repository map using tree-sitter](https://aider.chat/docs/repomap.html)
|
||||
- Switched from "edit block" to "search/replace block", which reduced malformed edit blocks. [Benchmarked](https://aider.chat/docs/benchmarks.html) at 66.2%, no regression.
|
||||
|
@ -280,21 +302,21 @@ cog.out(text)
|
|||
- Bugfix to properly handle malformed `/add` wildcards.
|
||||
|
||||
|
||||
### v0.15.0
|
||||
### Aider v0.15.0
|
||||
|
||||
- Added support for `.aiderignore` file, which instructs aider to ignore parts of the git repo.
|
||||
- New `--commit` cmd line arg, which just commits all pending changes with a sensible commit message generated by gpt-3.5.
|
||||
- Added universal ctags and multiple architectures to the [aider docker image](https://aider.chat/docs/docker.html)
|
||||
- Added universal ctags and multiple architectures to the [aider docker image](https://aider.chat/docs/install/docker.html)
|
||||
- `/run` and `/git` now accept full shell commands, like: `/run (cd subdir; ls)`
|
||||
- Restored missing `--encoding` cmd line switch.
|
||||
|
||||
### v0.14.2
|
||||
### Aider v0.14.2
|
||||
|
||||
- Easily [run aider from a docker image](https://aider.chat/docs/docker.html)
|
||||
- Easily [run aider from a docker image](https://aider.chat/docs/install/docker.html)
|
||||
- Fixed bug with chat history summarization.
|
||||
- Fixed bug if `soundfile` package not available.
|
||||
|
||||
### v0.14.1
|
||||
### Aider v0.14.1
|
||||
|
||||
- /add and /drop handle absolute filenames and quoted filenames
|
||||
- /add checks to be sure files are within the git repo (or root)
|
||||
|
@ -302,14 +324,14 @@ cog.out(text)
|
|||
- Fixed /add bug in when aider launched in repo subdir
|
||||
- Show models supported by api/key if requested model isn't available
|
||||
|
||||
### v0.14.0
|
||||
### 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)
|
||||
- Aider now requires Python >= 3.9
|
||||
|
||||
|
||||
### v0.13.0
|
||||
### Aider v0.13.0
|
||||
|
||||
- [Only git commit dirty files that GPT tries to edit](https://aider.chat/docs/faq.html#how-did-v0130-change-git-usage)
|
||||
- Send chat history as prompt/context for Whisper voice transcription
|
||||
|
@ -317,14 +339,14 @@ cog.out(text)
|
|||
- Late-bind importing `sounddevice`, as it was slowing down aider startup
|
||||
- Improved --foo/--no-foo switch handling for command line and yml config settings
|
||||
|
||||
### v0.12.0
|
||||
### Aider v0.12.0
|
||||
|
||||
- [Voice-to-code](https://aider.chat/docs/voice.html) support, which allows you to code with your voice.
|
||||
- Fixed bug where /diff was causing crash.
|
||||
- Improved prompting for gpt-4, refactor of editblock coder.
|
||||
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 63.2% for gpt-4/diff, no regression.
|
||||
|
||||
### v0.11.1
|
||||
### Aider v0.11.1
|
||||
|
||||
- Added a progress bar when initially creating a repo map.
|
||||
- Fixed bad commit message when adding new file to empty repo.
|
||||
|
@ -333,7 +355,7 @@ cog.out(text)
|
|||
- Fixed /commit bug from repo refactor, added test coverage.
|
||||
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 53.4% for gpt-3.5/whole (no regression).
|
||||
|
||||
### v0.11.0
|
||||
### Aider v0.11.0
|
||||
|
||||
- Automatically summarize chat history to avoid exhausting context window.
|
||||
- More detail on dollar costs when running with `--no-stream`
|
||||
|
@ -341,12 +363,12 @@ cog.out(text)
|
|||
- Defend against GPT-3.5 or non-OpenAI models suggesting filenames surrounded by asterisks.
|
||||
- Refactored GitRepo code out of the Coder class.
|
||||
|
||||
### v0.10.1
|
||||
### Aider v0.10.1
|
||||
|
||||
- /add and /drop always use paths relative to the git root
|
||||
- Encourage GPT to use language like "add files to the chat" to ask users for permission to edit them.
|
||||
|
||||
### v0.10.0
|
||||
### Aider v0.10.0
|
||||
|
||||
- Added `/git` command to run git from inside aider chats.
|
||||
- Use Meta-ENTER (Esc+ENTER in some environments) to enter multiline chat messages.
|
||||
|
@ -358,7 +380,7 @@ cog.out(text)
|
|||
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 64.7% for gpt-4/diff (no regression)
|
||||
|
||||
|
||||
### v0.9.0
|
||||
### Aider v0.9.0
|
||||
|
||||
- Support for the OpenAI models in [Azure](https://aider.chat/docs/faq.html#azure)
|
||||
- Added `--show-repo-map`
|
||||
|
@ -367,7 +389,7 @@ cog.out(text)
|
|||
- Bugfix: recognize and add files in subdirectories mentioned by user or GPT
|
||||
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 53.8% for gpt-3.5-turbo/whole (no regression)
|
||||
|
||||
### v0.8.3
|
||||
### Aider v0.8.3
|
||||
|
||||
- Added `--dark-mode` and `--light-mode` to select colors optimized for terminal background
|
||||
- Install docs link to [NeoVim plugin](https://github.com/joshuavial/aider.nvim) by @joshuavial
|
||||
|
@ -378,11 +400,11 @@ cog.out(text)
|
|||
- Bugfix/improvement to /add and /drop to recurse selected directories
|
||||
- Bugfix for live diff output when using "whole" edit format
|
||||
|
||||
### v0.8.2
|
||||
### Aider v0.8.2
|
||||
|
||||
- Disabled general availability of gpt-4 (it's rolling out, not 100% available yet)
|
||||
|
||||
### v0.8.1
|
||||
### Aider v0.8.1
|
||||
|
||||
- Ask to create a git repo if none found, to better track GPT's code changes
|
||||
- Glob wildcards are now supported in `/add` and `/drop` commands
|
||||
|
@ -394,7 +416,7 @@ cog.out(text)
|
|||
- Bugfix for chats with multiple files
|
||||
- Bugfix in editblock coder prompt
|
||||
|
||||
### v0.8.0
|
||||
### Aider v0.8.0
|
||||
|
||||
- [Benchmark comparing code editing in GPT-3.5 and GPT-4](https://aider.chat/docs/benchmarks.html)
|
||||
- Improved Windows support:
|
||||
|
@ -407,15 +429,15 @@ cog.out(text)
|
|||
- Added `--code-theme` switch to control the pygments styling of code blocks (by @kwmiebach)
|
||||
- Better status messages explaining the reason when ctags is disabled
|
||||
|
||||
### v0.7.2:
|
||||
### Aider v0.7.2:
|
||||
|
||||
- Fixed a bug to allow aider to edit files that contain triple backtick fences.
|
||||
|
||||
### v0.7.1:
|
||||
### Aider v0.7.1:
|
||||
|
||||
- Fixed a bug in the display of streaming diffs in GPT-3.5 chats
|
||||
|
||||
### v0.7.0:
|
||||
### Aider v0.7.0:
|
||||
|
||||
- Graceful handling of context window exhaustion, including helpful tips.
|
||||
- Added `--message` to give GPT that one instruction and then exit after it replies and any edits are performed.
|
||||
|
@ -429,13 +451,13 @@ cog.out(text)
|
|||
- Initial experiments show that using functions makes 3.5 less competent at coding.
|
||||
- Limit automatic retries when GPT returns a malformed edit response.
|
||||
|
||||
### v0.6.2
|
||||
### Aider v0.6.2
|
||||
|
||||
* Support for `gpt-3.5-turbo-16k`, and all OpenAI chat models
|
||||
* Improved ability to correct when gpt-4 omits leading whitespace in code edits
|
||||
* Added `--openai-api-base` to support API proxies, etc.
|
||||
|
||||
### v0.5.0
|
||||
### Aider v0.5.0
|
||||
|
||||
- Added support for `gpt-3.5-turbo` and `gpt-4-32k`.
|
||||
- Added `--map-tokens` to set a token budget for the repo map, along with a PageRank based algorithm for prioritizing which files and identifiers to include in the map.
|
||||
|
|
|
@ -28,7 +28,7 @@ aux_links:
|
|||
"Discord":
|
||||
- "https://discord.gg/Tv2uQnR88V"
|
||||
"Blog":
|
||||
- "/blog"
|
||||
- "/blog/"
|
||||
|
||||
nav_external_links:
|
||||
- title: "GitHub"
|
||||
|
|
|
@ -590,52 +590,29 @@
|
|||
seconds_per_case: 280.6
|
||||
total_cost: 0.0000
|
||||
|
||||
- dirname: 2024-06-20-15-09-26--claude-3.5-sonnet-whole
|
||||
- dirname: 2024-07-04-14-32-08--claude-3.5-sonnet-diff-continue
|
||||
test_cases: 133
|
||||
model: claude-3.5-sonnet (whole)
|
||||
edit_format: whole
|
||||
commit_hash: 068609e
|
||||
pass_rate_1: 61.7
|
||||
pass_rate_2: 78.2
|
||||
percent_cases_well_formed: 100.0
|
||||
error_outputs: 4
|
||||
num_malformed_responses: 0
|
||||
num_with_malformed_responses: 0
|
||||
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
|
||||
num_malformed_responses: 4
|
||||
num_with_malformed_responses: 1
|
||||
user_asks: 2
|
||||
lazy_comments: 0
|
||||
syntax_errors: 0
|
||||
indentation_errors: 0
|
||||
exhausted_context_windows: 0
|
||||
test_timeouts: 0
|
||||
command: aider --model openrouter/anthropic/claude-3.5-sonnet --edit-format whole
|
||||
date: 2024-06-20
|
||||
versions: 0.38.1-dev
|
||||
seconds_per_case: 15.4
|
||||
total_cost: 0.0000
|
||||
|
||||
- dirname: 2024-06-20-15-16-41--claude-3.5-sonnet-diff
|
||||
test_cases: 133
|
||||
model: claude-3.5-sonnet (diff)
|
||||
edit_format: diff
|
||||
commit_hash: 068609e-dirty
|
||||
pass_rate_1: 57.9
|
||||
pass_rate_2: 74.4
|
||||
percent_cases_well_formed: 97.0
|
||||
error_outputs: 48
|
||||
num_malformed_responses: 11
|
||||
num_with_malformed_responses: 4
|
||||
user_asks: 0
|
||||
lazy_comments: 0
|
||||
syntax_errors: 0
|
||||
syntax_errors: 1
|
||||
indentation_errors: 0
|
||||
exhausted_context_windows: 0
|
||||
test_timeouts: 1
|
||||
command: aider --model openrouter/anthropic/claude-3.5-sonnet
|
||||
date: 2024-06-20
|
||||
versions: 0.38.1-dev
|
||||
seconds_per_case: 21.6
|
||||
total_cost: 0.0000
|
||||
|
||||
command: aider --sonnet
|
||||
date: 2024-07-04
|
||||
versions: 0.42.1-dev
|
||||
seconds_per_case: 17.6
|
||||
total_cost: 3.6346
|
||||
|
||||
- dirname: 2024-06-17-14-45-54--deepseek-coder2-whole
|
||||
test_cases: 133
|
||||
model: DeepSeek Coder V2 (whole)
|
||||
|
@ -681,4 +658,27 @@
|
|||
versions: 0.39.1-dev
|
||||
seconds_per_case: 30.2
|
||||
total_cost: 0.0857
|
||||
|
||||
- dirname: 2024-07-01-21-41-48--haiku-whole
|
||||
test_cases: 133
|
||||
model: claude-3-haiku-20240307
|
||||
edit_format: whole
|
||||
commit_hash: 75f506d
|
||||
pass_rate_1: 40.6
|
||||
pass_rate_2: 47.4
|
||||
percent_cases_well_formed: 100.0
|
||||
error_outputs: 6
|
||||
num_malformed_responses: 0
|
||||
num_with_malformed_responses: 0
|
||||
user_asks: 0
|
||||
lazy_comments: 0
|
||||
syntax_errors: 0
|
||||
indentation_errors: 0
|
||||
exhausted_context_windows: 0
|
||||
test_timeouts: 2
|
||||
command: aider --model claude-3-haiku-20240307
|
||||
date: 2024-07-01
|
||||
versions: 0.41.1-dev
|
||||
seconds_per_case: 7.1
|
||||
total_cost: 0.1946
|
||||
|
|
@ -143,25 +143,48 @@
|
|||
seconds_per_case: 67.8
|
||||
total_cost: 20.4889
|
||||
|
||||
|
||||
- dirname: 2024-06-20-16-39-18--refac-claude-3.5-sonnet-diff
|
||||
- dirname: 2024-07-01-18-30-33--refac-claude-3.5-sonnet-diff-not-lazy
|
||||
test_cases: 89
|
||||
model: claude-3.5-sonnet (diff)
|
||||
edit_format: diff
|
||||
commit_hash: e5e07f9
|
||||
pass_rate_1: 55.1
|
||||
percent_cases_well_formed: 70.8
|
||||
error_outputs: 240
|
||||
num_malformed_responses: 54
|
||||
num_with_malformed_responses: 26
|
||||
user_asks: 10
|
||||
commit_hash: 7396e38-dirty
|
||||
pass_rate_1: 64.0
|
||||
percent_cases_well_formed: 76.4
|
||||
error_outputs: 176
|
||||
num_malformed_responses: 39
|
||||
num_with_malformed_responses: 21
|
||||
user_asks: 11
|
||||
lazy_comments: 2
|
||||
syntax_errors: 0
|
||||
indentation_errors: 3
|
||||
syntax_errors: 4
|
||||
indentation_errors: 0
|
||||
exhausted_context_windows: 0
|
||||
test_timeouts: 0
|
||||
command: aider --model openrouter/anthropic/claude-3.5-sonnet
|
||||
date: 2024-06-20
|
||||
versions: 0.38.1-dev
|
||||
seconds_per_case: 51.9
|
||||
total_cost: 0.0000
|
||||
command: aider --sonnet
|
||||
date: 2024-07-01
|
||||
versions: 0.40.7-dev
|
||||
seconds_per_case: 42.8
|
||||
total_cost: 11.5242
|
||||
|
||||
|
||||
- dirname: 2024-07-04-15-06-43--refac-deepseek-coder2-128k
|
||||
test_cases: 89
|
||||
model: DeepSeek Coder V2 (128k context)
|
||||
edit_format: diff
|
||||
commit_hash: 08868fd
|
||||
pass_rate_1: 38.2
|
||||
percent_cases_well_formed: 73.0
|
||||
error_outputs: 393
|
||||
num_malformed_responses: 89
|
||||
num_with_malformed_responses: 24
|
||||
user_asks: 4
|
||||
lazy_comments: 2
|
||||
syntax_errors: 1
|
||||
indentation_errors: 5
|
||||
exhausted_context_windows: 3
|
||||
test_timeouts: 0
|
||||
command: aider --model deepseek/deepseek-coder
|
||||
date: 2024-07-04
|
||||
versions: 0.42.1-dev
|
||||
seconds_per_case: 82.9
|
||||
total_cost: 0.2601
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
You can get started quickly like this:
|
||||
|
||||
```
|
||||
|
@ -6,16 +7,11 @@ $ 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
|
||||
|
||||
# Or, work with Anthropic's models
|
||||
$ export ANTHROPIC_API_KEY=your-key-goes-here
|
||||
|
||||
# Claude 3 Opus
|
||||
$ aider --opus
|
||||
|
||||
# Claude 3.5 Sonnet
|
||||
$ aider --sonnet
|
||||
```
|
||||
|
|
|
@ -14,6 +14,9 @@ for that model.
|
|||
Aider will use an unlimited context window and assume the model is free,
|
||||
so this is not usually a significant problem.
|
||||
|
||||
See the docs on
|
||||
[configuring advanced model settings](/docs/config/adv-model-settings.html)
|
||||
for details on how to remove this warning.
|
||||
|
||||
## Did you mean?
|
||||
|
||||
|
|
|
@ -6,4 +6,4 @@ have their keys and settings
|
|||
specified in environment variables.
|
||||
This can be done in your shell,
|
||||
or by using a
|
||||
[`.env` file](/docs/dotenv.html).
|
||||
[`.env` file](/docs/config/dotenv.html).
|
||||
|
|
126
website/_posts/2024-07-01-sonnet-not-lazy.md
Normal file
126
website/_posts/2024-07-01-sonnet-not-lazy.md
Normal file
|
@ -0,0 +1,126 @@
|
|||
---
|
||||
title: Sonnet is the opposite of lazy
|
||||
excerpt: Claude 3.5 Sonnet can easily write more good code than fits in one 4k token API response.
|
||||
highlight_image: /assets/sonnet-not-lazy.jpg
|
||||
nav_exclude: true
|
||||
---
|
||||
|
||||
[](https://aider.chat/assets/sonnet-not-lazy.jpg)
|
||||
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
|
||||
{% endif %}
|
||||
|
||||
# Sonnet is the opposite of lazy
|
||||
|
||||
Claude 3.5 Sonnet represents a step change
|
||||
in AI coding.
|
||||
It is incredibly industrious, diligent and hard working.
|
||||
Unexpectedly,
|
||||
this presented a challenge:
|
||||
Sonnet
|
||||
was often writing so much code that
|
||||
it was hitting the 4k output token limit,
|
||||
truncating its coding in mid-stream.
|
||||
|
||||
Aider now works
|
||||
around this 4k limit and allows Sonnet to produce
|
||||
as much code as it wants.
|
||||
The result is surprisingly powerful.
|
||||
Sonnet's score on
|
||||
[aider's refactoring benchmark](https://aider.chat/docs/leaderboards/#code-refactoring-leaderboard)
|
||||
jumped from 55.1% up to 64.0%.
|
||||
This moved Sonnet into second place, ahead of GPT-4o and
|
||||
behind only Opus.
|
||||
|
||||
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)
|
||||
- *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
|
||||
|
||||
All LLMs have various token limits, the most familiar being their
|
||||
context window size.
|
||||
But they also have a limit on how many tokens they can output
|
||||
in response to a single request.
|
||||
Sonnet and the majority of other
|
||||
models are limited to returning 4k tokens.
|
||||
|
||||
Sonnet's amazing work ethic caused it to
|
||||
regularly hit this 4k output token
|
||||
limit for a few reasons:
|
||||
|
||||
1. Sonnet is capable of outputting a very large amount of correct,
|
||||
complete new code in one response.
|
||||
2. Similarly, Sonnet can specify long sequences of edits in one go,
|
||||
like changing a majority of lines while refactoring a large file.
|
||||
3. Sonnet tends to quote large chunks of a
|
||||
file when performing a SEARCH & REPLACE edits.
|
||||
Beyond token limits, this is very wasteful.
|
||||
|
||||
## Good problems
|
||||
|
||||
Problems (1) and (2) are "good problems"
|
||||
in the sense that Sonnet is
|
||||
able to write more high quality code than any other model!
|
||||
We just don't want it to be interrupted prematurely
|
||||
by the 4k output limit.
|
||||
|
||||
Aider now allows Sonnet to return code in multiple 4k token
|
||||
responses.
|
||||
Aider seamlessly combines them so that Sonnet can return arbitrarily
|
||||
long responses.
|
||||
This gets all the upsides of Sonnet's prolific coding skills,
|
||||
without being constrained by the 4k output token limit.
|
||||
|
||||
|
||||
## Wasting tokens
|
||||
|
||||
Problem (3) is more complicated, as Sonnet isn't just
|
||||
being stopped early -- it's actually wasting a lot
|
||||
of tokens, time and money.
|
||||
|
||||
Faced with a few small changes spread far apart in
|
||||
a source file,
|
||||
Sonnet would often prefer to do one giant SEARCH/REPLACE
|
||||
operation of almost the entire file.
|
||||
It would be far faster and less expensive to instead
|
||||
do a few surgical edits.
|
||||
|
||||
Aider now prompts Sonnet to discourage these long-winded
|
||||
SEARCH/REPLACE operations
|
||||
and promotes much more concise edits.
|
||||
|
||||
|
||||
## Aider with Sonnet
|
||||
|
||||
[The latest release of aider](https://aider.chat/HISTORY.html#aider-v0410)
|
||||
has specialized support for Claude 3.5 Sonnet:
|
||||
|
||||
- Aider allows Sonnet to produce as much code as it wants,
|
||||
by automatically and seamlessly spreading the response
|
||||
out over a sequence of 4k token API responses.
|
||||
- Aider carefully prompts Sonnet to be concise when proposing
|
||||
code edits.
|
||||
This reduces Sonnet's tendency to waste time, tokens and money
|
||||
returning large chunks of unchanging code.
|
||||
- Aider now uses Claude 3.5 Sonnet by default if the `ANTHROPIC_API_KEY` is set in the environment.
|
||||
|
||||
See
|
||||
[aider's install instructions](https://aider.chat/docs/install.html)
|
||||
for more details, but
|
||||
you can get started quickly with aider and Sonnet like this:
|
||||
|
||||
```
|
||||
$ pip install aider-chat
|
||||
|
||||
$ export ANTHROPIC_API_KEY=<key> # Mac/Linux
|
||||
$ setx ANTHROPIC_API_KEY <key> # Windows
|
||||
|
||||
$ aider
|
||||
```
|
||||
|
|
@ -77,6 +77,7 @@
|
|||
color: #32FF32;
|
||||
border-top: 1px solid #32FF32;
|
||||
padding-top: 10px;
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
.chat-transcript h4::before {
|
||||
|
|
|
@ -13,17 +13,14 @@
|
|||
#######
|
||||
# Main:
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#llm-history-file:
|
||||
|
||||
## Specify the OpenAI API key
|
||||
#openai-api-key:
|
||||
|
||||
## Specify the Anthropic API key
|
||||
#anthropic-api-key:
|
||||
|
||||
## Specify the model to use for the main chat (default: gpt-4o)
|
||||
#model: gpt-4o
|
||||
## Specify the model to use for the main chat
|
||||
#model:
|
||||
|
||||
## Use claude-3-opus-20240229 model for the main chat
|
||||
#opus: false
|
||||
|
@ -65,10 +62,10 @@
|
|||
#openai-organization-id:
|
||||
|
||||
## Specify a file with aider model settings for unknown models
|
||||
#model-settings-file:
|
||||
#model-settings-file: .aider.model.settings.yml
|
||||
|
||||
## Specify a file with context window and costs for unknown models
|
||||
#model-metadata-file:
|
||||
#model-metadata-file: .aider.model.metadata.json
|
||||
|
||||
## Verify the SSL cert when connecting to models (default: True)
|
||||
#verify-ssl: true
|
||||
|
@ -103,6 +100,9 @@
|
|||
## Restore the previous chat history messages (default: False)
|
||||
#restore-chat-history: false
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#llm-history-file:
|
||||
|
||||
##################
|
||||
# Output Settings:
|
||||
|
||||
|
@ -160,6 +160,9 @@
|
|||
## Attribute aider commits in the git committer name (default: True)
|
||||
#attribute-committer: true
|
||||
|
||||
## Prefix commit messages with 'aider: ' (default: False)
|
||||
#attribute-commit-message: false
|
||||
|
||||
## Perform a dry run without modifying files (default: False)
|
||||
#dry-run: false
|
||||
|
||||
|
@ -220,6 +223,9 @@
|
|||
## Print the system prompts and exit (debug)
|
||||
#show-prompts: false
|
||||
|
||||
## Do all startup activities then exit before accepting user input (debug)
|
||||
#exit: false
|
||||
|
||||
## Specify a single message to send the LLM, process reply then exit (disables chat mode)
|
||||
#message:
|
||||
|
||||
|
|
|
@ -21,17 +21,14 @@
|
|||
#######
|
||||
# Main:
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#AIDER_LLM_HISTORY_FILE=
|
||||
|
||||
## Specify the OpenAI API key
|
||||
#OPENAI_API_KEY=
|
||||
|
||||
## Specify the Anthropic API key
|
||||
#ANTHROPIC_API_KEY=
|
||||
|
||||
## Specify the model to use for the main chat (default: gpt-4o)
|
||||
#AIDER_MODEL=gpt-4o
|
||||
## Specify the model to use for the main chat
|
||||
#AIDER_MODEL=
|
||||
|
||||
## Use claude-3-opus-20240229 model for the main chat
|
||||
#AIDER_OPUS=
|
||||
|
@ -73,10 +70,10 @@
|
|||
#OPENAI_ORGANIZATION_ID=
|
||||
|
||||
## Specify a file with aider model settings for unknown models
|
||||
#AIDER_MODEL_SETTINGS_FILE=
|
||||
#AIDER_MODEL_SETTINGS_FILE=.aider.model.settings.yml
|
||||
|
||||
## Specify a file with context window and costs for unknown models
|
||||
#AIDER_MODEL_METADATA_FILE=
|
||||
#AIDER_MODEL_METADATA_FILE=.aider.model.metadata.json
|
||||
|
||||
## Verify the SSL cert when connecting to models (default: True)
|
||||
#AIDER_VERIFY_SSL=true
|
||||
|
@ -111,6 +108,9 @@
|
|||
## Restore the previous chat history messages (default: False)
|
||||
#AIDER_RESTORE_CHAT_HISTORY=false
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#AIDER_LLM_HISTORY_FILE=
|
||||
|
||||
##################
|
||||
# Output Settings:
|
||||
|
||||
|
@ -168,6 +168,9 @@
|
|||
## Attribute aider commits in the git committer name (default: True)
|
||||
#AIDER_ATTRIBUTE_COMMITTER=true
|
||||
|
||||
## Prefix commit messages with 'aider: ' (default: False)
|
||||
#AIDER_ATTRIBUTE_COMMIT_MESSAGE=false
|
||||
|
||||
## Perform a dry run without modifying files (default: False)
|
||||
#AIDER_DRY_RUN=false
|
||||
|
||||
|
@ -225,6 +228,9 @@
|
|||
## Print the system prompts and exit (debug)
|
||||
#AIDER_SHOW_PROMPTS=false
|
||||
|
||||
## Do all startup activities then exit before accepting user input (debug)
|
||||
#AIDER_EXIT=false
|
||||
|
||||
## Specify a single message to send the LLM, process reply then exit (disables chat mode)
|
||||
#AIDER_MESSAGE=
|
||||
|
||||
|
|
BIN
website/assets/sonnet-not-lazy.jpg
Normal file
BIN
website/assets/sonnet-not-lazy.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 209 KiB |
|
@ -11,24 +11,31 @@ command line switches.
|
|||
Most options can also be set in an `.aider.conf.yml` file
|
||||
which can be placed in your home directory or at the root of
|
||||
your git repo.
|
||||
Or via environment variables like `AIDER_xxx`,
|
||||
as noted in the [options reference](options.html).
|
||||
Or by setting environment variables like `AIDER_xxx`
|
||||
either in your shell or a `.env` file.
|
||||
|
||||
Here are 3 equivalent ways of setting an option. First, via a command line switch:
|
||||
Here are 4 equivalent ways of setting an option.
|
||||
|
||||
With a command line switch:
|
||||
|
||||
```
|
||||
$ aider --dark-mode
|
||||
```
|
||||
|
||||
Or, via an env variable:
|
||||
|
||||
```
|
||||
export AIDER_DARK_MODE=true
|
||||
```
|
||||
|
||||
Or in the `.aider.conf.yml` file:
|
||||
Using a `.aider.conf.yml` file:
|
||||
|
||||
```yaml
|
||||
dark-mode: true
|
||||
```
|
||||
|
||||
By setting an environgment variable:
|
||||
|
||||
```
|
||||
export AIDER_DARK_MODE=true
|
||||
```
|
||||
|
||||
Using an `.env` file:
|
||||
|
||||
```
|
||||
AIDER_DARK_MODE=true
|
||||
```
|
||||
|
|
86
website/docs/config/adv-model-settings.md
Normal file
86
website/docs/config/adv-model-settings.md
Normal file
|
@ -0,0 +1,86 @@
|
|||
---
|
||||
parent: Configuration
|
||||
nav_order: 950
|
||||
description: Configuring advanced settings for LLMs.
|
||||
---
|
||||
|
||||
# Advanced model settings
|
||||
|
||||
## Context window size and token costs
|
||||
|
||||
In most cases, you can safely ignore aider's warning about unknown context
|
||||
window size and model costs.
|
||||
|
||||
But, you can register context window limits and costs for models that aren't known
|
||||
to aider. Create a `.aider.model.metadata.json` file in one of these locations:
|
||||
|
||||
- Your home directory.
|
||||
- The root if your git repo.
|
||||
- The current directory where you launch aider.
|
||||
- Or specify a specific file with the `--model-metadata-file <filename>` switch.
|
||||
|
||||
|
||||
If the files above exist, they will be loaded in that order.
|
||||
Files loaded last will take priority.
|
||||
|
||||
The json file should be a dictionary with an entry for each model, as follows:
|
||||
|
||||
```
|
||||
{
|
||||
"deepseek-chat": {
|
||||
"max_tokens": 4096,
|
||||
"max_input_tokens": 32000,
|
||||
"max_output_tokens": 4096,
|
||||
"input_cost_per_token": 0.00000014,
|
||||
"output_cost_per_token": 0.00000028,
|
||||
"litellm_provider": "deepseek",
|
||||
"mode": "chat"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
See
|
||||
[litellm's model_prices_and_context_window.json file](https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json) for more examples.
|
||||
|
||||
## Model settings
|
||||
|
||||
Aider has a number of settings that control how it works with
|
||||
different models.
|
||||
These model settings are pre-configured for most popular models.
|
||||
But it can sometimes be helpful to override them or add settings for
|
||||
a model that aider doesn't know about.
|
||||
|
||||
To do that,
|
||||
create a `.aider.model.settings.yml` file in one of these locations:
|
||||
|
||||
- Your home directory.
|
||||
- The root if your git repo.
|
||||
- The current directory where you launch aider.
|
||||
- Or specify a specific file with the `--model-settings-file <filename>` switch.
|
||||
|
||||
If the files above exist, they will be loaded in that order.
|
||||
Files loaded last will take priority.
|
||||
|
||||
The yaml file should be a a list of dictionary objects for each model, as follows:
|
||||
|
||||
```
|
||||
- name: "gpt-3.5-turbo"
|
||||
edit_format: "whole"
|
||||
weak_model_name: "gpt-3.5-turbo"
|
||||
use_repo_map: false
|
||||
send_undo_reply: false
|
||||
accepts_images: false
|
||||
lazy: false
|
||||
reminder_as_sys_msg: true
|
||||
examples_as_sys_msg: false
|
||||
- name: "gpt-4-turbo-2024-04-09"
|
||||
edit_format: "udiff"
|
||||
weak_model_name: "gpt-3.5-turbo"
|
||||
use_repo_map: true
|
||||
send_undo_reply: true
|
||||
accepts_images: true
|
||||
lazy: true
|
||||
reminder_as_sys_msg: true
|
||||
examples_as_sys_msg: false
|
||||
```
|
||||
|
|
@ -41,17 +41,14 @@ cog.outl("```")
|
|||
#######
|
||||
# Main:
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#llm-history-file:
|
||||
|
||||
## Specify the OpenAI API key
|
||||
#openai-api-key:
|
||||
|
||||
## Specify the Anthropic API key
|
||||
#anthropic-api-key:
|
||||
|
||||
## Specify the model to use for the main chat (default: gpt-4o)
|
||||
#model: gpt-4o
|
||||
## Specify the model to use for the main chat
|
||||
#model:
|
||||
|
||||
## Use claude-3-opus-20240229 model for the main chat
|
||||
#opus: false
|
||||
|
@ -93,10 +90,10 @@ cog.outl("```")
|
|||
#openai-organization-id:
|
||||
|
||||
## Specify a file with aider model settings for unknown models
|
||||
#model-settings-file:
|
||||
#model-settings-file: .aider.model.settings.yml
|
||||
|
||||
## Specify a file with context window and costs for unknown models
|
||||
#model-metadata-file:
|
||||
#model-metadata-file: .aider.model.metadata.json
|
||||
|
||||
## Verify the SSL cert when connecting to models (default: True)
|
||||
#verify-ssl: true
|
||||
|
@ -131,6 +128,9 @@ cog.outl("```")
|
|||
## Restore the previous chat history messages (default: False)
|
||||
#restore-chat-history: false
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#llm-history-file:
|
||||
|
||||
##################
|
||||
# Output Settings:
|
||||
|
||||
|
@ -188,6 +188,9 @@ cog.outl("```")
|
|||
## Attribute aider commits in the git committer name (default: True)
|
||||
#attribute-committer: true
|
||||
|
||||
## Prefix commit messages with 'aider: ' (default: False)
|
||||
#attribute-commit-message: false
|
||||
|
||||
## Perform a dry run without modifying files (default: False)
|
||||
#dry-run: false
|
||||
|
||||
|
@ -248,6 +251,9 @@ cog.outl("```")
|
|||
## Print the system prompts and exit (debug)
|
||||
#show-prompts: false
|
||||
|
||||
## Do all startup activities then exit before accepting user input (debug)
|
||||
#exit: false
|
||||
|
||||
## Specify a single message to send the LLM, process reply then exit (disables chat mode)
|
||||
#message:
|
||||
|
|
@ -54,17 +54,14 @@ cog.outl("```")
|
|||
#######
|
||||
# Main:
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#AIDER_LLM_HISTORY_FILE=
|
||||
|
||||
## Specify the OpenAI API key
|
||||
#OPENAI_API_KEY=
|
||||
|
||||
## Specify the Anthropic API key
|
||||
#ANTHROPIC_API_KEY=
|
||||
|
||||
## Specify the model to use for the main chat (default: gpt-4o)
|
||||
#AIDER_MODEL=gpt-4o
|
||||
## Specify the model to use for the main chat
|
||||
#AIDER_MODEL=
|
||||
|
||||
## Use claude-3-opus-20240229 model for the main chat
|
||||
#AIDER_OPUS=
|
||||
|
@ -106,10 +103,10 @@ cog.outl("```")
|
|||
#OPENAI_ORGANIZATION_ID=
|
||||
|
||||
## Specify a file with aider model settings for unknown models
|
||||
#AIDER_MODEL_SETTINGS_FILE=
|
||||
#AIDER_MODEL_SETTINGS_FILE=.aider.model.settings.yml
|
||||
|
||||
## Specify a file with context window and costs for unknown models
|
||||
#AIDER_MODEL_METADATA_FILE=
|
||||
#AIDER_MODEL_METADATA_FILE=.aider.model.metadata.json
|
||||
|
||||
## Verify the SSL cert when connecting to models (default: True)
|
||||
#AIDER_VERIFY_SSL=true
|
||||
|
@ -144,6 +141,9 @@ cog.outl("```")
|
|||
## Restore the previous chat history messages (default: False)
|
||||
#AIDER_RESTORE_CHAT_HISTORY=false
|
||||
|
||||
## Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
#AIDER_LLM_HISTORY_FILE=
|
||||
|
||||
##################
|
||||
# Output Settings:
|
||||
|
||||
|
@ -201,6 +201,9 @@ cog.outl("```")
|
|||
## Attribute aider commits in the git committer name (default: True)
|
||||
#AIDER_ATTRIBUTE_COMMITTER=true
|
||||
|
||||
## Prefix commit messages with 'aider: ' (default: False)
|
||||
#AIDER_ATTRIBUTE_COMMIT_MESSAGE=false
|
||||
|
||||
## Perform a dry run without modifying files (default: False)
|
||||
#AIDER_DRY_RUN=false
|
||||
|
||||
|
@ -258,6 +261,9 @@ cog.outl("```")
|
|||
## Print the system prompts and exit (debug)
|
||||
#AIDER_SHOW_PROMPTS=false
|
||||
|
||||
## Do all startup activities then exit before accepting user input (debug)
|
||||
#AIDER_EXIT=false
|
||||
|
||||
## Specify a single message to send the LLM, process reply then exit (disables chat mode)
|
||||
#AIDER_MESSAGE=
|
||||
|
|
@ -20,35 +20,35 @@ from aider.args import get_md_help
|
|||
cog.out(get_md_help())
|
||||
]]]-->
|
||||
```
|
||||
usage: aider [-h] [--llm-history-file] [--openai-api-key]
|
||||
[--anthropic-api-key] [--model] [--opus] [--sonnet]
|
||||
[--4] [--4o] [--4-turbo] [--35turbo] [--models]
|
||||
[--openai-api-base] [--openai-api-type]
|
||||
[--openai-api-version] [--openai-api-deployment-id]
|
||||
[--openai-organization-id] [--model-settings-file]
|
||||
[--model-metadata-file]
|
||||
usage: aider [-h] [--openai-api-key] [--anthropic-api-key] [--model]
|
||||
[--opus] [--sonnet] [--4] [--4o] [--4-turbo]
|
||||
[--35turbo] [--models] [--openai-api-base]
|
||||
[--openai-api-type] [--openai-api-version]
|
||||
[--openai-api-deployment-id] [--openai-organization-id]
|
||||
[--model-settings-file] [--model-metadata-file]
|
||||
[--verify-ssl | --no-verify-ssl] [--edit-format]
|
||||
[--weak-model]
|
||||
[--show-model-warnings | --no-show-model-warnings]
|
||||
[--map-tokens] [--max-chat-history-tokens] [--env-file]
|
||||
[--input-history-file] [--chat-history-file]
|
||||
[--restore-chat-history | --no-restore-chat-history]
|
||||
[--dark-mode] [--light-mode] [--pretty | --no-pretty]
|
||||
[--stream | --no-stream] [--user-input-color]
|
||||
[--tool-output-color] [--tool-error-color]
|
||||
[--assistant-output-color] [--code-theme]
|
||||
[--show-diffs] [--git | --no-git]
|
||||
[--llm-history-file] [--dark-mode] [--light-mode]
|
||||
[--pretty | --no-pretty] [--stream | --no-stream]
|
||||
[--user-input-color] [--tool-output-color]
|
||||
[--tool-error-color] [--assistant-output-color]
|
||||
[--code-theme] [--show-diffs] [--git | --no-git]
|
||||
[--gitignore | --no-gitignore] [--aiderignore]
|
||||
[--auto-commits | --no-auto-commits]
|
||||
[--dirty-commits | --no-dirty-commits]
|
||||
[--attribute-author | --no-attribute-author]
|
||||
[--attribute-committer | --no-attribute-committer]
|
||||
[--attribute-commit-message | --no-attribute-commit-message]
|
||||
[--dry-run | --no-dry-run] [--commit] [--lint]
|
||||
[--lint-cmd] [--auto-lint | --no-auto-lint]
|
||||
[--test-cmd] [--auto-test | --no-auto-test] [--test]
|
||||
[--vim] [--voice-language] [--version] [--check-update]
|
||||
[--skip-check-update] [--apply] [--yes] [-v]
|
||||
[--show-repo-map] [--show-prompts] [--message]
|
||||
[--show-repo-map] [--show-prompts] [--exit] [--message]
|
||||
[--message-file] [--encoding] [-c] [--gui]
|
||||
|
||||
```
|
||||
|
@ -63,10 +63,6 @@ Aliases:
|
|||
|
||||
## Main:
|
||||
|
||||
### `--llm-history-file LLM_HISTORY_FILE`
|
||||
Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
Environment variable: `AIDER_LLM_HISTORY_FILE`
|
||||
|
||||
### `--openai-api-key OPENAI_API_KEY`
|
||||
Specify the OpenAI API key
|
||||
Environment variable: `OPENAI_API_KEY`
|
||||
|
@ -76,8 +72,7 @@ Specify the Anthropic API key
|
|||
Environment variable: `ANTHROPIC_API_KEY`
|
||||
|
||||
### `--model MODEL`
|
||||
Specify the model to use for the main chat (default: gpt-4o)
|
||||
Default: gpt-4o
|
||||
Specify the model to use for the main chat
|
||||
Environment variable: `AIDER_MODEL`
|
||||
|
||||
### `--opus`
|
||||
|
@ -140,10 +135,12 @@ Environment variable: `OPENAI_ORGANIZATION_ID`
|
|||
|
||||
### `--model-settings-file MODEL_SETTINGS_FILE`
|
||||
Specify a file with aider model settings for unknown models
|
||||
Default: .aider.model.settings.yml
|
||||
Environment variable: `AIDER_MODEL_SETTINGS_FILE`
|
||||
|
||||
### `--model-metadata-file MODEL_METADATA_FILE`
|
||||
Specify a file with context window and costs for unknown models
|
||||
Default: .aider.model.metadata.json
|
||||
Environment variable: `AIDER_MODEL_METADATA_FILE`
|
||||
|
||||
### `--verify-ssl`
|
||||
|
@ -204,6 +201,10 @@ Aliases:
|
|||
- `--restore-chat-history`
|
||||
- `--no-restore-chat-history`
|
||||
|
||||
### `--llm-history-file LLM_HISTORY_FILE`
|
||||
Log the conversation with the LLM to this file (for example, .aider.llm.history)
|
||||
Environment variable: `AIDER_LLM_HISTORY_FILE`
|
||||
|
||||
## Output Settings:
|
||||
|
||||
### `--dark-mode`
|
||||
|
@ -316,6 +317,14 @@ Aliases:
|
|||
- `--attribute-committer`
|
||||
- `--no-attribute-committer`
|
||||
|
||||
### `--attribute-commit-message`
|
||||
Prefix commit messages with 'aider: ' (default: False)
|
||||
Default: False
|
||||
Environment variable: `AIDER_ATTRIBUTE_COMMIT_MESSAGE`
|
||||
Aliases:
|
||||
- `--attribute-commit-message`
|
||||
- `--no-attribute-commit-message`
|
||||
|
||||
### `--dry-run`
|
||||
Perform a dry run without modifying files (default: False)
|
||||
Default: False
|
||||
|
@ -349,7 +358,7 @@ Aliases:
|
|||
- `--auto-lint`
|
||||
- `--no-auto-lint`
|
||||
|
||||
### `--test-cmd`
|
||||
### `--test-cmd VALUE`
|
||||
Specify command to run tests
|
||||
Default: []
|
||||
Environment variable: `AIDER_TEST_CMD`
|
||||
|
@ -418,6 +427,11 @@ Print the system prompts and exit (debug)
|
|||
Default: False
|
||||
Environment variable: `AIDER_SHOW_PROMPTS`
|
||||
|
||||
### `--exit`
|
||||
Do all startup activities then exit before accepting user input (debug)
|
||||
Default: False
|
||||
Environment variable: `AIDER_EXIT`
|
||||
|
||||
### `--message COMMAND`
|
||||
Specify a single message to send the LLM, process reply then exit (disables chat mode)
|
||||
Environment variable: `AIDER_MESSAGE`
|
|
@ -44,3 +44,6 @@ Aider marks commits that it either authored or committed.
|
|||
|
||||
You can use `--no-attribute-author` and `--no-attribute-committer` to disable
|
||||
modification of the git author and committer name fields.
|
||||
|
||||
Additionally, you can use `--attribute-commit-message` to prefix commit messages with 'aider: '.
|
||||
This option is disabled by default, but can be useful for easily identifying commits made by aider.
|
||||
|
|
42
website/docs/images-urls.md
Normal file
42
website/docs/images-urls.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
---
|
||||
parent: Usage
|
||||
nav_order: 700
|
||||
description: Add images and URLs to the aider coding chat.
|
||||
---
|
||||
|
||||
# Images & URLs
|
||||
|
||||
You can add images and URLs to the aider chat.
|
||||
|
||||
## Images
|
||||
|
||||
Aider supports working with image files for many vision-capable models
|
||||
like GPT-4o and Claude 3.5 Sonnet.
|
||||
Adding images to a chat can be helpful in many situations:
|
||||
|
||||
- Add screenshots of web pages or UIs that you want aider to build or modify.
|
||||
- Show aider a mockup of a UI you want to build.
|
||||
- Screenshot an error message that is otherwise hard to copy & paste as text.
|
||||
- Etc.
|
||||
|
||||
You can add images to the chat just like you would
|
||||
add any other file:
|
||||
|
||||
- Use `/add <image-filename>` from within the chat
|
||||
- Launch aider with image filenames on the command line: `aider <image-filename>` along with any other command line arguments you need.
|
||||
|
||||
## URLs
|
||||
|
||||
Aider can scrape the text from URLs and add it to the chat.
|
||||
This can be helpful to:
|
||||
|
||||
- Include documentation pages for less popular APIs.
|
||||
- Include the latest docs for libraries or packages that are newer than the model's training cutoff date.
|
||||
- Etc.
|
||||
|
||||
To add URLs to the chat:
|
||||
|
||||
- Use `/web <url>`
|
||||
- Just paste the URL into the chat and aider will ask if you want to add it.
|
||||
|
||||
|
|
@ -24,6 +24,14 @@ Note that this is different than being a "ChatGPT Plus" subscriber.
|
|||
To work with Anthropic's models like Claude 3 Opus you need a paid
|
||||
[Anthropic API key](https://docs.anthropic.com/claude/reference/getting-started-with-the-api).
|
||||
|
||||
## Manage your python environment
|
||||
|
||||
Using a Python
|
||||
[virtual environment](https://docs.python.org/3/library/venv.html)
|
||||
is recommended.
|
||||
Or, you could consider
|
||||
[installing aider using pipx](/docs/install/pipx.html).
|
||||
|
||||
## Windows install
|
||||
|
||||
```
|
||||
|
|
|
@ -12,20 +12,10 @@ The steps below are completely optional.
|
|||
{:toc}
|
||||
|
||||
|
||||
## Store your api key
|
||||
|
||||
You can place your api key in an environment variable:
|
||||
|
||||
* `export OPENAI_API_KEY=sk-...` on Linux or Mac
|
||||
* `setx OPENAI_API_KEY sk-...` in Windows PowerShell
|
||||
|
||||
Or you can create a `.aider.conf.yml` file in your home directory.
|
||||
Put a line in it like this to specify your api key:
|
||||
|
||||
```
|
||||
openai-api-key: sk-...
|
||||
```
|
||||
## Store your api keys
|
||||
|
||||
You can place your [api keys in a `.env` file](/docs/config/dotenv.html)
|
||||
and they will be loaded automatically whenever you run aider.
|
||||
|
||||
## Enable Playwright
|
||||
|
||||
|
|
|
@ -16,20 +16,6 @@ While [aider can connect to almost any LLM](/docs/llms.html),
|
|||
it works best with models that score well on the benchmarks.
|
||||
|
||||
|
||||
## Claude 3.5 Sonnet takes the top spot
|
||||
|
||||
Claude 3.5 Sonnet is now the top ranked model on aider's code editing leaderboard.
|
||||
DeepSeek Coder V2 only spent 4 days in the top spot.
|
||||
|
||||
The new Sonnet came in 3rd on aider's refactoring leaderboard, behind GPT-4o and Opus.
|
||||
|
||||
Sonnet ranked #1 when using the "whole" editing format,
|
||||
but it also scored very well with
|
||||
aider's "diff" editing format.
|
||||
This format allows it to return code changes as diffs -- saving time and token costs,
|
||||
and making it practical to work with larger source files.
|
||||
As such, aider uses "diff" by default with this new Sonnet model.
|
||||
|
||||
## Code editing leaderboard
|
||||
|
||||
[Aider's code editing benchmark](/docs/benchmarks.html#the-benchmark) asks the LLM to edit python source files to complete 133 small coding exercises. This benchmark measures the LLM's coding ability, but also whether it can consistently emit code edits in the format specified in the system prompt.
|
||||
|
|
|
@ -27,7 +27,6 @@ Aider works best with these models, which are skilled at editing code:
|
|||
|
||||
Aider works with a number of **free** API providers:
|
||||
|
||||
- The [DeepSeek Coder V2](/docs/llms/deepseek.html) model gets the top score on aider's code editing benchmark. DeepSeek has been offering 5M free tokens of API usage.
|
||||
- Google's [Gemini 1.5 Pro](/docs/llms/gemini.html) works with aider, with
|
||||
code editing capabilities similar to GPT-3.5.
|
||||
- You can use [Llama 3 70B on Groq](/docs/llms/groq.html) which is comparable to GPT-3.5 in code editing performance.
|
||||
|
|
|
@ -19,12 +19,12 @@ pip install aider-chat
|
|||
export ANTHROPIC_API_KEY=<key> # Mac/Linux
|
||||
setx ANTHROPIC_API_KEY <key> # Windows
|
||||
|
||||
# Aider uses Claude 3.5 Sonnet by default (or use --sonnet)
|
||||
aider
|
||||
|
||||
# Claude 3 Opus
|
||||
aider --opus
|
||||
|
||||
# Claude 3.5 Sonnet
|
||||
aider --sonnet
|
||||
|
||||
# List models available from Anthropic
|
||||
aider --models anthropic/
|
||||
```
|
||||
|
|
|
@ -7,7 +7,6 @@ nav_order: 500
|
|||
|
||||
Aider can connect to the DeepSeek.com API.
|
||||
The DeepSeek Coder V2 model gets the top score on aider's code editing benchmark.
|
||||
DeepSeek appears to grant 5M tokens of free API usage to new accounts.
|
||||
|
||||
```
|
||||
pip install aider-chat
|
||||
|
|
|
@ -19,7 +19,7 @@ pip install aider-chat
|
|||
export OPENAI_API_KEY=<key> # Mac/Linux
|
||||
setx OPENAI_API_KEY <key> # Windows
|
||||
|
||||
# GPT-4o is the best model, used by default
|
||||
# Aider uses gpt-4o by default (or use --4o)
|
||||
aider
|
||||
|
||||
# GPT-4 Turbo (1106)
|
||||
|
|
|
@ -8,70 +8,3 @@ nav_order: 900
|
|||
{% include model-warnings.md %}
|
||||
|
||||
|
||||
## Adding settings for missing models
|
||||
You can register model settings used by aider for unknown models.
|
||||
Create a `.aider.models.yml` file in one of these locations:
|
||||
|
||||
- Your home directory.
|
||||
- The root if your git repo.
|
||||
- The current directory where you launch aider.
|
||||
- Or specify a specific file with the `--model-settings-file <filename>` switch.
|
||||
|
||||
If the files above exist, they will be loaded in that order.
|
||||
Files loaded last will take priority.
|
||||
|
||||
The yaml file should be a a list of dictionary objects for each model, as follows:
|
||||
|
||||
```
|
||||
- name: "gpt-3.5-turbo"
|
||||
edit_format: "whole"
|
||||
weak_model_name: "gpt-3.5-turbo"
|
||||
use_repo_map: false
|
||||
send_undo_reply: false
|
||||
accepts_images: false
|
||||
lazy: false
|
||||
reminder_as_sys_msg: true
|
||||
examples_as_sys_msg: false
|
||||
- name: "gpt-4-turbo-2024-04-09"
|
||||
edit_format: "udiff"
|
||||
weak_model_name: "gpt-3.5-turbo"
|
||||
use_repo_map: true
|
||||
send_undo_reply: true
|
||||
accepts_images: true
|
||||
lazy: true
|
||||
reminder_as_sys_msg: true
|
||||
examples_as_sys_msg: false
|
||||
```
|
||||
|
||||
## Specifying context window size and token costs
|
||||
|
||||
You can register context window limits and costs for models that aren't known
|
||||
to aider. Create a `.aider.litellm.models.json` file in one of these locations:
|
||||
|
||||
- Your home directory.
|
||||
- The root if your git repo.
|
||||
- The current directory where you launch aider.
|
||||
- Or specify a specific file with the `--model-metadata-file <filename>` switch.
|
||||
|
||||
|
||||
If the files above exist, they will be loaded in that order.
|
||||
Files loaded last will take priority.
|
||||
|
||||
The json file should be a dictionary with an entry for each model, as follows:
|
||||
|
||||
```
|
||||
{
|
||||
"deepseek-chat": {
|
||||
"max_tokens": 4096,
|
||||
"max_input_tokens": 32000,
|
||||
"max_output_tokens": 4096,
|
||||
"input_cost_per_token": 0.00000014,
|
||||
"output_cost_per_token": 0.00000028,
|
||||
"litellm_provider": "deepseek",
|
||||
"mode": "chat"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
See
|
||||
[litellm's model_prices_and_context_window.json file](https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json) for more examples.
|
||||
|
|
|
@ -86,8 +86,13 @@ files which have dependencies.
|
|||
Aider optimizes the repo map by
|
||||
selecting the most important parts of the codebase
|
||||
which will
|
||||
fit into the token budget assigned by the user
|
||||
(via the `--map-tokens` switch, which defaults to 1k tokens).
|
||||
fit into the active token budget.
|
||||
|
||||
The token budget is
|
||||
influenced by the `--map-tokens` switch, which defaults to 1k tokens.
|
||||
Aider adjusts the size of the repo map dynamically based on the state of the chat. It will usually stay within that setting's value. But it does expand the repo map
|
||||
significantly at times, especially when no files have been added to the chat and aider needs to understand the entire repo as best as possible.
|
||||
|
||||
|
||||
The sample map shown above doesn't contain *every* class, method and function from those
|
||||
files.
|
||||
|
|
|
@ -80,7 +80,7 @@ See the
|
|||
[Coder.create() and Coder.__init__() methods](https://github.com/paul-gauthier/aider/blob/main/aider/coders/base_coder.py)
|
||||
for all the supported arguments.
|
||||
|
||||
It can also be helpful to set the equivalend of `--yes` by doing this:
|
||||
It can also be helpful to set the equivalent of `--yes` by doing this:
|
||||
|
||||
```
|
||||
from aider.io import InputOutput
|
||||
|
|
|
@ -21,8 +21,8 @@ In these cases, here are some things you might try.
|
|||
|
||||
## Use a capable model
|
||||
|
||||
If possible try using GPT-4o or Opus, as they are the strongest and most
|
||||
capable models.
|
||||
If possible try using GPT-4o, Claude 3.5 Sonnet or Claude 3 Opus,
|
||||
as they are the strongest and most capable models.
|
||||
|
||||
Weaker models
|
||||
are more prone to
|
||||
|
|
|
@ -9,6 +9,7 @@ description: Intro and tutorial videos made by aider users.
|
|||
Here are a few tutorial videos made by aider users:
|
||||
|
||||
- [Aider tips and Example use](https://www.youtube.com/watch?v=OsChkvGGDgw) -- techfren
|
||||
- [Generate application with just one prompt using Aider](https://www.youtube.com/watch?v=Y-_0VkMUiPc&t=78s) -- AICodeKing
|
||||
- [Aider : the production ready AI coding assistant you've been waiting for](https://www.youtube.com/watch?v=zddJofosJuM) -- Learn Code With JV
|
||||
- [Holy Grail: FREE Coding Assistant That Can Build From EXISTING CODE BASE](https://www.youtube.com/watch?v=df8afeb1FY8) -- Matthew Berman
|
||||
- [Aider: This AI Coder Can Create AND Update Git Codebases](https://www.youtube.com/watch?v=EqLyFT78Sig) -- Ian Wootten
|
||||
|
|
|
@ -5,7 +5,8 @@ highlight_image: /assets/benchmarks-udiff.jpg
|
|||
nav_exclude: true
|
||||
---
|
||||
{% if page.date %}
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}</p>
|
||||
<p class="post-date">{{ page.date | date: "%B %d, %Y" }}, by Paul Gauthier
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
# Unified diffs make GPT-4 Turbo 3X less lazy
|
||||
|
|
|
@ -37,26 +37,31 @@ Use /help to see in-chat commands, run with --help to see cmd line args
|
|||
|
||||
## Adding files
|
||||
|
||||
Just add the files that the aider will need to *edit*.
|
||||
Add the files that the aider will need to *edit*.
|
||||
|
||||
Don't add a bunch of extra files.
|
||||
If you add too many files, the LLM can get overwhelmed
|
||||
and confused (and it costs more tokens).
|
||||
Aider will automatically
|
||||
pull in content from related files so that it can
|
||||
[understand the rest of your code base](https://aider.chat/docs/repomap.html).
|
||||
|
||||
You can also run aider without naming any files and use the in-chat
|
||||
You add files to the chat by naming them on the aider command line.
|
||||
Or, you can use the in-chat
|
||||
`/add` command to add files.
|
||||
|
||||
Or you can skip adding files completely, and aider
|
||||
will try to figure out which files need to be edited based
|
||||
You can use aider without adding any files,
|
||||
and it will try to figure out which files need to be edited based
|
||||
on your requests.
|
||||
But you'll get the best results if you add the files that need
|
||||
to edited.
|
||||
|
||||
## LLMs
|
||||
|
||||
Aider uses GPT-4o by default, but you can
|
||||
[connect to many different LLMs](/docs/llms.html).
|
||||
Claude 3 Opus is another model which works very well with aider,
|
||||
which you can use by running `aider --opus`.
|
||||
Claude 3.5 Sonnet also works very well with aider,
|
||||
which you can use by running `aider --sonnet`.
|
||||
|
||||
You can run `aider --model XXX` to launch aider with
|
||||
a specific model.
|
||||
|
@ -68,8 +73,8 @@ Or, during your chat you can switch models with the in-chat
|
|||
Ask aider to make changes to your code.
|
||||
It will show you some diffs of the changes it is making to
|
||||
complete you request.
|
||||
Aider will git commit all of its changes,
|
||||
[Aider will git commit all of its changes](/docs/git.html),
|
||||
so they are easy to track and undo.
|
||||
|
||||
You can always use the `/undo` command to undo changes you don't
|
||||
You can always use the `/undo` command to undo AI changes that you don't
|
||||
like.
|
||||
|
|
|
@ -45,6 +45,7 @@ and works best with GPT-4o, Claude 3.5 Sonnet, Claude 3 Opus and DeepSeek Coder
|
|||
# Because this page is rendered by GitHub as the repo README
|
||||
cog.out(open("website/_includes/get-started.md").read())
|
||||
-->
|
||||
|
||||
You can get started quickly like this:
|
||||
|
||||
```
|
||||
|
@ -53,18 +54,13 @@ $ 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
|
||||
|
||||
# Or, work with Anthropic's models
|
||||
$ export ANTHROPIC_API_KEY=your-key-goes-here
|
||||
|
||||
# Claude 3 Opus
|
||||
$ aider --opus
|
||||
|
||||
# Claude 3.5 Sonnet
|
||||
$ aider --sonnet
|
||||
```
|
||||
<!-- NOOP -->
|
||||
|
||||
|
@ -93,8 +89,8 @@ and can [connect to almost any LLM](https://aider.chat/docs/llms.html).
|
|||
- Edit files in your editor while chatting with aider,
|
||||
and it will always use the latest version.
|
||||
Pair program with AI.
|
||||
- Add images to the chat (GPT-4o, GPT-4 Turbo, etc).
|
||||
- Add URLs to the chat and aider will read their content.
|
||||
- [Add images to the chat](https://aider.chat/docs/images-urls.html) (GPT-4o, Claude 3.5 Sonnet, etc).
|
||||
- [Add URLs to the chat](https://aider.chat/docs/images-urls.html) and aider will read their content.
|
||||
- [Code with your voice](https://aider.chat/docs/voice.html).
|
||||
|
||||
|
||||
|
@ -139,5 +135,6 @@ projects like django, scikitlearn, matplotlib, etc.
|
|||
- *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)
|
||||
- *After wasting $100 on tokens trying to find something better, I'm back to Aider. It blows everything else out of the water hands down, there's no competition whatsoever.* -- [SystemSculpt](https://discord.com/channels/1131200896827654144/1131200896827654149/1178736602797846548)
|
||||
- *Hands down, this is the best AI coding assistant tool so far.* -- [IndyDevDan](https://www.youtube.com/watch?v=MPYFPvxfGZs)
|
||||
- *[Aider] changed my daily coding workflows. It's mind-blowing how a single Python application can change your life.* -- [maledorak](https://discord.com/channels/1131200896827654144/1131200896827654149/1258453375620747264)
|
||||
- *Best agent for actual dev work in existing codebases.* -- [Nick Dobos](https://twitter.com/NickADobos/status/1690408967963652097?s=20)
|
||||
<!--[[[end]]]-->
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue