mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-28 16:25:00 +00:00
aider is AI pair programming in your terminal
https://aider.chat/
![]() **tl;dr** Introduce a common umbrella constraints file (that works across requirement extras) to avoid package version conflicts and to reduce the need for manual pinning in `*.in` files. Previously, spurious package version conflicts could sometimes occur across requirements for `pip install -e .`, `pip install -e .[help]`, `pip install -e .[playwright]`, and so on. Here’s why: - There are five different requirement configs: the set of base requirements (`requirements.txt`) and four additional requirement sets\ (aka "extras"): `dev`, `help`, `browser`, and `playwright`. - Each of those five configurations spans its own tree of dependencies [1]. Those five trees can slightly overlap. (For example, `greenlet` is a transitive requirement for both the `help` and `playwright` trees, respectively.) - If you want to resolve those dependency trees so you get concrete version numbers, you can’t just look at each tree independently. This is because when trees overlap, they sometimes pull in the same package for different reasons, respectively, and maybe with different version constraints. For example, the `help` tree pulls in `greenlet`, because `sqlalchemy` requires it. At the same time, the `playwright` tree also pulls in `greenlet` because it’s needed by the `playwright` package. Resolving those constraints strictly individually (i.e., per tree) is usually a mistake. It may work for a while, but occasionally you’re going to end up with two conflicting versions of the same package. To prevent those version conflicts from occurring, the five `pip-compile` invocations were designed as a chain. The process starts at the smallest tree (i.e., the base `requirements.in` file). It calculates the version numbers for the tree, remembers the result, and feeds it into the calculation of the next tree. The chain design somewhat helped mitigate conflicts, but not always. The reason for that is that the chain works like a greedy algorithm: once a decision has been made for a given package in a tree, that decision is immediately final, and the compilation process isn’t allowed to go back and change that decision if it learns new information. New information comes in all the time, because larger trees usually have more complex constraints than smaller trees, and the process visits larger trees later, facing additional constraints as it hops from tree to tree. Sometimes it bumps into a new constraint against a package for which it has already made a decision earlier (i.e., it has pinned the concrete version number in the `requirements*.txt` file of an earlier tree). That’s why the greedy chain-based method, even though it mostly works just fine, can never avoid spurious conflicts entirely. To help mitigate those conflicts, pinning entries were manually added to `requirements.in` files on a case-by-case basis as conflicts occurred. Those entries can make the file difficult to reason about, and they must be kept in sync manually as packages get upgraded. That’s a maintenance burden. Turning the chain into an umbrella may help. Instead of hopping from tree to tree, look at the entire forest at once, calculate all the concrete version numbers for all trees in one fell swoop, and save the results in a common, all-encompassing umbrella file. Armed with the umbrella file (called `common-constraints.txt`), visit each tree (in any order – it no longer matters) and feed it just the umbrella file as a constraint, along with its own `*.in` file as the input. Chaining is no longer necessary, because the umbrella file already contains all version constraints for all the packages one tree could possibly need, and then some. This technique should reduce manual pinning inside `*.in` files, and makes sure that computed version numbers no longer contradict each other across trees. [1]: From a graph theory point of view, I’m being blatantly incorrect here; those dependency graphs are usually not trees, because they have cycles. I’m still going to call them "trees" for the sake of this discussion, because the word "tree" feels less abstract and intimidating and hopefully more relatable. |
||
---|---|---|
.github | ||
aider | ||
benchmark | ||
docker | ||
requirements | ||
scripts | ||
tests | ||
.dockerignore | ||
.flake8 | ||
.gitignore | ||
.pre-commit-config.yaml | ||
CNAME | ||
CONTRIBUTING.md | ||
HISTORY.md | ||
LICENSE.txt | ||
MANIFEST.in | ||
pyproject.toml | ||
pytest.ini | ||
README.md | ||
requirements.txt |
Aider is AI pair programming in your terminal
Aider lets you pair program with LLMs, to edit code in your local git repository. Start a new project or work with an existing code base. Aider works best with Claude 3.5 Sonnet, DeepSeek R1 & Chat V3, OpenAI o1, o3-mini & GPT-4o. Aider can connect to almost any LLM, including local models.
Getting started
If you already have python 3.8-3.13 installed, you can get started quickly like this:
python -m pip install aider-install
aider-install
# Change directory into your code base
cd /to/your/project
# Work with DeepSeek via DeepSeek's API
aider --model deepseek --api-key deepseek=your-key-goes-here
# Work with Claude 3.5 Sonnet via Anthropic's API
aider --model sonnet --api-key anthropic=your-key-goes-here
# Work with GPT-4o via OpenAI's API
aider --model gpt-4o --api-key openai=your-key-goes-here
# Work with Sonnet via OpenRouter's API
aider --model openrouter/anthropic/claude-3.5-sonnet --api-key openrouter=your-key-goes-here
# Work with DeepSeek via OpenRouter's API
aider --model openrouter/deepseek/deepseek-chat --api-key openrouter=your-key-goes-here
See the installation instructions and usage documentation for more details.
Features
- Run aider with the files you want to edit:
aider <file1> <file2> ...
- Ask for changes:
- Add new features or test cases.
- Describe a bug.
- Paste in an error message or GitHub issue URL.
- Refactor code.
- Update docs.
- Aider will edit your files to complete your request.
- Aider automatically git commits changes with a sensible commit message.
- Use aider inside your favorite editor or IDE.
- Aider works with most popular languages: python, javascript, typescript, php, html, css, and more...
- Aider can edit multiple files at once for complex requests.
- Aider uses a map of your entire git repo, which helps it work well in larger codebases.
- Edit files in your editor or IDE while chatting with aider, and it will always use the latest version. Pair program with AI.
- Add images to the chat (GPT-4o, Claude 3.5 Sonnet, etc).
- Add URLs to the chat and aider will read their content.
- Code with your voice.
- Aider works best with Claude 3.5 Sonnet, DeepSeek V3, o1 & GPT-4o and can connect to almost any LLM.
Top tier performance
Aider has one of the top scores on SWE Bench. SWE Bench is a challenging software engineering benchmark where aider solved real GitHub issues from popular open source projects like django, scikitlearn, matplotlib, etc.
More info
- Documentation
- Installation
- Usage
- Tutorial videos
- Connecting to LLMs
- Configuration
- Troubleshooting
- LLM Leaderboards
- GitHub
- Discord
- Blog
Kind words from users
- The best free open source AI coding assistant. -- IndyDevDan
- The best AI coding assistant so far. -- Matthew Berman
- Aider ... has easily quadrupled my coding productivity. -- SOLAR_FIELDS
- It's a cool workflow... Aider's ergonomics are perfect for me. -- qup
- It's really like having your senior developer live right in your Git repo - truly amazing! -- rappster
- What an amazing tool. It's incredible. -- valyagolev
- Aider is such an astounding thing! -- cgrothaus
- It was WAY faster than I would be getting off the ground and making the first few working versions. -- Daniel Feldman
- THANK YOU for Aider! It really feels like a glimpse into the future of coding. -- derwiki
- It's just amazing. It is freeing me to do things I felt were out my comfort zone before. -- Dougie
- This project is stellar. -- funkytaco
- Amazing project, definitely the best AI coding assistant I've used. -- joshuavial
- I absolutely love using Aider ... It makes software development feel so much lighter as an experience. -- principalideal0
- I have been recovering from multiple shoulder surgeries ... and have used aider extensively. It has allowed me to continue productivity. -- codeninja
- I am an aider addict. I'm getting so much more work done, but in less time. -- dandandan
- 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
- Aider is amazing, coupled with Sonnet 3.5 it’s quite mind blowing. -- Josh Dingus
- Hands down, this is the best AI coding assistant tool so far. -- IndyDevDan
- [Aider] changed my daily coding workflows. It's mind-blowing how a single Python application can change your life. -- maledorak
- Best agent for actual dev work in existing codebases. -- Nick Dobos