Simon Willison · 2026-08-22 · notable
LLM 0.33 — Simon Willison's CLI moves to the OpenAI Python 3.x library
Simon Willison releases LLM 0.33, an update to his Python CLI for language models. The release moves onto the OpenAI Python library 3.x and httpx2, lets embedding commands take a per-call API key, and allows templates to be combined.
LLM 0.33 rebases Simon Willison's model CLI on the OpenAI Python 3.x library and adds per-call embedding keys.
Key specs
| License | Apache-2.0 |
|---|---|
| GitHub stars | 12,389 |
What is it?
LLM 0.33 moves Simon Willison's command-line tool for language models onto the OpenAI Python library 3.x and swaps its HTTP client from httpx to httpx2. The release also lets `llm embed` and `llm embed-multi` accept a `--key` flag, shows the output of server-side tool calls inside `llm logs`, and lets `-t/--template` be repeated so one template supplies the model settings while another supplies the prompt.
How does it work?
The per-call key travels through a new `key=` argument on `EmbeddingModel.embed()`, `embed_multi()` and the matching `Collection` methods, so a plugin receives the resolved key without the shared model state changing; plugins that still read `self.key` keep working through a compatibility fallback. Server-side tool output is stored with a `server_executed` marker, which is how `llm logs --json` and `llm logs --short` tell it apart from tools that ran on the local machine.
Why does it matter?
Plugin authors feel this release first: the jump to OpenAI 3.x and httpx2 raises the dependency floor for every plugin in the LLM ecosystem, and the `--key` argument removes a long-standing reason to mutate shared model state just to embed with a second account. For everyday users, repeated `-t` flags mean a saved model configuration and a saved prompt no longer have to live in the same template file.
Who is it for?
Python developers and LLM plugin authors
Try it
pip install -U llm