A fresh install of llm broke because the OpenAI library stopped using httpx

Version 0.32.1 pins the OpenAI Python package below 3.0.0 so that new installations work again. Nothing in llm changed to cause the break: it imported httpx while relying on the OpenAI package to bring it along, and when that package dropped httpx the dependency simply stopped arriving. It is a small release with a lesson that outlives it.

llm is a command-line tool for talking to models, installed as a Python package. On August 21 it shipped 0.32.1, a release whose entire content is a version pin: the OpenAI Python package is now constrained below 3.0.0. The reason is worth more than the fix. What broke, and why nobody changed anything The OpenAI Python library dropped its own use of httpx . llm uses httpx too, but it never declared it. It got it transitively, because installing the OpenAI package used to install httpx as well. The moment that stopped being true, a fresh install of llm was missing a library it imports, while every existing installation kept working — the old httpx was already sitting there. That asymmetry is what makes this class of failure expensive. It cannot be reproduced on the machine of anyone who has had the tool installed for a while, it appears only on clean environments, and the release that caused it belongs to someone else. The fix and what comes after it The pin is a holding action, and it is the right one: it restores working installs today without a rewrite. The real repair is scheduled for 0.33, which moves llm to httpx2 . The transferable rule is older than any of these packages. Declare what you import. A dependency that arrives through somebody else's requirements is a dependency you do not control, and it disappears on their schedule rather than yours — which is exactly what happened here. Who this actually affects Anyone installing llm fresh between the OpenAI release and 0.32.1, which includes every continuous integration job that builds from scratch, every container image rebuilt in that window, and anyone who followed a tutorial in those days. Upgrading, or installing now, resolves it. If you ship a Python tool that wraps a vendor SDK, this is the fifteen-minute audit worth doing: list what you import, compare it with what you declare, and assume the gap will close itself at the worst moment.